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

# Requests and responses

> Base URLs, keys, the response envelope, response headers, id and timestamp conventions, and versioning for the Logo CDN and the Logo API.

Logo.dev serves brand assets from two hosts. Each host takes its own key and is billed on its own meter.

| | Logo CDN | Logo API |
| - | - | - |
| Base URL | `https://img.logo.dev` | `https://api.logo.dev` |
| Returns | A logo image | JSON |
| Key | Publishable key (`pk_`) in the `token` query parameter | Secret key (`sk_`) in the `Authorization` header |
| Where to call it | Anywhere, including the browser | Your server only |
| Billing | Monthly logo requests | [Credits](/docs/platform/rate-limits#credits) |

See [API keys](/docs/platform/api-keys) for where each key goes, domain restrictions, and rotation.

Two services have their own host. The [Transaction Enrichment API](/docs/transaction/introduction) beta is at `https://www.logo.dev/api/transaction` and takes its own beta key. The [MCP server](/docs/mcp/introduction) is at `https://mcp.logo.dev/mcp` and signs you in with OAuth. The rest of this page covers `api.logo.dev`.

## The response envelope

Every Logo API response that has a body and is not an error has the same two fields. A successful delete returns `204` with no body. `data` holds the result, and `metadata` describes the request. The response looks like:

```json theme={null}
{
  "data": { "object": "brand", "id": "brand_4x0wr3g0000g00400000000004", "...": "..." },
  "metadata": {
    "request_id": "request_01k6z8m2a4b5c6d7e8f9g0h1j2",
    "resolution": { "type": "domain", "value": "stripe.com", "method": "direct", "context": {} }
  }
}
```

| Field | Present on | Meaning |
| - | - | - |
| `data` | Every response with a body | The brand, image, search results, subscription, or webhook endpoint. Every object has an `object` field that names its type. |
| `metadata.request_id` | Every response with a body | The request's id. It matches the `Request-Id` header. |
| `metadata.resolution` | Brand and image lookups | The identifier you sent, its normalized value, and how it reached the brand. See [resolution](/docs/brand/introduction#resolution). |
| `metadata.pending` | `202` responses | When to retry a lookup that is still indexing. See [still indexing](/docs/platform/errors#not-found-vs-still-indexing-202). |
| `metadata.subscription` | Brand lookups from an account with webhooks on | What the automatic subscribe did. `status` is `subscribed`, or `quota_exceeded` when your account is at its subscription limit and this brand was not subscribed. `message` explains a `quota_exceeded`. See [subscriptions](/docs/webhooks#subscriptions). |

A failed request returns an `error` object instead of the envelope. See [errors](/docs/platform/errors) for every code.

## Response headers

| Header | Returned on | Meaning |
| - | - | - |
| `Request-Id` | Every response | The request's id. Include it when you contact support. |
| `Credits-Charged` | Brand, image, and search requests | `1` when this request spent credits, `0` when it was free under the [billing rules](/docs/platform/rate-limits#credits). It is not the amount. Use `Credits-Remaining` to track your balance. |
| `Credits-Remaining` | Brand, image, and search requests, when the balance is known | Your credit balance after this request. Absent means unknown, not zero. |
| `RateLimit-Limit` | Brand, image, and search requests | Requests allowed in the current window |
| `RateLimit-Remaining` | Brand, image, and search requests | Requests left in the current window |
| `RateLimit-Reset` | Brand, image, and search requests | Seconds until the window resets |
| `Retry-After` | `202` responses | Seconds to wait before you retry |

See [rate limits](/docs/platform/rate-limits) for how limits and credits work.

## Conventions

* Timestamps are RFC 3339, in UTC.
* Ids have a prefix that names what they point to: `brand_` for a brand, `sub_` for a subscription, `evt_` for a webhook event, `ep_` for a webhook endpoint, and `request_` for a request. Treat every id as opaque.
* Store brand ids, not domains. A brand keeps its id when its domain changes.
* Field names are snake\_case. A field with no value is `null`, maps omit absent keys, and an empty list is `[]`.

## Versioning

The Logo API version is in the path. Every route in this reference is under `/v2`. New fields and new routes can arrive inside `/v2`. A breaking change ships under a new prefix. The Logo CDN is not versioned.

The [v1 routes](/docs/api-reference/v1/get-a-brand-profile) keep working. v1 search spends credits like v2 search, so it can return `402`. See the [changelog](/docs/changelog). Their v2 replacements differ in these ways:

* Responses are wrapped in `data` and `metadata`, and errors use the `error` object.
* `GET /v2/brands` replaces `GET /brand/{domain}` and `GET /describe/{domain}`. It also accepts a ticker, an ISIN, a crypto symbol, or a name.
* Images are objects with a temporary download `url`, dimensions, format, and blurhash. They are not bare URLs.
* Colors include OKLCH values next to RGB and hex.
* `GET /v2/search` takes `method` (`match` or `typeahead`) instead of `strategy`, and adds `limit`.

Every Logo API route also has a tool on the [MCP server](/docs/mcp/introduction).


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