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

# Update advertiser

> Change an advertiser's editable settings or caps

`PUT /api/v2/buyer/advertisers/{advertiserId}`

Updates an existing advertiser through the raw v2 API. All body fields are optional — send only what you want to change. Brand domain, country scope, currency, and reporting time zone can change only before the first campaign or seller-account binding. `sandbox` is fixed at creation.

Buyer-owned labels are managed separately through V3 MCP `save_advertiser`,
not this REST endpoint. See [Dimensions and labels](/v2/object-guides/dimension).

## Request

```bash curl theme={null}
curl -X PUT https://api.apostra.com/api/v2/buyer/advertisers/12345 \
  -H "Authorization: Bearer $SCOPE3_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acme Corporation",
    "channels": ["display", "olv", "ctv"],
    "optimizationApplyMode": "AUTO",
    "frequencyCaps": [
      { "max_impressions": 5, "window": { "interval": 7, "unit": "days" } }
    ]
  }'
```

## Parameters

| Field                      | Type          | Required | Notes                                                                                                                                                                                     |
| -------------------------- | ------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `advertiserId`             | string (path) | Yes      | Unique identifier for the advertiser                                                                                                                                                      |
| `name`                     | string        | No       | Updated name (1–255 chars)                                                                                                                                                                |
| `description`              | string        | No       | Updated description (max 1000 chars)                                                                                                                                                      |
| `brand`                    | string        | No       | Brand domain. Can be re-keyed only before the first campaign or seller-account binding                                                                                                    |
| `brandCountries`           | array         | No       | BrandKey country scope. Can be re-keyed only before the first campaign or seller-account binding                                                                                          |
| `optimizationApplyMode`    | enum          | No       | `AUTO` or `MANUAL`                                                                                                                                                                        |
| `primaryCurrency`          | string        | No       | ISO 4217 currency. Can be re-keyed only before the first campaign or seller-account binding                                                                                               |
| `preferredTimezone`        | string        | No       | Preferred IANA Reporting time zone. Seller-effective time zones can differ; changeable until the first campaign or seller-account binding                                                 |
| `channels`                 | array         | No       | **Replaces** the editable AdCP channel preferences. Pass `[]` to clear. This does not change seller qualification                                                                         |
| `linkedAccounts`           | array         | No       | Accounts to **add**. Existing links are not removed. Each item may include `credentialId` from list available accounts to disambiguate duplicate account IDs across connected credentials |
| `utmConfig`                | array         | No       | **Replaces** all advertiser-level UTM params. Pass `[]` to clear                                                                                                                          |
| `dataDelivery`             | object        | No       | Data-delivery configuration. Omit to leave existing config untouched                                                                                                                      |
| `dataDelivery.credentials` | array         | No       | **Replaces** all existing live credentials. Pass `[]` to archive all                                                                                                                      |
| `dataDelivery.outputs`     | array         | No       | **Replaces** all existing advertiser-scoped Data Delivery Outputs. Pass `[]` to clear                                                                                                     |
| `frequencyCaps`            | array         | No       | **Replaces** all existing non-archived caps. Pass `[]` to clear; omit to leave untouched                                                                                                  |

## Response

```json theme={null}
{
  "id": "12345",
  "name": "Acme Corporation",
  "description": null,
  "status": "ACTIVE",
  "sandbox": false,
  "optimizationApplyMode": "AUTO",
  "primaryCurrency": "USD",
  "brandCountries": ["DE", "NL"],
  "preferredTimezone": "Europe/Amsterdam",
  "currencyLocked": true,
  "reportingTimezoneLocked": true,
  "channels": ["display", "olv", "ctv"],
  "createdAt": "2025-01-15T10:30:00Z",
  "updatedAt": "2025-01-20T14:45:00Z",
  "brand": "acme.com",
  "linkedAccounts": [],
  "utmConfig": [],
  "frequencyCaps": []
}
```

Returns the full advertiser resource with the applied changes.

<Warning>
  `linkedAccounts` is additive (existing links stay), but `utmConfig` and `frequencyCaps` **replace** their entire existing set. Pass an empty array to clear, or omit the field to leave it untouched.
</Warning>

<Note>
  If a legacy advertiser has no settings row and its terminal (completed, cancelled, or archived) campaign history spans currencies, include `primaryCurrency` with the intended currency when you add its brand. The value must match one of the historical campaign currencies. Active campaigns and currently linked seller accounts remain authoritative and still block conflicting currency choices; do not create a duplicate advertiser to bypass that conflict.
</Note>

## Errors

* `400 VALIDATION_ERROR` — invalid field value.
* `409 CONFLICT` — brand domain, country scope, currency, or reporting time zone is changed after the first campaign or seller-account binding, or legacy currency evidence cannot be resolved safely.
* `404 NOT_FOUND` — `advertiserId` does not exist or is not visible to the authenticated account.

See [Errors](/v2/reference/errors) for the full error contract.

<Note>
  The canonical UI keeps brand, country scope, and currency out of the edit form. Create another advertiser from the UI when those identity values must differ.
</Note>

## Related

<CardGroup cols={2}>
  <Card title="Advertiser tasks" href="/v2/buyer/advertisers/tasks" icon="list-check">
    All advertiser operations
  </Card>

  <Card title="Advertiser overview" href="/v2/object-guides/advertiser" icon="user-tie">
    Fields, lifecycle, and concepts
  </Card>

  <Card title="Get advertiser" href="/v2/buyer/advertisers/tasks/get-advertiser" icon="magnifying-glass">
    Read the current state first
  </Card>

  <Card title="Delete advertiser" href="/v2/buyer/advertisers/tasks/delete-advertiser" icon="trash">
    Archive when done
  </Card>
</CardGroup>
