> ## Documentation Index
> Fetch the complete documentation index at: https://www.logo.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Logo.dev serves logos and brand data for companies that already exist. It does not design logos. If someone wants a logo designed, say so and stop.
> When a message is only a brand name, domain, ticker, ISIN, or crypto symbol, reply with https://www.logo.dev/search?q=<url-encoded term> and the matching img.logo.dev call. Never assert whether a specific brand is in the index.
> Image URLs come from img.logo.dev with a publishable key in the token query parameter: https://img.logo.dev/:domain?token=LOGO_DEV_PUBLISHABLE_KEY, also /name/:brand, /ticker/:symbol, /crypto/:symbol, /isin/:isin. JSON comes from api.logo.dev/v2 with a secret key (sk_) in an Authorization: Bearer header, server-side only.
> Product names: the Logo CDN serves images from img.logo.dev. The Logo API is the Brand API and the Search API, which return JSON from api.logo.dev/v2. The Transaction Enrichment API (beta) is a separate service at https://www.logo.dev/api/transaction with its own beta key. Credits is the Logo API billing unit. Never recommend the deprecated v1 routes (/search, /brand, /describe, /logo/*) or the Describe API. Use /v2/brands and /v2/search.
> Report a wrong, missing, or outdated logo at https://www.logo.dev/update. Email support@logo.dev for anything broken and sales@logo.dev for volume pricing and contract terms.
> MCP setup is at https://www.logo.dev/docs/mcp/introduction and webhooks at https://www.logo.dev/docs/webhooks.

# Get a brand by id

> Fetch a brand's profile by its stable brand id.

<Card title="Get your API keys" icon="key" href="https://www.logo.dev/dashboard/api-keys" horizontal arrow>
  Your dashboard has a publishable key for the Logo CDN and a secret key for the Logo API. Every plan includes both.
</Card>


## OpenAPI

