Brand API endpoint
Returns a brand profile for a domain (title, description, brand colors as hex, logos and icons ranked best-first, backdrops, socials, links, and any schema.org organization data). Enrichment-only fields that are not present in the page markup are returned as null.
/brand/retrieveFetches a domain's homepage and returns a brand profile extracted from its HTML and Web App Manifest: title, description, slogan, brand colors, logos and icons, backdrop images, social media profiles, footer links, and any schema.org organization data (address, stock ticker, contact details).
Extraction details: title prefers the site name (og:site_name, schema.org organization name, app name) and otherwise trims a <title> like Brand — Tagline down to the brand. Description prefers OpenGraph, then Twitter card, then standard meta, then schema.org, then the manifest. Colors are validated and normalized to lowercase #rrggbb hex (3-digit, #rrggbbaa, rgb()/rgba(), and common CSS color names are accepted; unrecognized values are dropped), gathered from theme-color, msapplication-TileColor, mask-icon, and the manifest's theme_color/background_color. Logos list the declared brand mark first, then icons ranked best-first by format and size (favoring large PNG/SVG and apple/android touch icons), including manifest icons; icon resolutions are read from the sizes attribute or the URL. Backdrops are collected from og:image (including :secure_url/:url), twitter:image, and itemprop="image".
Query parameters: domain is required and accepts a bare domain, a host with www., or a full URL (context.dev, www.context.dev, https://context.dev/path). maxSpeed is optional; when true it skips schema.org, Web App Manifest, and footer-link extraction for a faster, less comprehensive result. maxAgeMs is optional and sets the cache freshness window in milliseconds, clamped between one day and one year. timeoutMS is optional and sets the upstream fetch timeout in milliseconds, clamped between 1000 and 300000. force_language is accepted for compatibility but is not applied in HTML-only mode.
Response behavior: the response mirrors the brand schema. Core fields are always present; optional and enrichment fields that cannot be derived from page markup — such as per-image colors/resolution/mode, color names, industry classification, and address/stock data when absent — are omitted rather than emitted as empty values. The links.* entries are emitted as explicit null when not found, matching context.dev. An invalid or missing domain returns 400. Block pages, malformed upstream responses, and transport failures return 503.
| Field | Filled in, of 6 checked | Values in the sample |
|---|---|---|
| url | 6 | context.dev |
| type | 6 | icon (5), logo (1) |
| resolution | 3 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| domain | string | Yes | Domain to retrieve brand data for, e.g. context.dev | context.dev | |
| force_language | string | No | Accepted for compatibility; not applied in HTML-only mode | ||
| maxSpeed | boolean | No | Optimize for speed by skipping schema.org and footer-link extraction | ||
| maxAgeMs | integer | No | Cache freshness window in milliseconds, clamps to 1 day..1 year | ||
| timeoutMS | integer | No | Upstream fetch timeout in milliseconds, clamps to 1000..300000 | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/brand/retrieve?domain=context.dev&maxSpeed=true" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"domain": "context.dev",
"title": "Context",
"description": "Brand intelligence for the modern web.",
"slogan": "Know every brand.",
"colors": [
{
"hex": "#0b0b0b"
}
],
"logos": [
{
"url": "https://cdn.context.dev/logo.png",
"type": "logo"
},
{
"url": "https://context.dev/favicon.ico",
"resolution": {
"width": 32,
"height": 32,
"aspect_ratio": 1
},
"type": "icon"
}
],
"backdrops": [
{
"url": "https://cdn.context.dev/og.png"
}
],
"socials": [
{
"type": "x",
"url": "https://x.com/context"
},
{
"type": "linkedin",
"url": "https://www.linkedin.com/company/context"
}
],
"address": {
"street": "1 Market St",
"city": "San Francisco",
"country": "US",
"state_province": "CA",
"postal_code": "94105"
},
"stock": {
"ticker": "CTXT",
"exchange": "NASDAQ"
},
"is_nsfw": false,
"email": "hello@context.dev",
"phone": "+1-555-0100",
"links": {
"careers": "https://context.dev/careers",
"privacy": "https://context.dev/legal/privacy",
"terms": "https://context.dev/terms",
"contact": "https://context.dev/contact",
"blog": "https://context.dev/blog",
"pricing": "https://context.dev/pricing"
},
"primary_language": "en",
"source": {
"type": "html",
"url": "https://context.dev"
}
}
}Request schema
No body schema
Response schema
#/definitions/brand.retrieveResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | brand.BrandResponse | No | ||||
| data.address | object | No | Postal address of the brand. Omitted when the site gives none. | |||
| data.address.city | string | No | City of the brand's office. | |||
| data.address.country | string | No | Country of the brand's office. | |||
| data.address.country_code | string | No | Country code of the brand's office. | |||
| data.address.postal_code | string | No | Postal code of the brand's office. | |||
| data.address.state_code | string | No | State or province code of the brand's office. | |||
| data.address.state_province | string | No | State or province of the brand's office. | |||
| data.address.street | string | No | Street address of the brand's office. | |||
| data.backdrops | array | No | Large images that represent the brand, such as the social sharing image. | |||
| data.backdrops[].colors | array | No | Dominant colors of the backdrop image. Not currently returned. | |||
| data.backdrops[].colors[].hex | string | No | #0b0b0b | Color as a lowercase hex code, for example `#0b0b0b`. | ||
| data.backdrops[].colors[].name | string | No | Name of the color. Not currently returned. | |||
| data.backdrops[].resolution | object | No | Pixel size and aspect ratio of the backdrop image. Not currently returned. | |||
| data.backdrops[].resolution.aspect_ratio | number | No | 1 | Width divided by height. | ||
| data.backdrops[].resolution.height | integer | No | 512 | Height of the image in pixels. | ||
| data.backdrops[].resolution.width | integer | No | 512 | Width of the image in pixels. | ||
| data.backdrops[].url | string | No | URL of the backdrop image. | |||
| data.colors | array | No | Brand colors found on the site, each as a hex code. | |||
| data.colors[].hex | string | No | #0b0b0b | Color as a lowercase hex code, for example `#0b0b0b`. | ||
| data.colors[].name | string | No | Name of the color. Not currently returned. | |||
| data.description | string | No | Brand intelligence for the modern web. | Short description of the brand, taken from the site. | ||
| data.domain | string | No | context.dev | Domain that was profiled, without `www.` or path. | ||
| data.email | string | No | Contact email the site lists. Omitted when none is found. | |||
| data.industries | object | No | Industry classification of the brand. Not currently returned. | |||
| data.industries.eic | array | No | Industry and sub-industry classifications of the brand. | |||
| data.industries.eic[].industry | string | No | Industry the brand belongs to. | |||
| data.industries.eic[].subindustry | string | No | More specific sub-industry within that industry. | |||
| data.is_nsfw | boolean | No | false | Always `false`; adult-content detection is not performed. | ||
| data.links | object | No | Links to the site's careers, privacy, terms, contact, blog and pricing pages. | |||
| data.links.blog | string | No | URL of the brand's blog. `null` when no matching link is found. | |||
| data.links.careers | string | No | URL of the brand's careers page. `null` when no matching link is found. | |||
| data.links.contact | string | No | URL of the brand's contact page. `null` when no matching link is found. | |||
| data.links.pricing | string | No | URL of the brand's pricing page. `null` when no matching link is found. | |||
| data.links.privacy | string | No | URL of the brand's privacy policy. `null` when no matching link is found. | |||
| data.links.terms | string | No | URL of the brand's terms page. `null` when no matching link is found. | |||
| data.logos | array | No | Logos and icons of the brand, with the declared brand mark first. | |||
| data.logos[].colors | array | No | Dominant colors of the logo image. Not currently returned. | |||
| data.logos[].colors[].hex | string | No | #0b0b0b | Color as a lowercase hex code, for example `#0b0b0b`. | ||
| data.logos[].colors[].name | string | No | Name of the color. Not currently returned. | |||
| data.logos[].mode | string | No | Display mode the logo variant is meant for. Not currently returned. | |||
| data.logos[].resolution | object | No | Pixel size and aspect ratio of the logo image. Omitted when not known. | |||
| data.logos[].resolution.aspect_ratio | number | No | 1 | Width divided by height. | ||
| data.logos[].resolution.height | integer | No | 512 | Height of the image in pixels. | ||
| data.logos[].resolution.width | integer | No | 512 | Width of the image in pixels. | ||
| data.logos[].theme | string | No | Theme is the intended background for the candidate. It stays separate from the established Mode response field. | |||
| data.logos[].type | string | No | icon | Kind of image: `logo` for the declared brand mark or `icon` for a site icon. | ||
| data.logos[].url | string | No | https://context.dev/favicon.ico | URL of the logo or icon image. | ||
| data.phone | string | No | Contact phone number the site lists. Omitted when none is found. | |||
| data.primary_language | string | No | en | Primary language of the site, as a language code such as `en`. Omitted when unknown. | ||
| data.slogan | string | No | Tagline or slogan of the brand. Omitted when the site gives none. | |||
| data.socials | array | No | Social media profiles the site links to. | |||
| data.socials[].type | string | No | x | Social network the profile is on, for example `x` or `linkedin`. | ||
| data.socials[].url | string | No | https://x.com/context | URL of the social media profile. | ||
| data.source | object | No | Page the profile was built from. | |||
| data.source.type | string | No | html | Kind of source the profile was built from, for example `html`. | ||
| data.source.url | string | No | https://context.dev | URL of the page the profile was built from, after any redirect. | ||
| data.stock | object | No | Stock listing of the brand. Omitted when the site gives none. | |||
| data.stock.exchange | string | No | NASDAQ | Stock exchange the brand is listed on, for example `NASDAQ`. | ||
| data.stock.ticker | string | No | NVDA | Stock ticker symbol of the brand, for example `NVDA`. | ||
| data.title | string | No | Context | Brand name, preferring the site name over the page title. | ||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 408 | Request Timeout | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/brand/retrieve?domain=context.dev&maxSpeed=true" \
-H "x-api-key: $CRAWLORA_API_KEY"