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

# Update campaign settings

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

## Request

- Base URL: `https://point11.ai`
- URL: `https://point11.ai/api/v1/research/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 a Research campaign's settings in place, all or nothing: its name, interview count, audience, schedule and study, from the next admission day; results continue on the same campaign, where an edited question starts fresh from its first answer after the change and every unchanged question keeps its history. Whom it interviews (its profile's customers or its stores') never changes. Nothing is charged at Save: delivered interviews accrue against the plan. Pass expectedSettingsRevision from research_campaign_settings_get_v4; a Save whose settings moved since is refused (STALE_WRITE). Pass reviewedEstimate from research_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

- ResearchCampaignSettingsUpdateRequest
  - `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.
    - `targetInterviewCount` integer: Interviews each period takes, one per customer: raising it adds the next eligible customers in the study's own sampling order, lowering it removes the newest joined first (named in the quote's customersLeaving) and cancels their interviews not yet started.
    - `audience` 'all' | 'groups': Whom customers added later are drawn from: every eligible customer (all) or members of targetedGroupIds (groups). The current customers stay.
    - `targetedGroupIds` string[]: The audiences, with audience groups.
    - `frequency` 'weekly' | 'monthly': The period a repeating study interviews each customer once in; a new period starts at the next admission day.
    - `study` ResearchCampaignSettingsStudy: The study as it runs from the next admission day; results count an edited question's answers from its edit, and every unchanged question keeps its history.
      - `stimulus` object, required: The study's material, in its author's words.
        - `version` 'research-stimulus.v1', required
        - `kind` 'custom', required
        - `title` string
        - `content` string, required
        - `assetRefs` string[]
        - `private` true
      - `questions` ResearchQuestionsItem[], required: The whole edited instrument.
        - union
          - object
            - `id` string, required
            - `title` string, required
            - `prompt` string, required
            - `flow` union
              - …
            - `attachment` object
              - …
            - `stimulusItemId` string
            - `blind` true
            - `shape` 'open_ended', required
          - object
            - `id` string, required
            - `title` string, required
            - `prompt` string, required
            - `flow` union
              - …
            - `attachment` object
              - …
            - `stimulusItemId` string
            - `blind` true
            - `shape` 'closed_ended' | 'multi_select' | 'rank' | 'matrix' | 'scale', required
            - `options` string[], required
            - `maxSelections` integer
            - `unaided` true
          - object
            - `id` string, required
            - `title` string, required
            - `prompt` string, required
            - `flow` union
              - …
            - `attachment` object
              - …
            - `stimulusItemId` string
            - `blind` true
            - `shape` 'computer_task', required
            - `targets` union[], required
              - …
            - `successCriteria` string, required
      - `assumptions` string[]: The study's customer assumptions, in order, each screened whole as a launch screens them. Absent keeps the ones the study states; empty removes them.

## Response `200`

Success.

- ResearchCampaignSettingsUpdateResponse
  - `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)
