POST /v1/brand/retrieve. Hermai returns cached data when it has a recent profile, and starts a new extraction when it does not.
Retrieve a brand profile
Send exactly one ofdomain or email.
email, Hermai keeps only the domain. It never stores or forwards the mailbox local part.
Request body
Response
stripe.com. Response shown trimmed for length; a live call returns more logos, colors, socials, and links than shown here.
Top level fields
Field provenance
Every field inbrand carries where Hermai found it:
origin is one of:
There is no confidence score on any field. Use
origin and source to judge how much to trust a value.
Description
description is the company’s own self authored summary, not a Hermai generated summary. Hermai checks sources in this priority order and uses the first one that passes:
- A JSON-LD
Organizationdescription, only when the JSON-LD confirms the organization belongs to the requested domain. An unconfirmed JSON-LD organization description is dropped, not used as a fallback. - The
og:descriptionmeta tag. - The plain
<meta name="description">tag.
description is absent.
A real example, from stripe.com:
Status values
Cold lookups and polling
A domain Hermai has a fresh profile for returns immediately withstatus set to ok, partial, or one of the other terminal values.
A domain Hermai has not extracted recently starts a new extraction. If it does not finish within wait_ms, POST /v1/brand/retrieve returns HTTP 202 with status set to pending:
pending.poll_after_ms, then call POST /v1/brand/poll with the token:
202 and status: pending. A token stays valid for 5 minutes. Once extraction finishes, poll returns HTTP 200 with the finished profile.
Polling itself is free. The first terminal delivery, whether from retrieve or from poll, bills under the normal rule below.
Applying the theme
application_theme gives you ready made tokens for styling your product with this company’s branding, so you do not have to rank logos or pick an accent color yourself.
Each identity slot carries
asset (a logo, or null), show_company_name (whether to also render the company name next to the asset), and fallback (what to show when asset is null, such as monogram or asset_with_company_name).
Billing
A successful profile bills one ordinary Hermai credit, the same credit pool as every other Hermai endpoint. Hermai bills whenstatus is ok or partial and the profile has at least one of: a name, a logo, or a color. A partial result that only carries a description, a social profile, or a link, with no name, logo, or color, does not bill.
Pending results and failed lookups never bill.
Rate limits
Brand endpoints apply three limits on top of each other. Warm requests, served from a recent cached profile, only count against the first two. Cold requests, which start a new extraction, count against all three. Standard per key rate limit, shared with every other Hermai endpoint:
Brand specific workspace limit, shared by every key in your workspace:
Cold extraction limit, applied only to lookups that start a new extraction:
Any of the three returns HTTP
429 when exceeded.
Anonymous brand demo
POST /v1/brand/demo runs a brand lookup without an API key and without spending credits. It takes a domain only and returns a smaller public projection: status, domain, and brand.name, brand.description, brand.logos, brand.colors. It never returns socials, links, or usage.
202 with status: pending and a poll_after_ms hint. Repost the same domain after that delay. There is no poll token on the demo endpoint.
The demo endpoint applies its own limits, separate from the authenticated limits above:
Each of these returns HTTP
429 with a Retry-After header.
Errors
Errors use the standard API envelope:retry_after is present only on rate limit errors, in seconds. It is absent on every other error.
A
5xx response, such as BRAND_RESPONSE_INVALID, means Hermai failed on its own side. Retry the request.