v1 · public

Machine-readable API. No auth.

Pass a domain. Get an SVG logo and favicon back, with per-asset confidence. Cached 30 days; add ?refresh=1 to re-extract. 60 requests/hour/IP.

Get JSON
curl "https://brandkit-api.vercel.app/v1/logo?url=stripe.com"

Response is LogoResponse: domain, name, logo, favicon, sources, candidates.

OpenAPI and agent docs
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.

Pipe the SVG
curl -sL "https://brandkit-api.vercel.app/v1/logo.svg?url=stripe.com" > stripe-logo.svg

Returns image/svg+xml directly. Sanitised via DOMPurify.

Favicon redirect
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.

Force a refresh
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.

Response schema
pathtypenotes
domainstringResolved host (follows redirects).
namestring?Title-style brand name when we could infer one.
logoAsset | nullBest-scoring SVG logo, or null if none.
logo.urlstringCanonical URL or data: URL when inline.
logo.format"svg" | "png" | ...Usually svg — that is what we target.
logo.svgstring?Sanitised SVG source when available.
logo.width / heightnumber?Intrinsic dimensions in pixels.
logo.confidencenumber0..1 — higher means stronger signal.
faviconAsset | nullHighest-scoring favicon candidate.
sourcesstring[]Which extractors produced candidates.
candidatesnumberTotal raw candidates before scoring.
Notes