# Sends

Source: https://docs.simail.ai/api/sends/

> Follow a submitted message from checking to sent with GET /v0/sends/{send_id}, and cancel scheduled or pending sends.

Every send, reply, forward or draft send returns a `send_id` (`out_…`). It is the release service's
record of that message.

## Get a send

`GET /v0/sends/{send_id}`

Permission `message_read`.

```json
{
  "send_id": "out_01JZX4C0D1E2F3G4H5J6K7M8N9",
  "inbox_id": "shop-helper@simail.email",
  "thread_id": "thr_01JZX4C0D1E2F3G4H5J6K7M8NB",
  "message_id": "msg_01JZX4C0D1E2F3G4H5J6K7M8NA",
  "status": "pending_approval",
  "reasons": [],
  "flags": ["first_contact"],
  "approval_id": "apr_01JZX4C0D1E2F3G4H5J6K7M8NG",
  "send_at": null,
  "created_at": "2026-10-18T17:05:40Z",
  "updated_at": "2026-10-18T17:05:40Z"
}
```

## Status

| `status` | Meaning | Final |
|---|---|---|
| `checking` | being checked | |
| `scheduled` | waiting for `send_at` | |
| `pending_approval` | waiting for a human | |
| `approved` | approved; waits for the final check | |
| `sending` | leaving now | |
| `sent` | handed to the mail network | yes |
| `blocked` | refused; `reasons` says why | yes |
| `rejected` | an approver rejected it | yes |
| `expired` | nobody approved it in time, or it waited too long for a limit or a lock | yes |
| `cancelled` | cancelled before sending | yes |
| `failed` | the mail network refused it; submit again with a new key if you still mean to | yes |
| `outcome_unknown` | it may or may not have gone out; never resent automatically, corrected when a delivery event arrives | |

```text
checking → blocked | pending_approval | scheduled | approved
pending_approval → approved | rejected | expired | cancelled
scheduled | approved → sending → sent | failed | outcome_unknown | blocked
scheduled | approved → cancelled
```

While a message waits (platform pause, organization pause, thread lock, daily limit), it stays
`scheduled` or `approved` and a `send.deferred` event says why.

## Cancel a send

`DELETE /v0/sends/{send_id}`

Permission `message_send`. Cancels a send that is `scheduled`, `pending_approval` or `approved`.
Returns the send with `status: "cancelled"` and publishes `send.cancelled`. If it is already sending or
final, returns `409 conflict` with `reason: "already_sending"` or `"already_final"`.

Errors: `404 not_found` (unknown or outside your scope), `409 conflict`.

MCP: `get_send_status`.
