GET /v2/brands:
data.id, not on the domain. A brand keeps its id when its domain changes, and GET /v2/brands/{id} fetches it again by that id.
Look up a brand by any identifier
Send exactly one identifier. Each lookup page covers how Logo.dev reads that identifier: The API reference also listsmerchant, for card-statement descriptors. It is not enabled for any account yet and returns 403. To identify a merchant today, use Transaction.
GET /v2/brands returns at most one brand, and only a 200 carries one. To show a list of candidates first, use Search.
Handle each status
A first lookup of a brand Logo.dev has not indexed yet returns
202, and the brand is usually ready within a minute. See not found vs. still indexing. Set your HTTP client timeout to at least 15 seconds, because Logo.dev can prepare a brand’s assets at request time. On serverless platforms, a default function timeout such as Vercel’s maxDuration can end the request first.
Automatic subscriptions
If webhooks are on for your account, a lookup also subscribes the account to the brand’s update webhooks. Addnosubscribe=true to skip that.
metadata.subscription reports what the lookup did. status is subscribed when the account is subscribed to the brand. Your plan caps the number of subscriptions. At the cap, a lookup of a new brand does not subscribe the account: status is quota_exceeded, and message gives the reason. The lookup is answered and billed as usual.
Get only the logo or the brandmark
GET /v2/brands/logo and GET /v2/brands/brandmark return one image as JSON, without the rest of the brand. They take the same identifiers as GET /v2/brands and never subscribe you to the brand:
404, and the request is still billed. To show a logo on a page, you don’t need these routes. The Logo.dev CDN serves logo images with a publishable key.
Images
Every image, inside a brand or on its own, has the same fields:
Download the images you need and host them yourself. Save each image’s
etag with your copy. When you fetch the brand again, download only the images whose etag changed. A new url or expires_at alone does not mean the image changed.
The signature in a download URL is the credential, so send no key with it. Add these query parameters to format the download. They do not change source.
A
url with no parameters downloads a 128-pixel JPG, not the source file. To keep a large copy with transparency, add ?size=800&format=png.
Downloads from these URLs do not count as CDN requests.
Resolution
metadata.resolution describes how your identifier reached the brand. It is about the request, not the brand.
The same identifier can reach a different brand later if its match changes. Subscriptions follow brand ids, so they do not move with it.
Authentication and plans
Brand takes your secret key (sk_...) as a bearer token. Call it from your server, and keep the key out of client code and git.
Lookups spend API credits from your plan’s monthly grant, then from prepaid API credits. See API credits for how billing works, including when a repeat lookup is free, what each request costs for the cost of each route, and out of API credits for the 402 response. See the pricing page for what each plan includes.
Next steps
Look up a brand
Every parameter, field, and status code.
Webhooks
Get told when a brand you use changes.
Migrate from Brandfetch
Map each Brandfetch Brand API field to Logo.dev.
Onboarding personalization
Brand a signup flow from a work email.