---
title: "Cancel a send"
method: POST
path: "/v1/sends/{sendId}/cancel"
tags: ["Emails"]
---

# Cancel a send

`POST /v1/sends/{sendId}/cancel`

Cancels a scheduled or queued send before it goes out, or STOPS any in-flight campaign send. A campaign in `sending` or `paused` is canceled the same way the in-app Stop button does it: the remaining recipients are never delivered while already-sent ones stay sent (every shape re-checks liveness at regular points mid-flight — smart per time bucket, gradual and plain blast at bounded chunk intervals — so a small tail may still deliver after the cancel lands). Idempotent — a send already `canceled` returns `200`. A send already `sent` or `failed`, or a non-campaign (automation) send, returns `409 SEND_NOT_CANCELLABLE`. Brand-scoped: an unknown / cross-brand `sendId` is `404`.

## Path parameters

- `sendId` string, required — Send id returned by `POST /v1/sends`.

## Headers

- `Idempotency-Key` string

## Response `200`

The send is canceled (or was already canceled).

- SendCancelResponse
  - `sendId` string, required
  - `status` 'canceled', required

## Other responses

- `401` — The API key was missing, invalid, or revoked.
- `403` — The caller does not have the required `sends` permission.
- `404` — Send not found in the API-key brand. Cross-brand ids intentionally surface as 404 (never 403) so the API does not leak cross-brand existence.
- `409` — The send is past the point of cancellation (terminal `sent` / `failed`, or a non-campaign send).
- `429` — The request hit the rolling rate limit window.
- `500` — Unexpected internal error.

---

[API](https://skmtc.net/brew/apis/brew-public-api-v1.md) · [All operations](https://skmtc.net/brew/apis/brew-public-api-v1/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/brew/brew-public-api-v1/versions/db96cfedc6c5/schema)
