# 취소

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

이전에 생성된 메시지를 `message_code`로 식별하여 취소합니다. 메시지가 다음 상태 중 하나일 때만 취소가 가능합니다:

- **pending:** 생성되었지만 아직 전송을 위해 선택되지 않았습니다.
- **waiting:** 미래의 전송 시간으로 예약되었습니다.
- **processing:** 현재 배달을 위해 준비 중입니다.

<Aside type="caution" title="중요">

- 메시지가 `processing` 상태인 경우, 취소는 아직 발송되지 않은 배달만 중단합니다. 이미 메시지를 받은 사람은 여전히 메시지를 가지고 있을 수 있습니다.

- 메시지가 이미 취소되었거나 전송이 완료된 경우, API는 `400`을 반환합니다. 이 호출은 멱등성(idempotent)이 아닙니다. 재시도하기 전에 메시지 상태를 확인하십시오.
</Aside>

메시지가 여전히 취소 가능한 상태인지 확인하려면 [메시지 상태 확인](#checking-message-status)을 참조하십시오.


## 요청

`Authorization: Token <API_TOKEN>` 헤더에 [서버 API 토큰](/ko/developer/api-reference/api-access-token/#server-api-token)으로 인증합니다.

| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
| `message_code` | 문자열 | 예 | 취소할 메시지의 [메시지 코드](/ko/developer/api-reference/api-identifiers/#message-code)로, [`Notify`](/ko/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"
  }'
```

## 응답

성공 시, 빈 JSON 본문과 함께 HTTP 200을 반환합니다.

```json
{}
```

## 오류

오류는 표준 gRPC-Gateway 오류 봉투(envelope)를 사용합니다: `{ "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의 메시지 테이블에서 **상태** 열을 읽는 것 외에도([**캠페인 → 일회성 메시지**](/ko/product/statistics-and-analytics/message-history/)), [`messages:list`](/ko/developer/api-reference/statistics-api/message-statistics-api/#messageslist)를 사용하여 프로그래밍 방식으로 상태를 쿼리할 수 있습니다:

- `filters.messages_codes` 배열에 `message_code`를 전달합니다 (필수적인 `filters.application`과 함께).
- `items[]`에서 일치하는 항목의 `status` 필드를 읽습니다.

<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>