---
title: "Permanently cancel an internal Telegram campaign"
method: POST
path: "/campaigns/{campaign_id}/cancel"
---

# Permanently cancel an internal Telegram campaign

`POST /campaigns/{campaign_id}/cancel`

## Request

- Base URL: `https://gramclaw.com/api/v1`
- URL: `https://gramclaw.com/api/v1/campaigns/{campaign_id}/cancel`
- Auth: HTTP bearer

Same gates as campaign creation, plus Idempotency-Key. Atomically compare-and-sets a scheduled, queued, sending or paused campaign to cancelled and stops every queued recipient. Idempotent (changed=false when already cancelled); irreversible — there is no un-cancel through REST. A recipient whose send had already crossed the Telegram submission boundary may still complete; the worker re-checks status immediately before every send. Takes no request body.

## Path parameters

- `campaign_id` string, uuid, required

## Headers

- `Idempotency-Key` string, required

## Response `200`

{ campaign: { id, status, cancelled_at }, changed }

## Other responses

- `400`: Invalid campaign ID, request body, or missing Idempotency-Key
- `403`: Missing campaign scope or user/workspace allowlist
- `404`: Campaign absent, legacy, or outside the key workspace/user
- `409`: Campaign already completed (not cancellable), idempotency collision, or ambiguous prior operation
- `429`: Cancellation rate limit
- `503`: Feature disabled, U5d2 migration not installed, or outcome unknown

---

[API](https://skmtc.dev/gramclaw/apis/gramclaw-telegram-api.md) · [All operations](https://skmtc.dev/gramclaw/apis/gramclaw-telegram-api/llms.txt) · [OpenAPI document](https://skmtc.dev/gramclaw/apis/gramclaw-telegram-api/revisions/7506dc9c905a?raw)
