curl --header "Authorization: Bearer $LOGO_DEV_SECRET_KEY" \
"https://api.logo.dev/v2/brands?domain=stripe.com"{
"data": {
"object": "brand",
"id": "brand_4x0wr3g0000g00400000000004",
"slug": "stripe",
"domain": "stripe.com",
"status": "ready",
"name": "Stripe",
"description": "Payments infrastructure for the internet.",
"indexed_at": "2026-09-01T12:00:00Z",
"is_profane": false,
"socials": {
"twitter": "https://x.com/stripe",
"linkedin": "https://www.linkedin.com/company/stripe"
},
"colors": [
{
"r": 99,
"g": 91,
"b": 255,
"hex": "#635bff",
"oklch": {
"l": 0.5854,
"c": 0.2416,
"h": 277.12
}
}
],
"logo": {
"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"
},
"brandmark": null,
"social_banners": []
},
"metadata": {
"request_id": "request_01k6z8m2a4b5c6d7e8f9g0h1j2",
"resolution": {
"type": "domain",
"value": "stripe.com",
"method": "direct",
"context": {}
},
"subscription": {
"status": "subscribed"
}
}
}Look up a brand
Look up a brand by domain, ticker, ISIN, crypto symbol, or name and get its name, colors, socials, logo, and brandmark.
curl --header "Authorization: Bearer $LOGO_DEV_SECRET_KEY" \
"https://api.logo.dev/v2/brands?domain=stripe.com"{
"data": {
"object": "brand",
"id": "brand_4x0wr3g0000g00400000000004",
"slug": "stripe",
"domain": "stripe.com",
"status": "ready",
"name": "Stripe",
"description": "Payments infrastructure for the internet.",
"indexed_at": "2026-09-01T12:00:00Z",
"is_profane": false,
"socials": {
"twitter": "https://x.com/stripe",
"linkedin": "https://www.linkedin.com/company/stripe"
},
"colors": [
{
"r": 99,
"g": 91,
"b": 255,
"hex": "#635bff",
"oklch": {
"l": 0.5854,
"c": 0.2416,
"h": 277.12
}
}
],
"logo": {
"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"
},
"brandmark": null,
"social_banners": []
},
"metadata": {
"request_id": "request_01k6z8m2a4b5c6d7e8f9g0h1j2",
"resolution": {
"type": "domain",
"value": "stripe.com",
"method": "direct",
"context": {}
},
"subscription": {
"status": "subscribed"
}
}
}Get your API keys
Authorizations
Your secret key (sk_), as Bearer sk_.... Call the Logo API only from your server.
Query Parameters
A company domain. Reduced to its registrable domain, so www.stripe.com looks up stripe.com. Send exactly one identifier.
"stripe.com"
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, such as 7203.T. Send exactly one identifier.
"aapl"
An ISIN. Case-insensitive. Send exactly one identifier.
"US0378331005"
A crypto token symbol. Case-insensitive. Send exactly one identifier.
"BTC"
A brand name. Resolved to the top search match. Send exactly one identifier.
"Stripe"
Send true to skip the automatic subscription to this brand. Only matters when webhooks are enabled on your account.
true A card-statement merchant descriptor. Announced but not yet enabled for any account, so it currently answers 403. Send exactly one identifier.
"SQ *BLUE BOTTLE COFFEE"
Response
The brand is ready.
Hide child attributes
Hide child attributes
"brand"The brand's id. Stable across domain changes; use it to key your records.
"brand_4x0wr3g0000g00400000000004"
Readable label for display. It can change and is not accepted for lookups; use id.
The brand's own domain, which can differ from the one you sent. null for brands with no website, such as some crypto tokens.
"ready"When the record was last refreshed.
true when the brand may carry NSFW imagery.
Brand colors, most dominant first.
Hide child attributes
Hide child attributes
0 <= x <= 2550 <= x <= 2550 <= x <= 255"#635bff"
The primary logo. null when the brand has none.
Hide child attributes
Hide child attributes
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.
Identifies this version of the source image, and is the same on every route. Save it and download again only when it changes.
Compact blurred placeholder for the image.
The source file behind the image.
Hide child attributes
Hide child attributes
Omitted when the format is not recognized.
png, jpg, svg, webp, gif, ico, avif When the image last changed. null if it has not changed since the brand was indexed.
When url stops working, about 24 hours after the request.
The wide logo lockup: the symbol and wordmark together for most brands, or the wordmark alone for pure-type brands. null when the brand has none. See brandmark.
Hide child attributes
Hide child attributes
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.
Identifies this version of the source image, and is the same on every route. Save it and download again only when it changes.
Compact blurred placeholder for the image.
The source file behind the image.
Hide child attributes
Hide child attributes
Omitted when the format is not recognized.
png, jpg, svg, webp, gif, ico, avif When the image last changed. null if it has not changed since the brand was indexed.
When url stops working, about 24 hours after the request.
Banner images. Empty when there are none.
Hide child attributes
Hide child attributes
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.
Identifies this version of the source image, and is the same on every route. Save it and download again only when it changes.
Compact blurred placeholder for the image.
The source file behind the image.
Hide child attributes
Hide child attributes
Omitted when the format is not recognized.
png, jpg, svg, webp, gif, ico, avif When the image last changed. null if it has not changed since the brand was indexed.
When url stops working, about 24 hours after the request.
Hide child attributes
Hide child attributes
Unique id for this request. Also sent as the Request-Id header.
"request_01k6z8m2a4b5c6d7e8f9g0h1j2"
Brand and image lookups only.
Hide child attributes
Hide child attributes
Which identifier the request used.
domain, ticker, isin, crypto, name, brand_id The identifier after normalization: the registrable domain, an upper-cased ticker, and so on.
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.
direct, domain, security, crypto, search, Reserved for brands involved in a merchant lookup. Always {} today.
202 responses only.
Hide child attributes
Hide child attributes
indexing is a brand's first crawl; resolving means the identifier is still being matched to a brand.
indexing, resolving Wait this long before retrying. Matches the Retry-After header.
30
Stop polling after this long.
300
Whether a brand.indexed webhook event carrying this request's request_id will be sent when the lookup settles.
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.
Hide child attributes
Hide child attributes
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.
subscribed, quota_exceeded Why the subscribe was refused. Only with quota_exceeded.
Was this page helpful?