ข้ามไปยังเนื้อหา

Feature Flags API

Feature flag คือสวิตช์ระยะไกลที่มีคุณสมบัติ (properties) ซึ่ง SDK จะอ่านสำหรับแต่ละอุปกรณ์ API นี้จัดการ flag ของแอปพลิเคชัน โดยมีการดำเนินการเดียวกับ Audience → Feature Flags ใน Control Panel หากต้องการอ่าน flag บนเว็บไซต์หรือในแอปมือถือ ให้ใช้ Web SDK, Android SDK หรือ iOS SDK

https://rpc-api.svc-nue.pushwoosh.com

Endpoints ทั้งหมดให้บริการผ่าน HTTPS คำขอและการตอบกลับใช้ application/json

การรับรองความถูกต้อง

Anchor link to

ทุกคำขอต้องมี Authorization header พร้อมกับ Server API token ของคุณ:

Authorization: Api YOUR_API_TOKEN

การอ่าน flag ต้องมีสิทธิ์เข้าถึงแอปพลิเคชัน การสร้างและเปลี่ยนแปลง flag ต้องมีสิทธิ์จัดการแอปพลิเคชันนั้น

ข้อตกลงทั่วไป

Anchor link to
  • การตั้งชื่อฟิลด์: request bodies ยอมรับ lowerCamelCase หรือ snake_case การตอบกลับใช้ snake_case เช่นเดียวกับใน ออบเจ็กต์ Feature flag
  • เปอร์เซ็นต์ ใช้หน่วย basis points: percent_bp ตั้งแต่ 0 ถึง 10000 โดย 2000 คือ 20%
  • เวอร์ชัน: ทุก flag มี version คำขอ Update, SetRulePercent และ Reshuffle รับเวอร์ชันที่คุณอ่านล่าสุด และจะล้มเหลวพร้อม VERSION_CONFLICT หาก flag มีการเปลี่ยนแปลงหลังจากนั้น การแก้ไขพร้อมกันจึงไม่เขียนทับกันเลย ให้อ่าน flag อีกครั้งแล้วลองใหม่
  • สถานะ: active, killed หรือ archived คำขอ Kill, Unkill, Archive และ Restore เปลี่ยนเฉพาะสถานะและไม่รับเวอร์ชัน

REST endpoint แต่ละรายการมีเครื่องมือ MCP ที่ใช้พารามิเตอร์เดียวกัน:

เมธอดเส้นทางคำอธิบายเครื่องมือ MCP
GET/api/applications/{application_code}/feature_flagsแสดงรายการ flag ของแอปพลิเคชันlist_feature_flags
GET/api/applications/{application_code}/feature_flags/{key}ดึงข้อมูล flag หนึ่งรายการget_feature_flag
POST/api/applications/{application_code}/feature_flagsสร้าง flagcreate_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}แทนที่ชื่อ คำอธิบาย คุณสมบัติ และกฎupdate_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/rules/{rule_id}/percentเปลี่ยนสัดส่วนการเปิดใช้ (rollout) ของกฎหนึ่งข้อset_feature_flag_rule_percent
POST/api/applications/{application_code}/feature_flags/{key}/killปิด flag สำหรับทุกคนkill_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/unkillเปิด flag ที่ถูกปิดอีกครั้งunkill_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/archiveเก็บถาวร flagarchive_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/restoreกู้คืน flag ที่เก็บถาวรไว้restore_feature_flag
POST/api/applications/{application_code}/feature_flags/{key}/reshuffleเลือกกลุ่มตัวอย่างผู้ใช้ใหม่reshuffle_feature_flag
GET/api/applications/{application_code}/feature_flags/{key}/historyแสดงรายการการเปลี่ยนแปลงของ flaglist_feature_flag_history

ทุก endpoint ยกเว้น List และ History จะส่งคืน { "flag": { ... } } ซึ่งคือ ออบเจ็กต์ Feature flag หลังการดำเนินการ

GET /api/applications/{application_code}/feature_flags

คำขอรับพารามิเตอร์ต่อไปนี้:

พารามิเตอร์ตำแหน่งประเภทคำอธิบาย
application_codepathstringApplication code
statusquerystringไม่บังคับ active, killed หรือ archived ละไว้เพื่อแสดงรายการ flag ทั้งหมด

