---
title: "Look up a brand"
method: GET
path: "/v2/brands"
tags: ["Brands"]
---

# Look up a brand

`GET /v2/brands`

## Request

- Base URL: `https://api.logo.dev`
- URL: `https://api.logo.dev/v2/brands`
- Auth: HTTP bearer

Returns a brand's profile from one identifier: a domain, ticker, ISIN, crypto symbol, or name. Send exactly one. A brand Logo.dev has not indexed yet returns `202` while it is fetched; retry after 30 seconds. Costs API credits at the rate in [API credits](/platform/credits#what-each-request-costs). Billed once per brand domain per 24 hours, and only when the brand is ready. Merchant descriptors are not accepted yet.

## Query parameters

- `domain` string
- `ticker` string
- `isin` string
- `crypto` string
- `name` string
- `nosubscribe` 'true'
- `merchant` string

## Response `200`

The brand is ready.

- object
  - `data` V2Brand, required
    - `object` 'brand', required
    - `id` string, required: The brand's id. Stable across domain changes; use it to key your records.
    - `slug` string, required: Readable label for display. It can change and is not accepted for lookups; use `id`.
    - `domain` string, nullable, required: 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` 'ready', required
    - `name` string, required
    - `description` string, nullable, required
    - `indexed_at` string, date-time, required: When the record was last refreshed.
    - `is_profane` boolean, required: `true` when the brand may carry NSFW imagery.
    - `socials` object, required: Profile URLs keyed by network. Networks with no profile are omitted.
    - `colors` V2Color[], required: Brand colors, most dominant first.
      - `r` integer, required
      - `g` integer, required
      - `b` integer, required
      - `hex` string, required
      - `oklch` object, required
        - `l` number, required: Lightness, 0 to 1.
        - `c` number, required: Chroma. Usually below 0.4.
        - `h` number, required: Hue in degrees, 0 to 360. `0` when chroma is 0.
    - `logo` V2Image, required
      - `url` string, uri, required: 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` string, required: Identifies this version of the source image, and is the same on every route. Save it and download again only when it changes.
      - `blurhash` string, required: Compact blurred placeholder for the image.
      - `source` V2ImageSource, required: The source file behind the image.
        - `width` integer, required
        - `height` integer, required
        - `format` 'png' | 'jpg' | 'svg' | 'webp' | 'gif' | 'ico' | 'avif': Omitted when the format is not recognized.
        - `has_transparency` boolean, required
        - `is_vector` boolean, required
      - `last_updated_at` string, date-time, nullable, required: When the image last changed. `null` if it has not changed since the brand was indexed.
      - `expires_at` string, date-time, required: When `url` stops working, about 24 hours after the request.
    - `brandmark` V2Image, required
      - `url` string, uri, required: 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` string, required: Identifies this version of the source image, and is the same on every route. Save it and download again only when it changes.
      - `blurhash` string, required: Compact blurred placeholder for the image.
      - `source` V2ImageSource, required: The source file behind the image.
        - `width` integer, required
        - `height` integer, required
        - `format` 'png' | 'jpg' | 'svg' | 'webp' | 'gif' | 'ico' | 'avif': Omitted when the format is not recognized.
        - `has_transparency` boolean, required
        - `is_vector` boolean, required
      - `last_updated_at` string, date-time, nullable, required: When the image last changed. `null` if it has not changed since the brand was indexed.
      - `expires_at` string, date-time, required: When `url` stops working, about 24 hours after the request.
    - `social_banners` V2Image[], required: Banner images. Empty when there are none.
      - `url` string, uri, required: 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` string, required: Identifies this version of the source image, and is the same on every route. Save it and download again only when it changes.
      - `blurhash` string, required: Compact blurred placeholder for the image.
      - `source` V2ImageSource, required: The source file behind the image.
        - `width` integer, required
        - `height` integer, required
        - `format` 'png' | 'jpg' | 'svg' | 'webp' | 'gif' | 'ico' | 'avif': Omitted when the format is not recognized.
        - `has_transparency` boolean, required
        - `is_vector` boolean, required
      - `last_updated_at` string, date-time, nullable, required: When the image last changed. `null` if it has not changed since the brand was indexed.
      - `expires_at` string, date-time, required: When `url` stops working, about 24 hours after the request.
  - `metadata` V2Metadata, required
    - `request_id` string, required: Unique id for this request. Also sent as the `Request-Id` header.
    - `resolution` V2Resolution: How the request identified the brand.
      - `type` 'domain' | 'ticker' | 'isin' | 'crypto' | 'name' | 'brand_id', required: Which identifier the request used.
      - `value` string, required: The identifier after normalization: the registrable domain, an upper-cased ticker, and so on.
      - `method` 'direct' | 'domain' | 'security' | 'crypto' | 'search' | '', required: 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` object, required: Reserved for brands involved in a merchant lookup. Always `{}` today.
    - `pending` V2Pending: Present only on a `202`. Tells you when to retry.
      - `reason` 'indexing' | 'resolving', required: `indexing` is a brand's first crawl; `resolving` means the identifier is still being matched to a brand.
      - `message` string, required
      - `retry_after_seconds` integer, required: Wait this long before retrying. Matches the `Retry-After` header.
      - `expires_in_seconds` integer, required: Stop polling after this long.
      - `webhook` boolean, required: Whether a `brand.indexed` webhook event carrying this request's `request_id` will be sent when the lookup settles.
      - `doc_url` string, uri, required
    - `subscription` object: 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).
      - `status` 'subscribed' | 'quota_exceeded', required: `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` string: Why the subscribe was refused. Only with `quota_exceeded`.

## Other responses

- `202`: Logo.dev is still indexing this brand. Retry after `Retry-After` seconds; retries are not billed.
- `400`: Send exactly one identifier, in a valid format.
- `401`: The secret key is missing, malformed, unknown, or disabled. A publishable key (`pk_`) is refused.
- `402`: Your account is out of API credits.
- `403`: 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.
- `404`: No brand matches this identifier.
- `429`: Too many brand requests per minute, or too many open at once. Wait for `RateLimit-Reset` seconds.
- `500`: Something failed on our side. Retry, and contact support with the `Request-Id` if it persists.

---

[API](https://skmtc.dev/logo/apis/logo-dev-api.md) · [All operations](https://skmtc.dev/logo/apis/logo-dev-api/llms.txt) · [OpenAPI document](https://skmtc.dev/logo/apis/logo-dev-api/revisions/6251e2aca8fb?raw)
