Skip to main content
The Ad Context Protocol puts a brand’s identity at https://{domain}/.well-known/brand.json: its names, logos, colors, fonts and voice, for ad tech and agents. Artbucket reads that file to start a brand, and writes it for every public brand on BrandHub (/{org}/{brand}/brand.json).

Make a brand from a domain

In the app: New brand, Build it in the builder, From a domain, type the domain and Look it up. It shows what it found, each brand of a house with its colors, faces and logos, and what it leaves out; pick one and Create brand. Over the API:
POST /api/v1/brands takes domain, or the document itself as brandJson (then domain, if given, says where it came from), with brand to pick one of a house’s brands by its AdCP id (the one at domain, or the only one, when left out), and name and slug to override the document’s. MCP’s create_brand takes the same. The file is read as the protocol says: over https only, from public hosts, at most 512 KB and 20 seconds, redirected only to the domain’s exact www twin and back. An Authoritative Location Redirect is followed once, exactly, and a House Portfolio’s brand_refs are read at their own domains, ten at most. What becomes what, the export’s mapping run backwards: Localized fields (AdCP 3.2’s default_language, tone.*, an asset’s name and description) are read in English, else in the document’s default_language, else as their plain value; never whichever translation comes first. A localized list is taken whole. Names, which have no plain value, fall back to the first when none is in either language. What has no place in the rules (keller_type, properties, trademarks, photography, motion…) is left out and listed in the answer’s dropped; a logo or font file that won’t fetch is left out and listed in skipped, rather than refusing the brand.

A brand’s domain

A brand made from a brand.json keeps its domain: the document’s own url, else its primary website, else the domain it was read from (lower-cased, without www). A brand made from a template keeps the template brand’s (firefox.com, rust-lang.org, blender.org). Any brand’s can be set or cleared on its Settings tab, under Name and address, or with PATCH /api/v1/brands/{slug} and {"domain": "acme.com"}. Its BrandHub listing shows it, index.json lists it, and its brand.json gives it as url. A domain names a brand, it proves nothing: several brands, in several organizations, may name the same one, and only a domain the organization verified shows as verified. Whoever proves a listing’s domain can claim it: see Claim by domain.

Your domain points at BrandHub

A public brand’s brand.json on BrandHub is a Brand Canonical Document. To have agents that read your domain find it, the Sharing tab gives the one file to host at https://{domain}/.well-known/brand.json, an Authoritative Location Redirect:
A domain the organization verified, serving this app or one of its portals, answers /.well-known/brand.json itself: with that redirect to its brand on BrandHub (on a portal’s domain, a brand the portal shows), the one whose domain the host proves, else its only public brand, else its default one; with several public brands and none of those, a House Portfolio of them all, inline. Any other host answers 404.