ส่งคืน { "flags": [ ... ] } ซึ่งเป็นอาร์เรย์ของ ออบเจ็กต์ Feature flag

GET /api/applications/{application_code}/feature_flags/{key}

ส่งคืน flag หนึ่งรายการพร้อมคุณสมบัติ กฎ และ version ปัจจุบัน

สร้าง flag ที่มีสถานะ active เซิร์ฟเวอร์จะสร้าง rule_id ของทุกกฎ

POST /api/applications/{application_code}/feature_flags

Request body มีฟิลด์ต่อไปนี้:

พารามิเตอร์ประเภทจำเป็นคำอธิบาย
keystringใช่ตรงกับ ^[A-Za-z0-9_.-]{1,58}$ ไม่ซ้ำกันภายในแอปพลิเคชัน รวมถึง flag ที่เก็บถาวร โดยเปรียบเทียบแบบไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่ ไม่สามารถเปลี่ยนแปลงภายหลังได้
namestringไม่ชื่อที่แสดง สูงสุด 255 อักขระ
descriptionstringไม่คำอธิบาย
propertiesอาร์เรย์ของ ออบเจ็กต์ Propertyไม่สูงสุด 50 คุณสมบัติ
defaultsobjectใช่ หากมีคุณสมบัติค่าของทุกคุณสมบัติสำหรับอุปกรณ์ที่ flag ปิดอยู่ โดยใช้คีย์ของคุณสมบัติเป็นคีย์ ค่าแต่ละค่าต้องตรงกับประเภทของคุณสมบัติ
rulesอาร์เรย์ของ ออบเจ็กต์ Ruleไม่กฎที่เรียงลำดับ สูงสุด 10 ข้อ กฎแรกที่ segment ตรงกับอุปกรณ์จะเป็นตัวตัดสิน
ตัวอย่างคำขอ
Anchor link to
{
"key": "new_checkout",
"name": "New checkout",
"properties": [
{ "key": "button_color", "type": "string" },
{ "key": "show_apple_pay", "type": "boolean" }
],
"defaults": { "button_color": "blue", "show_apple_pay": false },
"rules": [
{
"name": "Beta testers",
"filter_code": "XXXXX-XXXXX",
"percent_bp": 10000,
"overrides": { "button_color": "green", "show_apple_pay": true }
},
{
"name": "Everyone else",
"filter_code": "",
"percent_bp": 2000,
"overrides": { "button_color": "orange" }
}
]
}

แทนที่ชื่อ คำอธิบาย คุณสมบัติ ค่าเริ่มต้น และกฎของ flag สถานะจะไม่เปลี่ยนแปลงที่นี่ ให้ส่งทุกฟิลด์ ไม่ใช่เฉพาะฟิลด์ที่เปลี่ยน

POST /api/applications/{application_code}/feature_flags/{key}

รับ body เดียวกับ Create โดยไม่มี key และเพิ่ม version จากการอ่านครั้งล่าสุดของคุณ ให้คง rule_id ของทุกกฎที่มีอยู่ไว้ กฎที่ไม่มี rule_id จะถูกสร้างเป็นกฎใหม่ ประเภทของคุณสมบัติไม่สามารถเปลี่ยนได้หลังจากสร้างคุณสมบัตินั้นแล้ว

SetRulePercent

Anchor link to

เปลี่ยนสัดส่วนการเปิดใช้ของกฎหนึ่งข้อ ผู้ใช้ที่มี flag อยู่แล้วจะยังคงมี flag นั้นเมื่อเปอร์เซ็นต์เพิ่มขึ้น

POST /api/applications/{application_code}/feature_flags/{key}/rules/{rule_id}/percent

{ "percentBp": 5000, "version": 3 }

Kill และ Unkill

Anchor link to

POST .../feature_flags/{key}/kill ปิด flag สำหรับทุกอุปกรณ์ ซึ่งจะได้รับค่าเริ่มต้นของคุณสมบัติแทน กฎและคุณสมบัติจะยังคงอยู่

POST .../feature_flags/{key}/unkill เปิด flag ที่ถูกปิดอีกครั้งพร้อมกฎเดิม

ทั้งสองรับ body ว่าง {}

Archive และ Restore

Anchor link to

