---
title: "Update campaign settings"
method: POST
path: "/api/v1/experience/campaign-settings/update"
tags: ["experience"]
---

# Update campaign settings

`POST /api/v1/experience/campaign-settings/update`

## Request

- Base URL: `https://point11.ai`
- URL: `https://point11.ai/api/v1/experience/campaign-settings/update`
- Auth: OAuth 2 (authorization code, authorization URL `https://auth.point11.ai/oauth2/authorize`, token URL `https://auth.point11.ai/oauth2/token`)

Save an Experience campaign's settings in place, all or nothing: its name, devices and customers, from the next cycle planned; results continue on the same campaign and take in the change over its next 30 days. Every new cycle uses each customer's newest version, so customerVersionPolicy latest changes nothing and pinned is refused. Its websites, pages, platform, access and mode never change, and an always-on campaign has no schedule to change: each listed customer shops once every UTC month. Nothing is charged at Save: delivered visits accrue against the plan. Pass expectedSettingsRevision from experience_campaign_settings_get; a Save whose settings moved since is refused (STALE_WRITE). Pass reviewedEstimate from experience_campaign_settings_quotes_get to also refuse one whose estimate moved, or null to save at the current estimate. A person confirms it.

## Headers

- `Point11-Organization` string, uuid
- `Idempotency-Key` string, uuid, required
- `Point11-Confirm` 'true', required

## Request body

- ExperienceCampaignSettingsUpdateRequest
  - `campaignId` string, uuid, required: The campaign's id.
  - `expectedSettingsRevision` integer, required: The settingsRevision the settings read (or a quote) returned.
  - `reviewedEstimate` object, nullable, required: The estimate a quote returned (its reviewedEstimate): the Save is refused if it moved. Null saves at the current estimate.
    - `monthlyAfter` integer, required
    - `unitPriceCents` integer, nullable, required
    - `oneTimeAmountCents` integer, nullable, required
  - `changes` object, required
    - `name` string: The campaign's new name.
    - `browserDevices` string[]: The devices each next cycle visits on: the whole set, at least one.
    - `agents` string[]: The agents that shop every next cycle, each on every customer, page and device: the whole set, at least one. point11 is Point11's own shopper; the others run the model their vendor's agent most likely uses, in Point11's browser. An added agent starts with the next cycle; a cycle already planned keeps its agents. A Mirror (Pulse) shops with point11 alone.
    - `addCustomerIds` string[]: Customers the next cycles also visit with.
    - `removeCustomerIds` string[]: Customers taken off the list: they stop at once, even in a cycle already planned, and their past visits stay.
    - `customerVersionPolicy` 'pinned' | 'latest': Every new cycle uses each customer's newest version, so `latest` changes nothing. `pinned` is no longer a choice: 409 PRECONDITION_FAILED, details.reason invalid_change, details.field customerVersionPolicy.

## Response `200`

Success.

- ExperienceCampaignSettingsUpdateResponse
  - `campaignId` string, uuid, required
  - `changed` boolean, required: False when the Save asked for the settings the campaign has.
  - `settingsRevision` integer, required: The campaign's revision now.
  - `changes` DiscoveryItem[], required: What changed and when each starts.
    - `field` string, required: The setting this change moves, in the product's own word (engines, customers…).
    - `summary` string, required: The change and when it starts, in plain words.
    - `starts` 'now' | 'next_run' | 'next_cycle' | 'next_admission_day' | 'when_ready', required: When the change takes effect.
    - `startsAt` string, date-time, nullable, required: The instant it takes effect when known; null when it waits on setup.

## Other responses

- `400`: The input, query, or Idempotency-Key is invalid.
- `401`: The bearer is missing, expired, or not accepted.
- `402`: Billing refused the write: the code names the reason and `details.reason` carries it.
- `403`: The credential lacks the operation's scope or role, or the operation needs a different door.
- `404`: The resource or organization does not exist for this caller.
- `405`: This path takes another HTTP method, named in `Allow`.
- `409`: The request conflicts with current state or with prior use of its Idempotency-Key.
- `413`: The request, or the answer it asks for, is too large; narrow it.
- `429`: The credential's rate budget is spent; retry after `Retry-After` seconds.
- `500`: An unexpected server failure; retry later. Only `request_id` identifies it.
- `503`: A dependency is temporarily unavailable; retry after `Retry-After` seconds.
- `default`: Another status a product answers for its own refusal (for example `415` for an unsupported attachment); branch on `code`.

---

[API](https://skmtc.dev/point11/apis/point11-api.md) · [All operations](https://skmtc.dev/point11/apis/point11-api/llms.txt) · [OpenAPI document](https://skmtc.dev/point11/apis/point11-api/revisions/36a84c7aca11?raw)
