---
title: "Create or update advertiser — put"
type: reference
method: PUT
path: /rest-api/advertisers/update.do
tag: "Advertisers"
---

# Create or update advertiser — put

`PUT https://YOUR-NETWORK-DOMAIN/rest-api/advertisers/update.do`

Creates a new advertiser when the 'id' request parameter is absent, or updates an existing advertiser when 'id' is provided. Accepts advertiser fields (name, contactName, contactEmail, description, active, categoryId, adomain, selfServeCpmFloorAdjustment) as form parameters. Fields the caller has no enabled permission for are ignored, keeping the stored value: 'adomain' needs ADVERTISER_ADOMAIN, 'active' MANAGE_ADVERTISERS_ACTIVE_STATUS, 'privateField' SET_PRIVATE, 'confirmationDelay', 'preliminaryConfirmationDays' and 'lastConfirmedDate' (yyyy-MM-dd, the date up to which revenue counts as confirmed under the LAST_CONFIRMED_DATE policy; empty clears it) MANAGE_COMPLETENESS_DELAY_INVENTORY, 'selfServeCpmFloorAdjustment' (0-10000) SELF_SERVE_CPM_FLOOR, and 'adsHost' AD_SERVING_DOMAIN_CAMPAIGNS - without it a new advertiser takes the caller's own ad-serving domain. With it, 'adsHost' must be one of the network's ad-serving domains, or blank for the system default. On success, returns a JSON object with {"success":true, "id": advertiserId}. On validation or permission failure, returns {"success":false} with optional error details. When updating, if the active status changes, corresponding activation/deactivation events are fired. If 'enableLimits' is true and the advertiser has no limits yet, an AdvertiserLimit record is created automatically. Parameters that were sent but not applied are listed in 'ignoredFields', each with its reason in 'ignoredFieldReasons'.

## Form params

| Name | Type | Required | Example | Description |
|---|---|---|---|---|
| `id` | integer | no | `1001` | ID of the advertiser to update — omit to create a new advertiser |
| `categoryId` | array<integer> | no | `3` | Advertising category IDs, comma-separated or repeated — replace the advertiser's categories. At least one is required when the ADVERTISER_CATEGORIES_REQUIRED permission is on |
| `actionLimitsEnabled` | boolean | no | `true` | Enable per-action conversion limits |
| `active` | boolean | no | `true` | Set to true to activate or false to deactivate the advertiser. |
| `adomain` | string | no | `acme.com` | Advertiser's own brand domain, published to buyers as the OpenRTB adomain for block-list matching. Not a tracking or redirect domain. |
| `adsHost` | string | no | `ads.example.com` | Custom ad serving domain for this advertiser |
| `confirmationDelay` | string | no | `DEFAULT` | How recent revenue is treated before the advertiser confirms it: DEFAULT — the network's default confirmation status; NONE — always confirmed; LAST_N_DAYS — the last preliminaryConfirmationDays days stay unconfirmed; LAST_CONFIRMED_DATE — everything after the advertiser's last confirmed date stays unconfirmed |
| `contactEmail` | string | no | `john@acme.com` | Contact email address |
| `contactName` | string | no | `John Smith` | Contact person name |
| `description` | string | no | `Premium brand advertiser` | Advertiser description |
| `enablePriceAdjusting` | boolean | no | `false` | Whether price adjustment rules are enabled for this advertiser |
| `enableRules` | boolean | no | `true` | Enable advanced rules engine for this advertiser |
| `enableTargeting` | boolean | no | `true` | Enable targeting rules for this advertiser |
| `lastConfirmedDate` | string | no | `2026-08-31` | Date up to which the advertiser's revenue counts as confirmed under the LAST_CONFIRMED_DATE policy, yyyy-MM-dd; empty clears it. Needs MANAGE_COMPLETENESS_DELAY_INVENTORY |
| `name` | string | no | `Acme Corp` | Advertiser name |
| `operationBetweenRuleTypes` | string | no | `AND` | Logical operator between different targeting rule types (AND, OR) |
| `preliminaryConfirmationDays` | integer | no | `7` | Number of days for preliminary conversion confirmation, 0 to 365 |
| `privateField` | boolean | no | `true` | Mark as private — hidden from marketplace discovery |
| `selfServeCpmFloorAdjustment` | integer | no | `100` | Self-serve CPM floor adjustment percentage (0-10000, where 100 = no adjustment) |
| `enableLimits` | boolean | no | `true` | Set to true to automatically create an AdvertiserLimit record for this advertiser if one does not already exist. Requires MANAGE_CAPPING_AND_LIMITATIONS permission. |

## Responses

- `200` — Advertiser created/updated. Response contains 'id' field.
- `400` — Bad request — invalid or missing parameters
- `401` — Unauthorized — authentication failed or missing credentials
- `403` — Insufficient permissions
- `404` — Advertiser not found or deleted (update only)

## Example request

```bash
curl --request PUT \
  --url 'https://YOUR-NETWORK-DOMAIN/rest-api/advertisers/update.do' \
  --header 'X-Api-Key: YOUR_API_KEY' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'id=1001' \
  --data-urlencode 'name=Acme Corp' \
  --data-urlencode 'active=true' \
  --data-urlencode 'categoryId=3'
```

Source: https://epom.com/ad-server/docs/api/advertisers/put-advertisers-update