POST .../feature_flags/{key}/archive หยุดส่ง flag ไปยังอุปกรณ์ flag ที่เก็บถาวรจะไม่นับรวมในขีดจำกัดจำนวน flag ต่อแอปพลิเคชันของแพ็กเกจ และคีย์ของ flag ยังคงถูกสงวนไว้

POST .../feature_flags/{key}/restore นำ flag ที่เก็บถาวรกลับมาในสถานะ killed จึงไม่มีทางเปิดขึ้นเอง เรียก unkill เพื่อเปิดใช้อีกครั้ง

ทั้งสองรับ body ว่าง {}

จัดผู้ใช้ทุกคนเข้า bucket ใหม่ เพื่อให้เปอร์เซ็นต์เดิมเลือกกลุ่มตัวอย่างผู้ใช้ที่ต่างออกไป ผู้ใช้บางคนที่เปิด flag อยู่จะสูญเสีย flag ไป และผู้ใช้อื่นจะได้รับ flag แทน

POST /api/applications/{application_code}/feature_flags/{key}/reshuffle

{ "confirm": true, "version": 3 }

confirm ต้องเป็น true มิฉะนั้นคำขอจะล้มเหลวพร้อม CONFIRM_REQUIRED

ส่งคืนการเปลี่ยนแปลงของ flag โดยเรียงจากใหม่ไปเก่า ได้แก่ ผู้ที่ทำการเปลี่ยนแปลงแต่ละครั้ง เวลา และฟิลด์ที่เปลี่ยนไป เช่นเดียวกับ Get คำขอนี้ต้องมีสิทธิ์เข้าถึงแอปพลิเคชัน และจะส่งคืน 404 เมื่อไม่มีแอปพลิเคชันหรือ flag นั้น

GET /api/applications/{application_code}/feature_flags/{key}/history

คำขอรับพารามิเตอร์ต่อไปนี้:

พารามิเตอร์ตำแหน่งประเภทคำอธิบาย
application_codepathstringApplication code
keypathstringคีย์ของ flag
pagequeryintegerไม่บังคับ หมายเลขหน้า เริ่มจาก 0
per_pagequeryintegerไม่บังคับ จำนวนรายการต่อหน้า ค่าเริ่มต้นคือ 20 สูงสุด 100

ส่งคืน { "entries": [ ... ], "total": N } โดย total คือจำนวนรายการทั้งหมดในทุกหน้า แต่ละรายการมีฟิลด์ต่อไปนี้:

ฟิลด์ประเภทคำอธิบาย
versionintegerเวอร์ชันของ flag ที่เกิดจากการเปลี่ยนแปลงนี้
actionstringcreate, update, set_percent, kill, unkill, archive, restore หรือ reshuffle
user_idstringID ของผู้ใช้ Control Panel ที่ทำการเปลี่ยนแปลง เป็น 0 สำหรับการเปลี่ยนแปลงที่ทำด้วย API token หรือโดยบริการของ Pushwoosh
user_emailstringอีเมลของผู้ใช้นั้น เป็นค่าว่างเมื่อผู้ใช้ถูกลบแล้วหรือ user_id เป็น 0
by_api_tokenbooleanเป็น true เมื่อการเปลี่ยนแปลงทำด้วย API token เป็น false สำหรับการเปลี่ยนแปลงโดยผู้ใช้หรือโดยบริการของ Pushwoosh
api_token_namestringชื่อของ API token ณ เวลาที่เปลี่ยนแปลง ชื่อนี้ยังคงอยู่หลังจากลบ token แล้ว เป็นค่าว่างเมื่อ token ไม่มีชื่อหรือ by_api_token เป็น false
createdstringเวลาที่เปลี่ยนแปลง ในรูปแบบ RFC 3339
flagออบเจ็กต์ Feature flagflag หลังการเปลี่ยนแปลง
changesarrayฟิลด์ที่แตกต่างจากเวอร์ชันก่อนหน้า เป็นค่าว่างสำหรับ create และ reshuffle รวมถึงรายการที่เก่าที่สุดของ flag ที่สร้างก่อนเริ่มบันทึกประวัติ เนื่องจากไม่มีเวอร์ชันก่อนหน้าให้เปรียบเทียบ

