---
title: "Turn a playbook's auto-approve on or off"
method: POST
path: "/campaigns/{id}/auto-approve"
tags: ["Playbooks", "Human only"]
---

# Turn a playbook's auto-approve on or off

`POST /campaigns/{id}/auto-approve`

## Request

- Base URL: `https://gtmswag.com/api/v1`
- URL: `https://gtmswag.com/api/v1/campaigns/{id}/auto-approve`
- Auth: API key in cookie `gtm_session`

Human only: A signed-in owner or admin does this in the browser at gtmswag.com. API keys and OAuth connections receive 403 HUMAN_APPROVAL_REQUIRED with a `url` to hand to that person. Keys and connections read the rule as `autoApprove` on the campaign. Turning it on, or raising `perGiftMaxCents` or `monthlyBudgetCents`, needs an owner or admin (403 TEAM_MANAGER_REQUIRED), who becomes the person auto-approvals act for; any teammate may lower the limits or turn it off. Turning it on needs a per-gift limit and a monthly budget (400 MONTHLY_BUDGET_REQUIRED) with the limit within the budget. The playbook keeps its status; its `policyVersion` increases.

## Path parameters

- `id` string, required

## Request body

- object
  - `enabled` boolean, required: true turns auto-approve on; false turns it off.
  - `perGiftMaxCents` integer: Largest gift (price plus shipping, USD cents) approved without a person, 100 to 100000.
  - `monthlyBudgetCents` integer: The playbook's monthly spend limit in USD cents; required to turn auto-approve on.
  - `expectedPolicyVersion` integer: The playbook's current policyVersion; a stale value returns POLICY_CHANGED.

## Response `200`

Success: `{"data": Campaign}`.

- CampaignResponse: The success body: `{"data": Campaign}`.
  - `data` Campaign, required: A playbook (`mode:"always_on"`) or a batch or single campaign, with its roster, limits and `policyVersion`.
    - `id` string, required
    - `status` 'draft' | 'active' | 'paused' | 'completed', required
    - `mode` 'always_on' | 'batch' | 'single', required
    - `monthlyBudgetCents` integer
    - `autoApprove` AutoApprovePolicy: Auto-approve rule a signed-in owner or admin set in the web app. While enabled, a person added to this active playbook whose gift fits perGiftMaxCents, monthlyBudgetCents and the balance is approved and paid from the balance on enabledBy's behalf. Read-only through keys and connections.
      - `enabled` boolean, required
      - `perGiftMaxCents` integer, required
      - `enabledBy` string
      - `enabledAt` string
    - `policyVersion` integer, required
    - `recipients` Recipient[], required
      - `recipientId` string, required
      - `name` string, required
      - `email` string, required
      - `company` string, required
      - `sourceSystem` string
      - `externalId` string
      - `profileUrl` string
      - `importId` string
      - `importRowId` string
      - `addressMode` 'known' | 'confirm'

## Other responses

- `400`: Bad request: `VALIDATION_ERROR`, `MONTHLY_BUDGET_REQUIRED`, `INVALID_JSON`. Each example says when.
- `401`: Not authenticated: `AUTH_REQUIRED`. no credentials, or an OAuth token on a route that only takes workspace keys; the key is malformed, unknown or revoked.
- `403`: Forbidden: `HUMAN_APPROVAL_REQUIRED`, `TEAM_MANAGER_REQUIRED`. Each example says when.
- `404`: Not found: `NOT_FOUND`. Each example says when.
- `409`: Conflict: `NOT_ALWAYS_ON`, `POLICY_CHANGED`. Each example says when.
- `413`: Request too large: `INVALID_REQUEST`. the body exceeds 1 MiB.
- `415`: Unsupported media type: `INVALID_REQUEST`. a write with a body that is not `Content-Type: application/json` (a key request with no body needs no Content-Type).
- `429`: Too many requests: `RATE_LIMIT`. more than 240 requests in the current minute for this workspace (REST and MCP share the limit); wait `retryAfterMs`.
- `default`: Any other refusal or failure, such as 403 CSRF (a cross-origin `Origin` header), 403 HTTPS_REQUIRED or 500 INTERNAL_ERROR, with what to do next.

---

[API](https://skmtc.dev/gtmswag/apis/gtm-swag-api.md) · [All operations](https://skmtc.dev/gtmswag/apis/gtm-swag-api/llms.txt) · [OpenAPI document](https://skmtc.dev/gtmswag/apis/gtm-swag-api/revisions/9ff86fa99afe?raw)
