# อัปเดต

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

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

การอัปเดตจะทำได้ก็ต่อเมื่อข้อความยังคง **รอดำเนินการ** — คือตั้งเวลาไว้สำหรับการส่งในอนาคตและยังไม่ถูกนำไปประมวลผลหรือจัดส่ง

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

- ฟิลด์ `request` คือคำจำกัดความของ [`Notify`](/th/developer/api-reference/messaging-api-v2/notify/) ที่สมบูรณ์ ฟิลด์ที่คุณละไว้จะ **ไม่** ถูกยกมาจากข้อความเดิม — แต่จะถูกรีเซ็ต โปรดส่งข้อความฉบับเต็มที่คุณต้องการ ไม่ใช่แค่ส่วนที่เปลี่ยนแปลง

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

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


## คำขอ

รับรองความถูกต้องด้วย [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` |
| `request` | object | ใช่ | คำจำกัดความใหม่ทั้งหมดของข้อความ มีรูปแบบเดียวกับเนื้อหาคำขอของ [`Notify`](/th/developer/api-reference/messaging-api-v2/notify/) — คืออ็อบเจกต์ `segment` หรือ `transactional` ซึ่งจะถูกตรวจสอบความถูกต้องเหมือนกับ `Notify` ทุกประการ |

### ตัวอย่างคำขอ

ตั้งเวลาข้อความเซกเมนต์ใหม่และเปลี่ยนเนื้อหา:

```bash
curl -X POST https://api.pushwoosh.com/messaging/v2/update \
  -H "Authorization: Token YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message_code": "XXXX-XXXXXXXX-XXXXXXXX",
    "request": {
      "segment": {
        "application": "XXXXX-XXXXX",
        "platforms": ["IOS", "ANDROID"],
        "code": "active_users",
        "payload": {
          "content": {
            "localized_content": {
              "en": {
                "ios":     { "body": "Updated message" },
                "android": { "body": "Updated message" }
              }
            }
          }
        },
        "schedule": { "at": "2026-05-02T12:00:00Z" },
        "message_type": "MESSAGE_TYPE_MARKETING"
      }
    }
  }'
```

## การตอบกลับ

เมื่อสำเร็จ จะส่งคืน HTTP 200 พร้อมผลลัพธ์ของข้อความที่อัปเดตแล้ว `message_code` จะไม่เปลี่ยนแปลง

```json
{
  "result": {
    "message_code": "XXXX-XXXXXXXX-XXXXXXXX",
    "unknown_identifiers": []
  }
}
```

- `message_code` (string): โค้ดเดียวกับที่ส่งมาในคำขอ
- `unknown_identifiers` (array of string): ตัวระบุในคำจำกัดความใหม่ที่ไม่พบ (ถ้ามี) (ดู [`Notify`](/th/developer/api-reference/messaging-api-v2/notify/))

## ข้อผิดพลาด

ข้อผิดพลาดใช้รูปแบบข้อผิดพลาดมาตรฐานของ gRPC-Gateway: `{ "code": ..., "message": ..., "details": [...] }`

| สถานะ HTTP | เงื่อนไข |
|---|---|
| `400` | `message_code` หายไป |
| `400` | คำจำกัดความ `request` ใหม่หายไปหรือไม่ถูกต้อง (จะถูกตรวจสอบความถูกต้องเหมือนกับ [`Notify`](/th/developer/api-reference/messaging-api-v2/notify/) ทุกประการ) |
| `400` | ข้อความไม่อยู่ในสถานะที่สามารถอัปเดตได้ (ไม่ได้อยู่ในสถานะ `pending` อีกต่อไป) |
| `403` | ข้อความนี้เป็นของบัญชีอื่น |
| `404` | ไม่มีข้อความสำหรับ `message_code` ที่ระบุ |
| `500` | เกิดข้อผิดพลาดภายในขณะโหลดข้อความหรือใช้การอัปเดต โปรดลองส่งคำขออีกครั้ง |


**ตัวอย่าง**

การอัปเดตข้อความที่ไม่มีอยู่อีกต่อไปจะส่งคืน HTTP `404`:

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

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

ก่อนที่จะอัปเดต คุณสามารถตรวจสอบได้ว่าข้อความยังอยู่ในสถานะที่สามารถอัปเดตได้หรือไม่ นอกจากการอ่านคอลัมน์ **สถานะ** ในตารางข้อความใน 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="Cancel" href="/developer/api-reference/messaging-api-v2/cancel/" />
  <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>