Machine-readable API. No auth.
Pass a domain. Get separate symbol, logotype, primary logo, favicon, light variant, and dark variant assets back, with per-asset confidence. Cached 30 days; add ?refresh=1 to re-extract. 60 requests/hour/IP.
curl "https://brandkit-api.vercel.app/v1/logo?url=stripe.com"
Response is LogoResponse: domain, name, mark (symbol), logotype, primaryLogo, favicon, lightVariant, darkVariant, confidence, sources, candidates.
curl "https://brandkit-api.vercel.app/openapi.json" curl "https://brandkit.danielhowells.com/llms.txt"
The OpenAPI document includes stable operation IDs, request and response schemas, cache notes, rate-limit errors, and Problem Details responses. Agents should use /llms.txt as the concise discovery entry point.
curl -sL "https://brandkit-api.vercel.app/v1/logo.svg?url=stripe.com" > stripe-logo.svg
Returns image/svg+xml directly. Sanitised via DOMPurify.
curl -IL "https://brandkit-api.vercel.app/v1/favicon?url=stripe.com"
302 to the canonical favicon — ICO, PNG, or SVG depending on the brand.
curl -sL "https://brandkit-api.vercel.app/v1/logo.light.svg?url=stripe.com" > stripe-logo-light.svg curl -sL "https://brandkit-api.vercel.app/v1/logo.dark.svg?url=stripe.com" > stripe-logo-dark.svg
Variants are source-provided when possible and otherwise derived from the selected logo asset with provenance in the JSON response.
curl "https://brandkit-api.vercel.app/v1/logo?url=stripe.com&refresh=1"
Skips the 30-day cache, re-runs extraction, writes fresh results back.
| path | type | notes |
|---|---|---|
| domain | string | Resolved host (follows redirects). |
| name | string? | Title-style brand name when we could infer one. |
| primaryLogo | Asset | null | Best selected logo asset for general display, or null if none. |
| mark | Asset | null | Compact brand symbol or monogram, separate from the wordmark. |
| logotype | Asset | null | Wordmark or lockup containing the brand name. |
| primaryLogo.url | string | Canonical URL or data: URL when inline. |
| primaryLogo.format | "svg" | "png" | ... | Usually svg — that is what we target. |
| primaryLogo.svg | string? | Sanitised SVG source when available. |
| lightVariant / darkVariant | Variant | Downloadable logo variants with provenance and confidence. |
| confidence | number | 0..1 summary confidence for the result. |
| primaryLogo.width / height | number? | Intrinsic dimensions in pixels. |
| primaryLogo.confidence | number | 0..1 — higher means stronger signal. |
| favicon | Asset | null | Highest-scoring favicon candidate. |
| sources | string[] | Which extractors produced candidates. |
| candidates | number | Total raw candidates before scoring. |
- · SVGs are sanitised server-side.
- · robots.txt is respected.
- · Free-source extraction by default: head/manifest/homepage DOM, Simple Icons, Wikidata/Wikimedia, headless render.
- · A bounded Mastra adjudicator may choose from gathered candidates when confidence is low.
- · When a slot isn’t reliably available, the field is null rather than guessed.