# ยกเลิก

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

ยกเลิกข้อความที่สร้างไว้ก่อนหน้านี้ โดยระบุด้วย `message_code` ของข้อความนั้น การยกเลิกจะทำได้ก็ต่อเมื่อข้อความอยู่ในสถานะใดสถานะหนึ่งต่อไปนี้:

- **pending:** สร้างแล้ว แต่ยังไม่ถูกนำไปส่ง
- **waiting:** กำหนดเวลาส่งในอนาคต
- **processing:** กำลังเตรียมการจัดส่ง

<Aside type="caution" title="ข้อสำคัญ">

- หากข้อความอยู่ในสถานะ `processing` การยกเลิกจะหยุดการจัดส่งที่ยังไม่ได้ส่งออกไปเท่านั้น ผู้ที่ได้รับข้อความไปแล้วอาจยังคงมีข้อความนั้นอยู่

- หากข้อความถูกยกเลิกไปแล้วหรือส่งเสร็จสิ้นแล้ว API จะส่งคืนค่า `400` การเรียกนี้ไม่สามารถทำซ้ำได้ (not idempotent) โปรดตรวจสอบสถานะข้อความก่อนลองอีกครั้ง
</Aside>

หากต้องการตรวจสอบว่าข้อความยังอยู่ในสถานะที่สามารถยกเลิกได้หรือไม่ โปรดดูที่ [การตรวจสอบสถานะข้อความ](#checking-message-status)


## คำขอ (Request)

ยืนยันตัวตนด้วย [Server API token](/th/developer/api-reference/api-access-token/#server-api-token) ของคุณในส่วนหัว `Authorization: Token <API_TOKEN>`

| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
| `message_code` | string | ใช่ | [Message code](/th/developer/api-reference/api-identifiers/#message-code) ของข้อความที่ต้องการยกเลิก ซึ่งได้มาจาก [`Notify`](/th/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"
  }'
```

## การตอบกลับ (Response)

เมื่อสำเร็จ จะส่งคืน HTTP 200 พร้อมกับเนื้อหา JSON ที่ว่างเปล่า

```json
{}
```

## ข้อผิดพลาด (Errors)

ข้อผิดพลาดใช้รูปแบบข้อผิดพลาดมาตรฐานของ 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": []
}
```

## การตรวจสอบสถานะข้อความ

ก่อนทำการยกเลิก คุณสามารถตรวจสอบได้ว่าข้อความยังอยู่ในสถานะที่สามารถยกเลิกได้หรือไม่ นอกจากการอ่านคอลัมน์ **สถานะ (Status)** ในตารางข้อความใน Control Panel ([**Campaigns → One-time messages**](/th/product/statistics-and-analytics/message-history/)) แล้ว คุณยังสามารถสอบถามสถานะผ่านโปรแกรมได้ด้วย [`messages:list`](/th/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 และใช้ส่วนหัวการยืนยันตัวตนที่แตกต่างจาก endpoint นี้: `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>