แต่ละรายการใน changes มี field, before และ after โดย before และ after เก็บค่าที่เข้ารหัสเป็นสตริง JSON ค่าที่เป็นสตริงจึงอยู่ในเครื่องหมายคำพูด field มีค่าต่อไปนี้:

fieldสิ่งที่เปลี่ยนแปลง
name, description, statusฟิลด์ของ flag ที่มีชื่อนี้
propertiesคุณสมบัติและค่าเริ่มต้นของคุณสมบัติ
rules[<rule_id>]กฎหนึ่งข้อ สำหรับกฎที่เพิ่มเข้ามา before จะว่าง สำหรับกฎที่ถูกลบ after จะว่าง
rules.orderลำดับของกฎ
ตัวอย่างการตอบกลับ
Anchor link to
{
"entries": [
{
"version": 4,
"action": "set_percent",
"user_id": "12345",
"user_email": "owner@example.com",
"by_api_token": false,
"api_token_name": "",
"created": "2026-10-14T09:30:00Z",
"flag": { "key": "new_checkout", "status": "active", "version": 4 },
"changes": [
{
"field": "rules[r_1a2b3c4d]",
"before": "{\"rule_id\":\"r_1a2b3c4d\",\"name\":\"Beta testers\",\"filter_code\":\"XXXXX-XXXXX\",\"percent_bp\":2000,\"overrides\":{\"button_color\":\"green\"}}",
"after": "{\"rule_id\":\"r_1a2b3c4d\",\"name\":\"Beta testers\",\"filter_code\":\"XXXXX-XXXXX\",\"percent_bp\":5000,\"overrides\":{\"button_color\":\"green\"}}"
}
]
}
],
"total": 4
}

ออบเจ็กต์ flag ในตัวอย่างถูกย่อไว้ ประวัติจะบันทึกการเปลี่ยนแปลงตั้งแต่วันที่ 13 ตุลาคม 2026 เป็นต้นไป flag ที่ไม่มีการเปลี่ยนแปลงที่บันทึกไว้จะไม่ส่งคืนรายการใด

การอ่าน flag สำหรับอุปกรณ์

Anchor link to

SDK อ่าน flag จาก endpoint แยกต่างหาก คุณไม่ต้องเรียก endpoint นี้เมื่อใช้ Web SDK, Android SDK หรือ iOS SDK เพราะ SDK จะเลือกโฮสต์และแคชคำตอบเอง

POST https://api.pushwoosh.com/api/v2/device-api/getFeatureFlags

เนื้อหาคำขอมีฟิลด์ต่อไปนี้:

ฟิลด์ประเภทคำอธิบาย
applicationstringApplication code
hwidstringHWID ของอุปกรณ์
etagstringไม่บังคับ etag ของคำตอบล่าสุดที่อุปกรณ์มีอยู่

การตอบกลับมีฟิลด์ต่อไปนี้:

ฟิลด์ประเภทคำอธิบาย
flagsobjectflag ที่ใช้คีย์ของ flag เป็นคีย์ แต่ละรายการมี enabled, rule_id และ properties โดย rule_id เป็น default เมื่อไม่มีกฎใดตรงกัน และเป็นค่าว่างสำหรับ flag ที่ถูกปิด ไม่รวม flag ที่เก็บถาวร
etagstringส่งค่านี้ไปพร้อมกับคำขอถัดไป
not_modifiedbooleanเป็น true เมื่อ etag ที่ส่งมาเป็นปัจจุบัน ในกรณีนี้จะไม่มี flags และอุปกรณ์จะใช้สำเนาที่มีอยู่
partialbooleanเป็น true เมื่อจับคู่ segment ของอุปกรณ์ไม่ทันเวลา อย่าแคชคำตอบนี้

ในแพ็กเกจที่ไม่มี feature flag การตอบกลับจะว่างเปล่า

ออบเจ็กต์

Anchor link to

ออบเจ็กต์ Feature flag

Anchor link to

ทุก endpoint ส่งคืน flag ในรูปแบบนี้:

