> ## Documentation Index
> Fetch the complete documentation index at: https://docs.semicola.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Advertiser

> The brand you buy for: identity, currency, markets, and the defaults every campaign inherits.

An **advertiser** is the brand a buyer account purchases media for. Campaigns, creatives and delivery
all belong to an advertiser, and its settings are the defaults every campaign starts from.

## Key fields

<ResponseField name="id" type="integer" required>
  Stable numeric id. Tools accept it as a number or an integer string.
</ResponseField>

<ResponseField name="name" type="string" required>
  Display name, for example "Glaze & Co.".
</ResponseField>

<ResponseField name="brandDomain" type="string">
  The brand's domain (for example `glazeandco.test`). Used to resolve the brand card and to identify
  the brand to sellers.
</ResponseField>

<ResponseField name="linkedBrand" type="object">
  The resolved brand card: name, logo, colors, industry, tagline and tone. Semi and the creative
  composer use the tone when writing copy.
</ResponseField>

<ResponseField name="primaryCurrency" type="string" required>
  ISO 4217 code. Every campaign budget uses it. It **locks after the first campaign**, so confirm it
  before creating.
</ResponseField>

<ResponseField name="sandbox" type="boolean" required>
  Sandbox advertisers run the whole loop with simulated delivery and no real spend. Fixed at
  creation.
</ResponseField>

<ResponseField name="brandCountries / channels" type="array">
  Preferred markets (ISO 3166-1 alpha-2) and channels. New campaigns start with these.
</ResponseField>

<ResponseField name="status" type="enum">
  `ACTIVE` or `ARCHIVED`. Archived advertisers can be restored.
</ResponseField>

<ResponseField name="autonomy" type="object">
  Defaults copied into new campaigns: `inventorySelection` and `rebriefing`, each `manual`,
  `propose` or `automatic`. New advertisers start at `manual` for both. Change it with
  `save_advertiser` (`advertiserId` plus `autonomy`). What each mode does is on
  [Autonomy and auto-select](/buy/autonomy-settings); every launch still needs a person's confirmation.
</ResponseField>

<ResponseField name="frequencyCaps" type="array">
  Buyer-side caps for every campaign on the advertiser. Stored, never sent to sellers and not enforced;
  see [Frequency caps](/guides/frequency-caps#buyer-side-caps).
</ResponseField>

<ResponseField name="labels" type="object">
  Values from your account's dimensions, such as `{ "market": ["us"] }`. Set with `save_advertiser`;
  see [Dimensions and labels](/buy/dimensions-and-labels).
</ResponseField>

<ResponseField name="controls" type="object">
  Set once on the advertiser, applied to every buy. Exclusions live in the advertiser's exclude
  [property lists](/buy/property-lists); the older `exclusions` field (a list of publisher website
  domains with an optional `exclusionsListName`) is still honoured alongside them. Both are
  enforced when you buy: products whose
  publisher domain is on the list, or is a subdomain of one, are left out of proposals, and a
  campaign that still has such a product staged won't go live; the error names each conflicting
  product. App and CTV properties without a website domain aren't matched. `brandSafety` is a
  note shown in Controls; it isn't enforced.
</ResponseField>

## Brand lookup

Before creating, preview the brand card without saving anything:

```json save_advertiser theme={null}
{ "resolveBrand": "glazeandco.test" }
```

Semicola checks the AdCP brand registry and the domain's `/.well-known/brand.json`. The preview is
never stored.

The brand card carries:

| Field                                 | Notes                                                                                 |
| ------------------------------------- | ------------------------------------------------------------------------------------- |
| `resolved`                            | `false` when nothing is known about the domain yet; `warning` says what happens next. |
| `brandName`, `tagline`, `industry`    | From the brand's manifest.                                                            |
| `logoUrl`, `logoBackground`, `colors` | The logo (square icons preferred) and brand colors.                                   |
| `manifestUrl`                         | Where the manifest was read (`https://<domain>/.well-known/brand.json`).              |
| `authorizedOperators`, `houseBrand`   | Who may operate the brand, and the house brand it belongs to.                         |

An unknown domain isn't an error: the card says no brand is registered yet, and one is created from the
domain when you save. See [Identity documents](/concepts/identity-documents).

## Create, update, archive

<CodeGroup>
  ```json Create theme={null}
  {
    "name": "Glaze & Co.",
    "brand": "glazeandco.test",
    "primaryCurrency": "USD",
    "sandbox": true,
    "brandCountries": ["US"],
    "idempotencyKey": "glaze-advertiser-create-0001"
  }
  ```

  ```json Archive theme={null}
  { "advertiserIds": [12], "isArchived": true }
  ```
</CodeGroup>

If a required field is missing, `save_advertiser` returns `needs_input` with a question. Check the
exact shapes in the [v3 Tool Catalog](/v3/tool-catalog).

## Not available yet

* Brand fonts, product catalog, disclaimers and contact details on the brand card; saving an enriched
  brand back to the registry; re-resolving the brand of an existing advertiser.
