> ## 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 brandmark

> Get a brand's brandmark with a temporary download URL, dimensions, and blurhash.

<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/brandmark
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/brandmark:
    get:
      tags:
        - Logos
      summary: Get a brandmark
      description: >-
        Returns the brand's brandmark, the wide logo lockup, as JSON with a
        temporary download `url`, the source dimensions, and a placeholder
        blurhash. It does not return image bytes. Send exactly one identifier.
        Costs credits at the rate on the [API rate
        card](https://www.logo.dev/pricing#api-pricing). Billed once per brand
        domain per 24 hours. A ready brand with no brandmark is still billed.
      operationId: v2GetBrandBrandmark
      parameters:
        - $ref: '#/components/parameters/V2Domain'
        - $ref: '#/components/parameters/V2Ticker'
        - $ref: '#/components/parameters/V2Isin'
        - $ref: '#/components/parameters/V2Crypto'
        - $ref: '#/components/parameters/V2Name'
        - $ref: '#/components/parameters/V2Merchant'
      responses:
        '200':
          description: The brand is ready and has a brandmark.
          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/V2ImageResource'
                  metadata:
                    $ref: '#/components/schemas/V2Metadata'
                required:
                  - data
                  - metadata
              example:
                data:
                  object: image
                  kind: brandmark
                  brand_id: brand_4x0wr3g0000g00400000000004
                  status: ready
                  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'
                metadata:
                  request_id: request_01k6z8m2a4b5c6d7e8f9g0h1j2
                  resolution:
                    type: domain
                    value: stripe.com
                    method: direct
                    context: {}
        '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: image
                  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: Send exactly one identifier, in a valid format.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V2Error'
              example:
                error:
                  code: invalid_request
                  message: >-
                    exactly one of domain, ticker, isin, crypto, name, merchant
                    is required
                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, or the brand has no brandmark.
          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: image
                  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: []
      x-codeSamples:
        - lang: bash
          label: By domain
          source: |-
            curl --header "Authorization: Bearer $LOGO_DEV_SECRET_KEY" \
              "https://api.logo.dev/v2/brands/brandmark?domain=stripe.com"
        - lang: bash
          label: By ticker
          source: |-
            curl --header "Authorization: Bearer $LOGO_DEV_SECRET_KEY" \
              "https://api.logo.dev/v2/brands/brandmark?ticker=AAPL"
        - lang: bash
          label: By ISIN
          source: |-
            curl --header "Authorization: Bearer $LOGO_DEV_SECRET_KEY" \
              "https://api.logo.dev/v2/brands/brandmark?isin=US0378331005"
        - lang: bash
          label: By crypto
          source: |-
            curl --header "Authorization: Bearer $LOGO_DEV_SECRET_KEY" \
              "https://api.logo.dev/v2/brands/brandmark?crypto=BTC"
        - lang: bash
          label: By name
          source: |-
            curl --header "Authorization: Bearer $LOGO_DEV_SECRET_KEY" \
              "https://api.logo.dev/v2/brands/brandmark?name=Stripe"
        - lang: javascript
          label: By domain
          source: >-
            const res = await
            fetch("https://api.logo.dev/v2/brands/brandmark?domain=stripe.com",
            {
              headers: { Authorization: `Bearer ${process.env.LOGO_DEV_SECRET_KEY}` },
            });

            const { data, metadata } = await res.json();
        - lang: javascript
          label: By ticker
          source: >-
            const res = await
            fetch("https://api.logo.dev/v2/brands/brandmark?ticker=AAPL", {
              headers: { Authorization: `Bearer ${process.env.LOGO_DEV_SECRET_KEY}` },
            });

            const { data, metadata } = await res.json();
        - lang: javascript
          label: By ISIN
          source: >-
            const res = await
            fetch("https://api.logo.dev/v2/brands/brandmark?isin=US0378331005",
            {
              headers: { Authorization: `Bearer ${process.env.LOGO_DEV_SECRET_KEY}` },
            });

            const { data, metadata } = await res.json();
        - lang: javascript
          label: By crypto
          source: >-
            const res = await
            fetch("https://api.logo.dev/v2/brands/brandmark?crypto=BTC", {
              headers: { Authorization: `Bearer ${process.env.LOGO_DEV_SECRET_KEY}` },
            });

            const { data, metadata } = await res.json();
        - lang: javascript
          label: By name
          source: >-
            const res = await
            fetch("https://api.logo.dev/v2/brands/brandmark?name=Stripe", {
              headers: { Authorization: `Bearer ${process.env.LOGO_DEV_SECRET_KEY}` },
            });

            const { data, metadata } = await res.json();
        - lang: python
          label: By domain
          source: |-
            import os, requests

            res = requests.get(
                "https://api.logo.dev/v2/brands/brandmark",
                params={"domain": "stripe.com"},
                headers={"Authorization": f"Bearer {os.environ['LOGO_DEV_SECRET_KEY']}"},
            )
            data = res.json()["data"]
        - lang: python
          label: By ticker
          source: |-
            import os, requests

            res = requests.get(
                "https://api.logo.dev/v2/brands/brandmark",
                params={"ticker": "AAPL"},
                headers={"Authorization": f"Bearer {os.environ['LOGO_DEV_SECRET_KEY']}"},
            )
            data = res.json()["data"]
        - lang: python
          label: By ISIN
          source: |-
            import os, requests

            res = requests.get(
                "https://api.logo.dev/v2/brands/brandmark",
                params={"isin": "US0378331005"},
                headers={"Authorization": f"Bearer {os.environ['LOGO_DEV_SECRET_KEY']}"},
            )
            data = res.json()["data"]
        - lang: python
          label: By crypto
          source: |-
            import os, requests

            res = requests.get(
                "https://api.logo.dev/v2/brands/brandmark",
                params={"crypto": "BTC"},
                headers={"Authorization": f"Bearer {os.environ['LOGO_DEV_SECRET_KEY']}"},
            )
            data = res.json()["data"]
        - lang: python
          label: By name
          source: |-
            import os, requests

            res = requests.get(
                "https://api.logo.dev/v2/brands/brandmark",
                params={"name": "Stripe"},
                headers={"Authorization": f"Bearer {os.environ['LOGO_DEV_SECRET_KEY']}"},
            )
            data = res.json()["data"]
components:
  parameters:
    V2Domain:
      name: domain
      in: query
      required: false
      description: >-
        A company domain. Reduced to its registrable domain, so `www.stripe.com`
        looks up `stripe.com`. Send exactly one identifier.
      schema:
        type: string
        examples:
          - stripe.com
    V2Ticker:
      name: ticker
      in: query
      required: false
      description: >-
        The stock or ETF symbol, in any case, with no exchange prefix: `aapl`
        and `AAPL` return the same brand. A bare symbol resolves against US
        exchanges. For a listing on another exchange, add the [exchange
        suffix](/logo-images/ticker#exchange-suffixes), such as `7203.T`. Send
        exactly one identifier.
      schema:
        type: string
        examples:
          - aapl
    V2Isin:
      name: isin
      in: query
      required: false
      description: An ISIN. Case-insensitive. Send exactly one identifier.
      schema:
        type: string
        examples:
          - US0378331005
    V2Crypto:
      name: crypto
      in: query
      required: false
      description: A crypto token symbol. Case-insensitive. Send exactly one identifier.
      schema:
        type: string
        examples:
          - BTC
    V2Name:
      name: name
      in: query
      required: false
      description: >-
        A brand name. Resolved to the top search match. Send exactly one
        identifier.
      schema:
        type: string
        examples:
          - Stripe
    V2Merchant:
      name: merchant
      in: query
      required: false
      description: >-
        A card-statement merchant descriptor. Announced but not yet enabled for
        any account, so it currently answers `403`. Send exactly one identifier.
      schema:
        type: string
        examples:
          - SQ *BLUE BOTTLE COFFEE
  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:
    V2ImageResource:
      allOf:
        - type: object
          properties:
            object:
              type: string
              const: image
            kind:
              type: string
              enum:
                - logo
                - brandmark
              description: '`logo` or `brandmark`.'
            brand_id:
              type: string
              examples:
                - brand_4x0wr3g0000g00400000000004
            status:
              type: string
              const: ready
          required:
            - object
            - kind
            - brand_id
            - status
        - $ref: '#/components/schemas/V2Image'
    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
    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.