````yaml /openapi.json get /v2/brands/{id}
openapi: 3.1.0
info:
  title: Logo.dev API
  description: >-
    Logo.dev serves brand assets from two hosts, each with its own key:


    - **Logo CDN** (`img.logo.dev`) returns a logo image. Authenticate with a
    **publishable key** in the `token` query parameter. It is safe in
    client-side code.

    - **Logo API** (`api.logo.dev`) returns JSON. Authenticate with a **secret
    key** in the `Authorization: Bearer` header. Call it only from your server.


    Get your keys from the [dashboard](https://www.logo.dev/dashboard/api-keys).
  version: 2.0.0
  contact:
    name: Logo.dev Support
    email: support@logo.dev
    url: https://docs.logo.dev
servers:
  - url: https://api.logo.dev
    description: REST APIs (Brand Search, Brand Data)
security: []
tags:
  - name: Logo CDN
    description: >-
      Logo images served from img.logo.dev. Authenticate with a publishable key
      in the `token` query parameter. Metered in monthly impressions.
  - name: Brands
    description: >-
      Brand profiles, logos, and brandmarks as JSON from api.logo.dev. Metered
      in API credits.
  - name: Logos
    description: >-
      A brand's logo or brandmark as JSON, with a temporary download URL,
      dimensions, and a blurhash.
  - name: Search
    description: Find brands by name.
  - name: Subscriptions
    description: Choose which brands send you webhook events.
  - name: Webhook endpoints
    description: Manage the URLs that receive webhook events.
  - name: Transaction Enrichment API
    description: Turn a card transaction descriptor into a merchant identity. Private beta.
paths:
  /v2/brands/{id}:
    get:
      tags:
        - Brands
      summary: Get a brand by id
      description: >-
        Returns a brand's profile by its id, the `data.id` from an earlier
        response. The response is the same as looking the brand up by domain,
        and it is billed the same way.
      operationId: v2GetBrandById
      parameters:
        - $ref: '#/components/parameters/V2BrandIdPath'
        - $ref: '#/components/parameters/V2NoSubscribe'
      responses:
        '200':
          description: The brand is ready.
          headers:
            Request-Id:
              $ref: '#/components/headers/V2RequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/V2RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/V2RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/V2RateLimitReset'
            Credits-Charged:
              $ref: '#/components/headers/V2CreditsCharged'
            Credits-Remaining:
              $ref: '#/components/headers/V2CreditsRemaining'
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/V2Brand'
                  metadata:
                    $ref: '#/components/schemas/V2Metadata'
                required:
                  - data
                  - metadata
              example:
                data:
                  object: brand
                  id: brand_4x0wr3g0000g00400000000004
                  slug: stripe
                  domain: stripe.com
                  status: ready
                  name: Stripe
                  description: Payments infrastructure for the internet.
                  indexed_at: '2026-09-01T12:00:00Z'
                  is_profane: false
                  socials:
                    twitter: https://x.com/stripe
                    linkedin: https://www.linkedin.com/company/stripe
                  colors:
                    - r: 99
                      g: 91
                      b: 255
                      hex: '#635bff'
                      oklch:
                        l: 0.5854
                        c: 0.2416
                        h: 277.12
                  logo:
                    url: https://img.logo.dev/assets/SEALED_TOKEN
                    etag: 9f2c1e7a4b8d3f60
                    blurhash: LKO2?U%2Tw=w]~RBVZRi};RPxuwH
                    source:
                      width: 512
                      height: 512
                      format: svg
                      has_transparency: true
                      is_vector: true
                    last_updated_at: '2026-08-01T09:00:00Z'
                    expires_at: '2026-09-28T13:00:00Z'
                  brandmark: null
                  social_banners: []
                metadata:
                  request_id: request_01k6z8m2a4b5c6d7e8f9g0h1j2
                  resolution:
                    type: domain
                    value: stripe.com
                    method: direct
                    context: {}
                  subscription:
                    status: subscribed
        '202':
          description: >-
            Logo.dev is still indexing this brand. Retry after `Retry-After`
            seconds; retries are not billed.
          headers:
            Retry-After:
              $ref: '#/components/headers/V2RetryAfter'
            Request-Id:
              $ref: '#/components/headers/V2RequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/V2RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/V2RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/V2RateLimitReset'
            Credits-Charged:
              $ref: '#/components/headers/V2CreditsCharged'
            Credits-Remaining:
              $ref: '#/components/headers/V2CreditsRemaining'
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/V2Unsettled'
                  metadata:
                    $ref: '#/components/schemas/V2Metadata'
                required:
                  - data
                  - metadata
              example:
                data:
                  object: brand
                  status: not_indexed
                metadata:
                  request_id: request_01k6z8m2a4b5c6d7e8f9g0h1j2
                  resolution:
                    type: domain
                    value: stripe.com
                    method: direct
                    context: {}
                  pending:
                    reason: indexing
                    message: >-
                      This brand is being indexed for the first time and is
                      usually ready within a minute. Retry the same request
                      after 30 seconds; retries are not billed.
                    retry_after_seconds: 30
                    expires_in_seconds: 300
                    webhook: false
                    doc_url: >-
                      https://www.logo.dev/docs/platform/errors#not-found-vs-still-indexing-202
        '400':
          description: The brand id is malformed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V2Error'
              example:
                error:
                  code: invalid_request
                  message: 'id must start with "brand_": bad format'
                  target: id
                docs_url: https://www.logo.dev/docs/platform/errors
        '401':
          $ref: '#/components/responses/V2Unauthorized'
        '402':
          $ref: '#/components/responses/V2PaymentRequired'
        '403':
          $ref: '#/components/responses/V2Forbidden'
        '404':
          description: No brand matches this identifier.
          headers:
            Request-Id:
              $ref: '#/components/headers/V2RequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/V2RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/V2RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/V2RateLimitReset'
            Credits-Charged:
              $ref: '#/components/headers/V2CreditsCharged'
            Credits-Remaining:
              $ref: '#/components/headers/V2CreditsRemaining'
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/V2Unsettled'
                  metadata:
                    $ref: '#/components/schemas/V2Metadata'
                  docs_url:
                    type: string
                    format: uri
                    description: Documentation for this status.
                required:
                  - data
                  - metadata
              example:
                data:
                  object: brand
                  status: not_found
                metadata:
                  request_id: request_01k6z8m2a4b5c6d7e8f9g0h1j2
                  resolution:
                    type: domain
                    value: stripe.com
                    method: direct
                    context: {}
                docs_url: https://www.logo.dev/docs/platform/errors
        '429':
          $ref: '#/components/responses/V2RateLimited'
        '500':
          $ref: '#/components/responses/V2ServerError'
      security:
        - secretKey: []