ฟิลด์ประเภทคำอธิบาย
application_codestringแอปพลิเคชันที่ flag นี้เป็นของ
keystringคีย์ของ flag
namestringชื่อที่แสดง
descriptionstringคำอธิบาย
statusstringactive, killed หรือ archived
propertiesอาร์เรย์ของ ออบเจ็กต์ Propertyคุณสมบัติของ flag
defaultsobjectค่าของทุกคุณสมบัติสำหรับอุปกรณ์ที่ flag ปิดอยู่
rulesอาร์เรย์ของ ออบเจ็กต์ Ruleกฎที่เรียงลำดับ
versionintegerส่งกลับมาพร้อมกับ Update, SetRulePercent และ Reshuffle
createdstringเวลาที่สร้าง ในรูปแบบ RFC 3339
updatedstringเวลาที่เปลี่ยนแปลงล่าสุด ในรูปแบบ RFC 3339
last_modified_by_user_idstringผู้ใช้ Control Panel ที่เปลี่ยนแปลง flag ล่าสุด เป็น 0 เมื่อการเปลี่ยนแปลงล่าสุดทำด้วย API token หรือโดยบริการของ Pushwoosh

ออบเจ็กต์ Property

Anchor link to

คุณสมบัติอธิบายค่าหนึ่งค่าที่ SDK อ่านจาก flag:

ฟิลด์ประเภทคำอธิบาย
keystringตรงกับ ^[A-Za-z0-9_]{1,64}$ และไม่ซ้ำกันภายใน flag
typestringstring, number, boolean หรือ json ไม่สามารถเปลี่ยนได้เมื่อคุณสมบัติมีอยู่แล้ว

ออบเจ็กต์ Rule

Anchor link to

กฎใช้ตัดสินว่าใครจะได้รับ flag แบบเปิด และด้วยค่าใด:

ฟิลด์ประเภทคำอธิบาย
rule_idstringสร้างโดยเซิร์ฟเวอร์ เป็น r_ ตามด้วยเลขฐานสิบหก 8 หลัก และคงที่ตลอดการอัปเดต ให้เว้นว่างไว้สำหรับกฎใหม่
namestringชื่อกฎ
filter_codestringSegment ที่อุปกรณ์ต้องตรงกัน ค่าว่างจะตรงกับทุกอุปกรณ์ Segment สามารถมีได้เฉพาะเงื่อนไขแท็ก ตำแหน่ง แอปพลิเคชัน และรายการ
percent_bpintegerสัดส่วนของผู้ใช้ที่ตรงกันซึ่ง flag เปิดอยู่ 0–10000 อุปกรณ์ที่ตรงกับ segment จะหยุดที่กฎนี้แม้ว่าจะอยู่นอกเปอร์เซ็นต์ก็ตาม
overridesobjectค่าคุณสมบัติที่ใช้แทนค่าเริ่มต้นสำหรับอุปกรณ์ที่กฎนี้เปิด flag ให้ โดยใช้คีย์ของคุณสมบัติเป็นคีย์

ข้อผิดพลาด

Anchor link to

คำขอที่ถูกปฏิเสธจะส่งคืนรหัสสถานะ HTTP อย่างใดอย่างหนึ่งต่อไปนี้:

สถานะ HTTPความหมาย
400 Bad Requestคำขอไม่ถูกต้อง (field_violations) หรือสถานะของ flag หรือแพ็กเกจไม่อนุญาต (Type) ดูรูปแบบ body และเหตุผลด้านล่าง
401 Unauthorizedไม่มี Authorization header หรือโทเค็นไม่ถูกต้อง
403 Forbiddenโทเค็นไม่สามารถจัดการแอปพลิเคชันได้ หรือแอปพลิเคชันเป็นแอปพลิเคชันระบบ
404 Not Foundไม่มีแอปพลิเคชันหรือ flag นั้นอยู่
409 Conflictมีคำขออื่นกำลังเปลี่ยนแปลง flag เดียวกันในขณะนี้ ให้ลองส่งคำขออีกครั้ง
500 Internal Server Errorเซิร์ฟเวอร์ล้มเหลวโดยไม่คาดคิด body คือ {"message": "Sorry, an unexpected error occurred"}

คำขอที่ไม่ถูกต้องจะส่งคืน 400 พร้อมรายการการละเมิดฟิลด์ การละเมิดแต่ละรายการระบุฟิลด์ เหตุผล และอาร์กิวเมนต์ของเหตุผล:

