Brand extraction API
Logos, colour roles and type for any company on the internet, measured from the page as it renders rather than read off the stylesheet. No headless browser to babysit, no favicon guessing, no stale PNGs in your database.
Every domain sampled here joins the shared cache. Read one that is already there and it comes back in milliseconds, free, for everyone.
Every field is what the brand publishes on its own pages, measured from the page as it renders rather than read off the stylesheet, and versioned so a redesign never silently changes shape underneath you.
SVG where the site has one, raster where it does not.
Ranked by how much of the rendered page each one covers.
The faces that rendered, not the ones the stack asked for.
domains in the shared cache, readable by anyone
median cold read, when a domain is new to us
colours per brand, ranked by painted area
cost to re-read a domain already in the cache
Most extractors parse stylesheets and rank colours by how often they appear in the source. That breaks in ways your users notice, because a modern page paints almost nothing the way it declares it.
Design systems ship dozens of custom properties that never get painted. Source readers return them as brand colours. Measurement never sees them, so it never reports them.
A hero gradient has no single hex. Parsers pick a stop or average the ramp and return a colour the brand does not use. We sample the painted region and report what dominates it.
Frequency in source is not prominence on screen. A border colour declared in forty rules loses to an accent painted across a fifth of the viewport. Roles come from rendered area and position.
The stack is a wish list, not the result. A declared family means nothing if the file fails to load or the glyphs fall through. We report the face that rendered, with the fallback that actually resolved.
Every extraction reports how sure it is, per field, and names the fields it could not resolve. Set a floor in your own code and fall back to your defaults below it, rather than shipping a guess to your customer.
$ curl https://api.extractbrand.com/v1/brands/helio.com \
-H "Authorization: Bearer eb_live_..."
{
"object": "brand",
"domain": "helio.com",
"cache_status": "hit",
"extracted_at": "2026-07-30T09:14:22.104Z",
"expires_at": "2026-08-29T09:14:22.104Z",
"brand": {
"name": "Helio",
"tagline": "Power that follows the sun",
"positioning_statement": "Helio sells rooftop solar to homeowners who …",
"primary": "#f2542d",
"secondary": "#0e1e2b",
"background": "#ffffff",
"text": "#14161a",
"palette": [ { "name": "Ember", "hex": "#f2542d", "role": "accent" }, … ],
"fonts": ["Tiempos", "Inter"],
"typography": {
"heading": { "family": "Tiempos", "availability": "custom-webfont" },
"body": { "family": "Inter", "availability": "google" }
},
"logo": {
"url": "https://helio.com/logo.svg",
"on_dark_url": "https://helio.com/logo-light.svg",
"source": "inline-svg",
"dominant_colors": ["#f2542d"], …
},
"visual_style": { "theme": "light", "corner_style": "rounded", … },
"motion": { "intensity": "subtle", "speed": "moderate", … },
"copywriting": { "cta_style": "imperative — Get, Start, Book", … },
"tone": ["direct", "warm"],
"confidence": 0.94,
"gaps": [],
"schema_version": "v2"
},
"quota": { "used": 128, "limit": 5000, "period_end": "2026-08-01T00:00:00.000Z" }
}A brand read from a clean, well-marked page is not the same result as one pieced together from a page that blocked the render. Both come back; only one says it is sure.
A low score is reported, never hidden and never rounded up. The useful answer to a page we could not read is that we could not read it.
Ask for a work email and the first screen already carries their logo and their colour. Activation moves because the product looks like it was set up for them.
Every account, lead and company record with a real mark instead of two grey initials. One call at write time, cached from then on.
Proposals, invoices and slides that pick up the recipient's brand at render time — colour roles, type and spacing, not just a logo drop.
A generator needs more than a hex triple. Roles, contrast pairs, the faces that actually load and what to substitute when they do not.
A domain nobody has sampled costs us a browser and two model calls. A domain already in the cache costs nothing, so reading it costs you nothing — cached reads are free and unmetered on every tier. Per-read prices land when the meter has enough real extractions behind it to set them from cost rather than from guesswork.
Want the prices when they are set? hello@extractbrand.com.
You will know inside one read whether the colours and type match what you would have picked by hand.