API reference
Docs.
Everything LogoAPI does today, with real examples. Every route is a plain GET. Updated 2026-10-26
Quick start
No key, no signup. Copy this tag, swap the domain, done.
<img src="https://logoapi.sh/stripe.com.svg" alt="Stripe" height="24">
Logo
/{domain}.svgThe wordmark. Falls back to the square icon when a brand has no wordmark. An unknown domain returns 404 with no placeholder image, so your own fallback runs.
curl -I https://logoapi.sh/stripe.com.svgHTTP/2 200
content-type: image/svg+xml
access-control-allow-origin: *
cache-control: public, max-age=86400, stale-while-revalidate=604800Bare domain
/{domain}Same answer as /{domain}.svg, without the extension. A Clearbit-style URL works after a host swap.
<img src="https://logoapi.sh/stripe.com" alt="Stripe" height="24">Icon
/icon/{domain}.svgThe square mark, for avatars and lists.
<img src="https://logoapi.sh/icon/github.com.svg" width="32" height="32" alt="GitHub">Favicon
/favicon/{domain}A favicon for a site, taken from the catalog icon. /favicon/{domain}.svg works too. The answer is SVG. An unknown domain returns a 404 with a JSON body. PNG is coming.
<link rel="icon" type="image/svg+xml" href="https://logoapi.sh/favicon/github.com">Colour versions
/{version}/{domain}.svgPut white, black, grey or dark in front of any logo path. white and black repaint every colour to one flat colour, grey removes the colour, and dark is for dark backgrounds. The icon form is /{version}/icon/{domain}.svg. The .svg ending is optional.
| Version | URL |
|---|---|
| white | /white/stripe.com.svg |
| black | /black/stripe.com.svg |
| grey | /grey/stripe.com.svg |
| dark | /dark/stripe.com.svg |
| icon | /white/icon/github.com.svg |
<img src="https://logoapi.sh/white/stripe.com.svg" alt="Stripe" height="24">Search
/search?q={text}Match an exact brand name, an exact domain or a close typo. Returns up to 8 results as JSON. q is 2 to 80 characters. A typo is tolerated (1 edit for 4 to 6 characters, 2 for 7 or more); those hits rank below exact matches and carry "fuzzy": true. An alias domain finds its main brand.
curl "https://logoapi.sh/search?q=stripe"{
"query": "stripe",
"results": [
{
"domain": "stripe.com",
"name": "Stripe",
"logo": "https://logoapi.sh/stripe.com.svg",
"icon": "https://logoapi.sh/icon/stripe.com.svg",
"tags": ["finance"],
"origin": "gilbarbara",
"source": "https://stripe.com/",
"score": 90
}
]
}Brand pages
/brand/{domain}An HTML page for one brand: its logo, icon, white, black, grey and dark versions, colours, URLs and embed code. Link to it from your docs or share it with a teammate. An unknown domain returns 404.
https://logoapi.sh/brand/stripe.comAliases
Some brands answer on several domains, for example teva.co.il and teva.com both serve the Teva logo. Search returns the main domain once, even when you search for an alias.
Errors
| Status | When |
|---|---|
404 | Logo, icon, version or brand page for an unknown domain. Plain text not found, no placeholder image, so your own fallback runs. Cached for an hour. /favicon/{domain} returns a JSON body instead: {"error":"not_found", "message":..., "claim":...}. |
400 | Bad search input: q too short or too long, an unknown tag, or a comma list of tags. JSON with an error message. |
403 | page=2 or higher on a tag search. JSON with error: "page_limit". |
429 | You went over a limit (see Limits). JSON body, plus a Retry-After header. |
{
"error": "rate_limited",
"message": "...You hit the free limit (120 searches per minute)...",
"retry_after_seconds": 60
}
error is rate_limited (searches per minute), daily_limit (searches per day) or guess_limit (too many unknown domains). Wait retry_after_seconds before you retry.
<img src="https://logoapi.sh/icon/acme.example.svg"
onerror="this.src='/img/generic-company.svg'" alt="Acme">Caching and CORS
Logos, icons, favicons and colour versions are cached at the edge for a day and served stale for a week while they refresh (max-age=86400, stale-while-revalidate=604800). Search results cache for 5 minutes. Brand pages and 404 answers cache for an hour. Error JSON is never cached. Every response sends Access-Control-Allow-Origin: *, so you can fetch from any site.
Limits
Free, no key, no attribution. Fair use: embed our logos and use the search API in your site or app. Do not bulk-copy the catalog to run a competing service. Limits are per IP address.
| Limit | What happens |
|---|---|
| 150 requests per 10 seconds | Across all of logoapi.sh. Over it you get a 429. |
| 300 requests per minute | Over it, the IP is blocked for 1 hour. Verified search-engine crawlers are exempt. |
| 120 searches per minute | 429 with Retry-After. |
| 500 searches per day | 50 per day from cloud and hosting networks. Resets at 00:00 UTC. |
| 300 unknown domains in 10 minutes | 300 404s in 10 minutes blocks the IP for 1 hour. |
| Tag search | First 48 results. A tag plus q gives up to 8. |
Need more (aggregators, bulk, heavy apps)? Email hello@logoapi.sh. Free keys with higher limits are coming.
AI agents
No setup needed. An agent that writes HTML can use the URL pattern directly: https://logoapi.sh/{domain}.svg. To find a domain from a name, call /search?q=. For a set, use /search?tag=.
Machine-readable summary: /llms.txt.
Prompt: "Add a row of customer logos for stripe.com, notion.so and linear.app.\nUse https://logoapi.sh/{domain}.svg for each."Finder links
The Logo Finder lets you search any brand or browse the top 48 logos of each category.
Coming soon
Not live yet. We list them here so you know what is next.
- PNG and WebP at any size, and PNG favicons
- Optional monogram fallback
- Free keys with higher limits
- MCP server for AI agents
- OpenAPI spec at
/openapi.jsonand/llms-full.txt