---
title: "Autopilot approval policy"
method: POST
path: "/api/v1/set_autopilot_policy"
tags: ["write"]
---

# Autopilot approval policy

`POST /api/v1/set_autopilot_policy`

## Request

- Base URL: `https://awraiter.ai`
- URL: `https://awraiter.ai/api/v1/set_autopilot_policy`
- Auth: HTTP bearer

Change a channel's autopilot approval policy (the rule that decides whether an agent draft for a plan slot is scheduled automatically or waits for a human). autopilotPolicy: manual (every draft waits for approval), streak (automatic once the channel has config.streakTarget consecutive approved agent posts), auto (automatic right away). config is a partial object merged onto the stored config; pass null to reset it to defaults. Keys: streakTarget (3–20), autoPostTypes (subset of common | news), quietHours ({ from: "HH:mm", to: "HH:mm" } in the plan's time zone, or null), dailyAutoLimit (1–50 or null = no limit). Guardrails (recommendation review/revise, banlist hits, paused generation) always send a draft to approval regardless of the mode. Requires the team owner or a role allowed to manage agent jobs; returns the effective policy and changed=false when nothing differed.

## Headers

- `Idempotency-Key` string

## Request body

- SetAutopilotPolicyInput
  - `channelId` number, required
  - `autopilotPolicy` 'manual' | 'streak' | 'auto'
  - `config` object, nullable
    - `streakTarget` integer
    - `autoPostTypes` string[]
    - `quietHours` object, nullable
      - `from` string, required
      - `to` string, required
    - `dailyAutoLimit` integer, nullable

## Response `200`

The tool's result in `data`.

- SetAutopilotPolicyOutput
  - `ok` unknown, required
  - `data` object, required: Not declared by the tool yet; treat the shape as informational.
  - `usage` Usage: Remaining paid AI actions for the team. Present only on tools that cost AI quota.
    - `aiActionsRemaining` integer, required: -1 when the team is unlimited.
    - `aiActionsLimit` integer, required: -1 when the team is unlimited.
    - `unlimited` boolean, required

## Other responses

- `400`: Invalid arguments (`invalid_input`, with per-field `details`) or a missing `channelId` (`channel_id_required`).
- `401`: No or unknown token (`unauthorized`). The `WWW-Authenticate` header points at the OAuth resource metadata.
- `402`: The team has no active subscription (`subscription_required`).
- `403`: Read-only token on a write tool (`read_only_token`), channel outside the team or the member's ACL (`channel_not_accessible`), channel over the plan limit (`channel_over_plan_limit`), or the user left the team (`not_team_member`).
- `404`: Unknown tool (`unknown_tool`) or an entity the tool could not find (`*_not_found`).
- `409`: The same call is already running (`duplicate_in_flight`); wait instead of retrying.
- `422`: The request was understood but cannot be executed — any other domain error code.
- `428`: The tool needs confirmation before it acts; repeat the call with `confirmationToken`.
- `429`: Rate limit (`rate_limited`, see `Retry-After`), AI quota (`ai_quota_exhausted`) or the daily agent-job budget (`agent_budget_exhausted`).
- `500`: The tool failed unexpectedly (`tool_error`). Nothing internal is disclosed; the `X-Request-Id` header identifies the call for support.

---

[API](https://skmtc.dev/awraiter/apis/awraiter-rest-v1.md) · [All operations](https://skmtc.dev/awraiter/apis/awraiter-rest-v1/llms.txt) · [OpenAPI document](https://skmtc.dev/awraiter/apis/awraiter-rest-v1/revisions/c16dace566cf?raw)
