# Отмена

`POST` `https://api.pushwoosh.com/messaging/v2/cancel`

Отменяет ранее созданное сообщение, идентифицированное по его `message_code`. Отмена доступна только в том случае, если сообщение находится в одном из следующих состояний:

- **pending:** создано, но еще не взято в обработку для отправки.
- **waiting:** запланировано для отправки в будущем.
- **processing:** в настоящее время готовится к доставке.

<Aside type="caution" title="Важно">

- Если сообщение находится в состоянии `processing`, отмена остановит только те доставки, которые еще не были выполнены. Те, кто уже получил сообщение, могут все еще его видеть.

- Если сообщение уже было отменено или его отправка завершена, API вернет ошибку `400`. Этот вызов не является идемпотентным. Проверьте статус сообщения перед повторной попыткой.
</Aside>

Чтобы проверить, находится ли сообщение все еще в состоянии, допускающем отмену, см. [Проверка статуса сообщения](#checking-message-status).


## Запрос

Аутентифицируйтесь с помощью вашего [Server API token](/ru/developer/api-reference/api-access-token/#server-api-token) в заголовке `Authorization: Token <API_TOKEN>`.

| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
| `message_code` | string | Да | [Код сообщения](/ru/developer/api-reference/api-identifiers/#message-code), которое нужно отменить, возвращаемый методом [`Notify`](/ru/developer/api-reference/messaging-api-v2/notify/) в `result.message_code`. |

### Пример запроса

```bash
curl -X POST https://api.pushwoosh.com/messaging/v2/cancel \
  -H "Authorization: Token YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message_code": "XXXX-XXXXXXXX-XXXXXXXX"
  }'
```

## Ответ

В случае успеха возвращает HTTP 200 с пустым телом JSON.

```json
{}
```

## Ошибки

Ошибки используют стандартную оболочку ошибок gRPC-Gateway: `{ "code": ..., "message": ..., "details": [...] }`.

| HTTP-статус | Условие |
|---|---|
| `400` | `message_code` отсутствует. |
| `400` | Сообщение не находится в состоянии, допускающем отмену (оно больше не в состоянии `pending`, `waiting` или `processing`). |
| `403` | Сообщение принадлежит другому аккаунту. |
| `404` | Сообщение с указанным `message_code` не существует. |
| `500` | Произошла внутренняя ошибка при загрузке сообщения или публикации отмены. Повторите запрос. |


**Пример**

Отмена несуществующего сообщения вернет HTTP `404`:

```json
{
  "code": 5,
  "message": "message not found",
  "details": []
}
```

## Проверка статуса сообщения

Перед отменой вы можете проверить, находится ли сообщение все еще в состоянии, допускающем отмену. Помимо просмотра столбца **Статус** в таблице сообщений в Control Panel ([**Кампании → Разовые сообщения**](/ru/product/statistics-and-analytics/message-history/)), вы можете запросить статус программно с помощью [`messages:list`](/ru/developer/api-reference/statistics-api/message-statistics-api/#messageslist):

- Передайте `message_code` в массиве `filters.messages_codes` (вместе с обязательным `filters.application`).
- Прочитайте поле `status` соответствующей записи в `items[]`.

<Aside type="note">
`messages:list` является частью Statistics API и использует другой заголовок аутентификации, чем эта конечная точка: `Authorization: Api <Server Key>`.
</Aside>

## Связанные материалы

<CardGrid>
  <LinkCard title="Notify" href="/developer/api-reference/messaging-api-v2/notify/" />
  <LinkCard title="Update" href="/developer/api-reference/messaging-api-v2/update/" />
  <LinkCard title="Статистика сообщений" href="/developer/api-reference/statistics-api/message-statistics-api/#messageslist" />
  <LinkCard title="Обзор Messaging API v2" href="/developer/api-reference/messaging-api-v2/" />
  <LinkCard title="Миграция с v1" href="/developer/api-reference/messaging-api-v2/migration-from-v1/" />
</CardGrid>