{
"code": 3,
"message": "validation failed",
"details": [
{
"@type": "type.googleapis.com/pushwoosh.rpc.errors.v3.BadRequest",
"field_violations": [
{
"field": "key",
"description": "a feature flag with this key already exists in the application",
"reason": "KEY_TAKEN",
"args": { "key": "new_checkout" }
}
]
}
]
}

คำขอที่สถานะของ flag หรือแพ็กเกจไม่อนุญาตจะส่งคืน 400 พร้อมเงื่อนไขเบื้องต้นที่ล้มเหลวหนึ่งรายการ ฟิลด์ Type และ Description ขึ้นต้นด้วยตัวพิมพ์ใหญ่:

{
"code": 9,
"message": "precondition failed",
"details": [
{
"@type": "type.googleapis.com/pushwoosh.rpc.errors.v3.FailedPrecondition",
"Type": "VERSION_CONFLICT",
"Description": "feature flag was changed: version 3 was sent, the current one is 4"
}
]
}

reason ของการละเมิดฟิลด์และ Type ของเงื่อนไขเบื้องต้นที่ล้มเหลวมีค่าต่อไปนี้:

เหตุผลสาเหตุ
KEY_INVALIDคีย์ไม่ตรงกับ ^[A-Za-z0-9_.-]{1,58}$
KEY_TAKENflag อื่นของแอปพลิเคชัน รวมถึงที่เก็บถาวร ใช้คีย์นี้อยู่แล้ว
TEXT_INVALIDชื่อหรือคำอธิบายยาวเกินไปหรือมีอักขระต้องห้าม
PROPERTIES_LIMITมีคุณสมบัติมากกว่า 50 รายการ
PROPERTY_KEY_INVALIDคีย์ของคุณสมบัติไม่ถูกต้องหรือซ้ำกัน
PROPERTY_TYPE_INVALIDประเภทของคุณสมบัติไม่ใช่ string, number, boolean หรือ json
PROPERTY_TYPE_IMMUTABLEคำขอเปลี่ยนประเภทของคุณสมบัติที่มีอยู่
VALUE_INVALIDค่าเริ่มต้นหรือค่า override ขาดหายไป ไม่ตรงกับประเภทของคุณสมบัติ หรือซ้อนกันลึกเกิน 5 ระดับ
PROPERTIES_TOO_LARGEค่าคุณสมบัติของ flag เกิน 10,000 ไบต์
RULES_LIMITมีกฎมากกว่า 10 ข้อ
RULE_NOT_FOUNDrule_id ไม่ใช่กฎของ flag นี้
PERCENT_INVALIDpercent_bp อยู่นอกช่วง 0–10000
OVERRIDE_UNKNOWN_PROPERTYoverride ระบุคุณสมบัติที่ flag ไม่มี
SEGMENT_NOT_FOUNDไม่มี segment ของกฎ หรือเป็นของแอปพลิเคชันอื่น
INVALID_SEGMENT_TYPEsegment ของกฎมีเงื่อนไขที่ flag ประเมินไม่ได้ ได้แก่ event, static, external, last update หรือ best time to send
FLAG_DEPENDENCYsegment ของกฎมีเงื่อนไข feature flag และ flag หนึ่งไม่สามารถขึ้นอยู่กับ flag อื่นได้ ส่งคืนโดย Create, Update และ Restore พร้อมโค้ดของ segment ใน filter_code
CONFIRM_REQUIREDส่ง Reshuffle โดยไม่มี confirm: true
TAG_CONFLICTบัญชีมีแท็กที่กำหนดเองชื่อ PW_FF_ ตามด้วยคีย์ของ flag
FEATURE_FLAGS_NOT_ALLOWEDแพ็กเกจของบัญชีไม่รวม feature flag
FLAGS_LIMITแอปพลิเคชันมี flag ที่ไม่ได้เก็บถาวรครบตามจำนวนที่แพ็กเกจอนุญาตแล้ว
VERSION_CONFLICTflag มีการเปลี่ยนแปลงหลังจาก version ที่คุณส่ง
PAYLOAD_TOO_LARGEflag ของแอปพลิเคชันจะใช้พื้นที่เกิน 64 KB ในการตอบกลับของอุปกรณ์หนึ่งเครื่อง
STATUS_CONFLICTสถานะไม่อนุญาตการดำเนินการนี้ เช่น การ kill flag ที่เก็บถาวรแล้ว