components:
  parameters:
    V2BrandIdPath:
      name: id
      in: path
      required: true
      description: A brand id, as returned in `data.id`.
      schema:
        type: string
        examples:
          - brand_4x0wr3g0000g00400000000004
    V2NoSubscribe:
      name: nosubscribe
      in: query
      required: false
      description: >-
        Send `true` to skip the automatic subscription to this brand. Only
        matters when webhooks are enabled on your account.
      schema:
        type: string
        enum:
          - 'true'
  headers:
    V2RequestId:
      description: Unique id for this request. Include it when you contact support.
      schema:
        type: string
    V2RateLimitLimit:
      description: Brand requests allowed per minute for your account.
      schema:
        type: integer
    V2RateLimitRemaining:
      description: Brand requests left in the current minute.
      schema:
        type: integer
    V2RateLimitReset:
      description: Seconds until the current window resets.
      schema:
        type: integer
    V2CreditsCharged:
      description: '`1` when this request was billed, `0` when it was not.'
      schema:
        type: integer
        enum:
          - 0
          - 1
    V2CreditsRemaining:
      description: Your remaining credit balance. Omitted when no balance is available.
      schema:
        type: string
        examples:
          - '18966.99'
    V2RetryAfter:
      description: Seconds to wait before retrying. Always `30`.
      schema:
        type: integer
        examples:
          - 30
  schemas:
    V2Brand:
      type: object
      properties:
        object:
          type: string
          const: brand
        id:
          type: string
          description: >-
            The brand's id. Stable across domain changes; use it to key your
            records.
          examples:
            - brand_4x0wr3g0000g00400000000004
        slug:
          type: string
          description: >-
            Readable label for display. It can change and is not accepted for
            lookups; use `id`.
        domain:
          type:
            - string
            - 'null'
          description: >-
            The brand's own domain, which can differ from the one you sent.
            `null` for brands with no website, such as some crypto tokens.
        status:
          type: string
          const: ready
        name:
          type: string
        description:
          type:
            - string
            - 'null'
        indexed_at:
          type: string
          format: date-time
          description: When the record was last refreshed.
        is_profane:
          type: boolean
          description: '`true` when the brand may carry NSFW imagery.'
        socials:
          type: object
          description: Profile URLs keyed by network. Networks with no profile are omitted.
          propertyNames:
            enum:
              - facebook
              - github
              - instagram
              - linkedin
              - pinterest
              - reddit
              - snapchat
              - telegram
              - tumblr
              - twitter
              - wechat
              - whatsapp
              - wikipedia
              - youtube
          additionalProperties:
            type: string
            format: uri
        colors:
          type: array
          items:
            $ref: '#/components/schemas/V2Color'
          description: Brand colors, most dominant first.
        logo:
          oneOf:
            - $ref: '#/components/schemas/V2Image'
            - type: 'null'
          description: The primary logo. `null` when the brand has none.
        brandmark:
          oneOf:
            - $ref: '#/components/schemas/V2Image'
            - type: 'null'
          description: >-
            The wide logo lockup: the symbol and wordmark together for most
            brands, or the wordmark alone for pure-type brands. `null` when the
            brand has none. See [brandmark](/concepts#brandmark).
        social_banners:
          type: array
          items:
            $ref: '#/components/schemas/V2Image'
          description: Banner images. Empty when there are none.
      required:
        - object
        - id
        - slug
        - domain
        - status
        - name
        - description
        - indexed_at
        - is_profane
        - socials
        - colors
        - logo
        - brandmark
        - social_banners
    V2Metadata:
      type: object
      properties:
        request_id:
          type: string
          description: Unique id for this request. Also sent as the `Request-Id` header.
          examples:
            - request_01k6z8m2a4b5c6d7e8f9g0h1j2
        resolution:
          allOf:
            - $ref: '#/components/schemas/V2Resolution'
          description: Brand and image lookups only.
        pending:
          allOf:
            - $ref: '#/components/schemas/V2Pending'
          description: '`202` responses only.'
        subscription:
          type: object
          description: >-
            Present when a brand lookup (`GET /v2/brands` or `GET
            /v2/brands/{id}`) ran the automatic subscribe: webhooks are on for
            the account, and `nosubscribe` is not `true`. See [automatic
            subscriptions](/brand/introduction#automatic-subscriptions).
          properties:
            status:
              type: string
              enum:
                - subscribed
                - quota_exceeded
              description: >-
                `subscribed`: the account is subscribed to the brand.
                `quota_exceeded`: the account is at its plan's subscription
                limit, so the brand was not subscribed. The lookup is answered
                and billed either way.
            message:
              type: string
              description: Why the subscribe was refused. Only with `quota_exceeded`.
          required:
            - status
      required:
        - request_id
    V2Unsettled:
      type: object
      description: 'Body of a `202` or `404` lookup: only the object type and status.'
      properties:
        object:
          type: string
          enum:
            - brand
            - image
        status:
          type: string
          enum:
            - not_indexed
            - not_found
      required:
        - object
        - status
    V2Error:
      type: object
      description: Error envelope for v2 routes.
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - invalid_request
                - unauthorized
                - forbidden
                - resource_missing
                - insufficient_credits
                - rate_limited
                - limit_exceeded
                - internal
            message:
              type: string
            target:
              type: string
              description: The parameter at fault, when there is exactly one.
          required:
            - code
            - message
        docs_url:
          type: string
          format: uri
          description: Documentation for this class of error.
      required:
        - error
    V2Color:
      type: object
      properties:
        r:
          type: integer
          minimum: 0
          maximum: 255
        g:
          type: integer
          minimum: 0
          maximum: 255
        b:
          type: integer
          minimum: 0
          maximum: 255
        hex:
          type: string
          examples:
            - '#635bff'
        oklch:
          type: object
          properties:
            l:
              type: number
              description: Lightness, 0 to 1.
            c:
              type: number
              description: Chroma. Usually below 0.4.
            h:
              type: number
              description: Hue in degrees, 0 to 360. `0` when chroma is 0.
          required:
            - l
            - c
            - h
      required:
        - r
        - g
        - b
        - hex
        - oklch
    V2Image:
      type: object
      properties:
        url:
          type: string
          format: uri
          description: >-
            Temporary signed download URL. It stops working at `expires_at`:
            download and host the image yourself. Add `size`, `format` (`png`,
            `jpg`, `webp`), or `theme` (`light`, `dark`) to format the download.
            Downloads do not count toward CDN image usage.
        etag:
          type: string
          description: >-
            Identifies this version of the source image, and is the same on
            every route. Save it and download again only when it changes.
        blurhash:
          type: string
          description: Compact blurred placeholder for the image.
        source:
          $ref: '#/components/schemas/V2ImageSource'
        last_updated_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            When the image last changed. `null` if it has not changed since the
            brand was indexed.
        expires_at:
          type: string
          format: date-time
          description: When `url` stops working, about 24 hours after the request.
      required:
        - url
        - etag
        - blurhash
        - source
        - last_updated_at
        - expires_at
    V2Resolution:
      type: object
      description: How the request identified the brand.
      properties:
        type:
          type: string
          enum:
            - domain
            - ticker
            - isin
            - crypto
            - name
            - brand_id
          description: Which identifier the request used.
        value:
          type: string
          description: >-
            The identifier after normalization: the registrable domain, an
            upper-cased ticker, and so on.
        method:
          type: string
          enum:
            - direct
            - domain
            - security
            - crypto
            - search
            - ''
          description: >-
            How the identifier reached the brand. `direct` is a brand id or a
            domain that is its own brand; `domain` went through an alias or
            redirect; `security` is a ticker or ISIN; `crypto` is a crypto token
            symbol; `search` is a name lookup. Empty on a cached miss.
        context:
          type: object
          description: >-
            Reserved for brands involved in a merchant lookup. Always `{}`
            today.
      required:
        - type
        - value
        - method
        - context
    V2Pending:
      type: object
      description: Present only on a `202`. Tells you when to retry.
      properties:
        reason:
          type: string
          enum:
            - indexing
            - resolving
          description: >-
            `indexing` is a brand's first crawl; `resolving` means the
            identifier is still being matched to a brand.
        message:
          type: string
        retry_after_seconds:
          type: integer
          description: Wait this long before retrying. Matches the `Retry-After` header.
          examples:
            - 30
        expires_in_seconds:
          type: integer
          description: Stop polling after this long.
          examples:
            - 300
        webhook:
          type: boolean
          description: >-
            Whether a `brand.indexed` webhook event carrying this request's
            `request_id` will be sent when the lookup settles.
        doc_url:
          type: string
          format: uri
      required:
        - reason
        - message
        - retry_after_seconds
        - expires_in_seconds
        - webhook
        - doc_url
    V2AuthError:
      type: object
      description: >-
        Returned when the secret key is missing, malformed, unknown, or
        disabled, before the request reaches the v2 route.
      properties:
        msg:
          type: string
        docs_url:
          type: string
          format: uri
      required:
        - msg
    V2ImageSource:
      type: object
      description: The source file behind the image.
      properties:
        width:
          type: integer
        height:
          type: integer
        format:
          type: string
          enum:
            - png
            - jpg
            - svg
            - webp
            - gif
            - ico
            - avif
          description: Omitted when the format is not recognized.
        has_transparency:
          type: boolean
        is_vector:
          type: boolean
      required:
        - width
        - height
        - has_transparency
        - is_vector
  responses:
    V2Unauthorized:
      description: >-
        The secret key is missing, malformed, unknown, or disabled. A
        publishable key (`pk_`) is refused.
      content:
        application/json:
          schema:
            oneOf:
              - $ref: '#/components/schemas/V2AuthError'
              - $ref: '#/components/schemas/V2Error'
          example:
            msg: invalid api token. make sure to use your secret key.
            docs_url: https://www.logo.dev/docs/platform/api-keys
    V2PaymentRequired:
      description: Your account is out of credits.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/V2Error'
          example:
            error:
              code: insufficient_credits
              message: >-
                out of credits for the brand API. purchase credits at
                https://www.logo.dev/dashboard
            docs_url: https://www.logo.dev/docs/platform/errors
    V2Forbidden:
      description: >-
        The request is refused. Not billed. The identifier type you sent is not
        yet enabled for any account (`merchant`), the account is suspended, or
        personal keys are turned off because you belong to a team. The last two
        return a `msg` field, as an authentication error does.
      content:
        application/json:
          schema:
            oneOf:
              - $ref: '#/components/schemas/V2Error'
              - $ref: '#/components/schemas/V2AuthError'
          examples:
            merchant:
              value:
                error:
                  code: forbidden
                  message: merchant lookups are not yet available
                  target: merchant
                docs_url: https://www.logo.dev/docs/platform/errors
            suspended:
              value:
                msg: account suspended. contact team@logo.dev for more information
                docs_url: https://www.logo.dev/docs/platform/errors
    V2RateLimited:
      description: >-
        Too many brand requests per minute, or too many open at once. Wait for
        `RateLimit-Reset` seconds.
      headers:
        RateLimit-Limit:
          $ref: '#/components/headers/V2RateLimitLimit'
        RateLimit-Remaining:
          $ref: '#/components/headers/V2RateLimitRemaining'
        RateLimit-Reset:
          $ref: '#/components/headers/V2RateLimitReset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/V2Error'
          example:
            error:
              code: rate_limited
              message: >-
                rate limit reached. no more than 100 brand requests per minute
                per account.
            docs_url: https://www.logo.dev/docs/platform/rate-limits
    V2ServerError:
      description: >-
        Something failed on our side. Retry, and contact support with the
        `Request-Id` if it persists.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/V2Error'
          example:
            error:
              code: internal
              message: failed to resolve brand
            docs_url: https://www.logo.dev/docs/platform/errors
  securitySchemes:
    secretKey:
      type: http
      scheme: bearer
      description: >-
        Your secret key (`sk_`), as `Bearer sk_...`. Call the Logo API only from
        your server.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.