One POST with a domain returns a company profile that Context.dev reads from the website of the company. The profile has a description, a slogan, colors with generated names, and logos tagged by the background that they suit. It also has backdrop images, social links, an address and industry codes. It returns no voice, rules or type. The Context.dev Styleguide reads the CSS of the site in a separate call. Until March 2026, Context.dev had the name brand.dev, and its files are still on media.brand.dev.
The request
curl https://api.context.dev/v1/brand/retrieve \
-H "Authorization: Bearer $CONTEXT_DEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{"type": "by_domain", "domain": "linear.app"}'
The same route can also look up a brand by name, email, ticker, page URL or card transaction. maxAgeMs sets the maximum age of a cached copy. By default, the maximum is about three months, and 0 gets a new read. With timeoutOpts, a slow first read can return partial results.
The response
POST /v1/brand/retrieveContext.dev Brand{"status": "ok","brand": {"domain": "linear.app","slogan": "The product development system for teams and agents.","colors": [{ "hex": "#7170ff", "name": "Stargate Shimmer", "source": "site" },1A generated name, not from Linear.{ "hex": "#8c9494", "name": "Millennium Silver", "source": "logo" },2Where Context.dev found the color: the site or the logo.…],"logos": [{"url": "https://media.brand.dev/…svg","mode": "light", "type": "logo",3The background that the logo suits."resolution": { "width": 88, "height": 22 }}, …],"socials": [{ "type": "instagram", "url": "https://instagram.com/popular/linear-app-…" }, …],4A search page, not the account of Linear."industries": { "eic": [{ "subindustry": "Software (B2B)" }, …] }},"cache_metadata": { "status": "hit", "age_ms": 19071504 }5A cached copy, about 5 hours old.}We left out key_metadata because it describes the account of the caller. The full response is in /data.json under responses.context-dev-brand.
What is not in it?
- Voice, rules and positioning are not in it, apart from industry codes.
- Type and component styles are not in it. For these, call the Styleguide.
- The time that the file links stay valid is not in it. The Context.dev docs do not give it.
Empty and failed responses
| Status | What it means | Charged |
|---|---|---|
400 NOT_FOUND |
No match for the domain | No |
400 WEBSITE_BLOCKED and similar |
Context.dev failed to read the site | Not stated |
| 401 | The API key is missing or not valid | No |
402 USAGE_EXCEEDED |
Not enough credits. Older deployments can answer 401 | No |
| 408 | The request timed out | No |
| 422 | The deadline is too short for a domain that is not cached yet | Not stated |
429 RATE_LIMITED |
Rate limit. Wait for Retry-After (1 to 60 seconds) |
No |
Context.dev charges for successful and partial results. The Context.dev pricing FAQ says that calls without enough credits return 401 USAGE_EXCEEDED. The Context.dev billing docs and API reference say 402.
Plans
As of 11 November 2026, Context.dev has a Free plan with a limit of 2 concurrent requests and 10 a minute. Its cheapest paid plan, Developer, is $20 a month. You cannot prefetch a domain on the Free plan. Context.dev's pricing page shows what each plan includes. For the Model Context Protocol (MCP), the Context.dev setup page names no tools. Smithery lists get-brand.
Before you use it
The Context.dev docs say to let users correct uncertain company details. They also say to make sure that addresses and contact details are correct when accuracy is important. The Instagram link above is one reason.
Last updated 11 November 2026