# favi
> favi is a logo API: GET https://img.favi.sh/{domain}?key=pk_… returns a company's logo
> as an image. Misses return a generated lettermark immediately (HTTP 202)
> while the real logo is crawled, usually landing within seconds. No SDK
> required; the URL goes straight into an
tag. The same key also
> resolves logos by company name and stock ticker, and returns brand data
> (colors, blurhash, description, socials) as JSON.
Full reference in one fetch: https://favi.sh/llms-full.txt (also https://favi.sh/docs.md).
OpenAPI 3.1: https://favi.sh/openapi.json. Human docs: https://favi.sh/docs.
Hosts: https://img.favi.sh serves everything that takes a publishable key (images,
search, name, ticker, brand). https://favi.sh is the site, dashboard and the
signed-in account APIs.
Keys are publishable (pk_…) and ship in page source; access control is a
per-key domain allowlist, and keys are unlimited on every plan. Free tier:
500,000 requests/month. Pro: 2,000,000 at $29/month. Quota is per account.
Over quota serves fallback images, never errors. No attribution required on
any plan. Brand data and every lookup are included on both plans and count as
ordinary requests — no separate credits.
Migrating from logo.dev: identical parameter names, and `token` is accepted
as an alias for `key` — change the hostname only. Migrating from Brandfetch
(cdn.brandfetch.io/{domain}/w/64/h/64?c=): the path segments become query
parameters (?key=…&width=64&height=64). Migrating from Clearbit
(logo.clearbit.com, shut down 2025-12): same path shape, add ?key=.
## Image endpoint
GET https://img.favi.sh/{domain}?key=pk_…
Parameters:
- format: webp (default) | avif (smallest, keeps transparency) | png | jpg (jpg flattens transparency onto white)
- theme: dark serves a white-recolored variant of dark transparent marks;
colorful logos serve unchanged. Resolve auto client-side with
and prefers-color-scheme.
- size: downscale to fit; width/height (or w/h) for exact boxes; retina=true
doubles the request. Never upscaled past the stored master (max 256px).
- greyscale: true desaturates.
- fallback: 404 returns HTTP 404 on a miss instead of a lettermark.
Subdomains inherit the registrable parent's logo (public-suffix aware) until
they have their own. Responses carry access-control-allow-origin: * for
canvas use, and x-favi-result explaining what was served:
hit | lettermark:pending (202) | lettermark:failed | lettermark:blocked |
lettermark:over-quota | rejected:missing | rejected:unknown |
rejected:disabled | rejected:referer | rejected:rate-limited.
A malformed domain is the one 400.
## Search
GET https://img.favi.sh/search?q=stri&key=pk_… → {"results":[{"name","domain","logoUrl"}]}
Up to 10 matches, exact first, then popularity. Same publishable key. Never
queues a crawl.
GET https://img.favi.sh/name/{brand}?key=pk_… → 302 to the top match's image URL, all
image parameters carried through. Unknown name → lettermark.
## Ticker
GET https://img.favi.sh/ticker/{symbol}?key=pk_… → 302 to the listing's domain logo, all
image parameters carried through. Bare symbol = US listing (NYSE, Nasdaq,
AMEX, OTC); share classes as BRK.B or BRK-B; other exchanges take the
Yahoo-style suffix (SHOP.TO, 7203.T, 0700.HK, RELIANCE.NS, BHP.AX). 32
exchanges; coverage is strong outside the US and thin on US small caps. An unknown symbol is never guessed: lettermark of the symbol
(x-favi-result: lettermark:unknown-ticker) or 404 with fallback=404. No
crawl, nothing metered.
## Brand profile
GET https://img.favi.sh/brand/{domain}?key=pk_… → JSON with name, description,
brandColor, colors (up to 5 {hex, r, g, b, share}, most prominent first),
blurhash, socials, and every logo URL variant. Unknown domains answer 202
{"status":"pending"} while the first crawl runs (usually seconds). Included
on every plan, counted as one request.
## Limits
500 new (never-seen) domains per account per day (across all keys); 6,000
origin requests per minute per key (the edge cache absorbs most reads); above either, a
lettermark. Refresh a stale logo: POST https://favi.sh/api/refresh {"domain"} (signed in, 20/hour); the edge cache is purged.
## Agents and MCP
MCP server (Streamable HTTP, OAuth 2.1 per the MCP authorization spec):
https://favi.sh/mcp. `claude mcp add --transport http favi https://favi.sh/mcp`, then sign in
when the client asks — it opens a browser once and keeps its own token.
Tools: logo_url, search_brands, get_brand, whoami, list_keys, create_key,
update_key, revoke_key, usage, refresh_domain. The same token works on the HTTP
account API (/api/keys, /api/usage, /api/refresh) — the
device flow is POST https://favi.sh/api/auth/device/code {client_id} then
POST https://favi.sh/api/auth/device/token. Full detail: https://favi.sh/docs.md#agents-and-mcp.
## Example
## Links
- Docs: https://favi.sh/docs (Markdown: https://favi.sh/docs.md)
- Full reference for LLMs: https://favi.sh/llms-full.txt
- OpenAPI: https://favi.sh/openapi.json
- Status (externally measured) + SLA: https://favi.sh/status, https://favi.sh/legal/sla
- Comparison with logo.dev, Brandfetch and Clearbit: https://favi.sh/compare
- Migration pages: https://favi.sh/logo-dev-alternative, https://favi.sh/brandfetch-alternative, https://favi.sh/clearbit-alternative