---
title: "Get a brandmark"
method: GET
path: "/v2/brands/brandmark"
tags: ["Logos"]
---

# Get a brandmark

`GET /v2/brands/brandmark`

## Request

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

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 API credits at the rate in [API credits](/platform/credits#what-each-request-costs). Billed once per brand domain per 24 hours. A ready brand with no brandmark is still billed.

## Query parameters

- `domain` string
- `ticker` string
- `isin` string
- `crypto` string
- `name` string
- `merchant` string

## Response `200`

The brand is ready and has a brandmark.

- object
  - `data` V2ImageResource, required
    - `object` 'image', required
    - `kind` 'logo' | 'brandmark', required: `logo` or `brandmark`.
    - `brand_id` string, required
    - `status` 'ready', 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.
  - `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, or the brand has no brandmark.
- `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)
