ตรวจสอบคีย์ · ยอดเงิน · โควตา

GET/api/v1/me
สิทธิ์ที่ต้องใช้:wallet:read

ยิงคำขอนี้เป็นอันแรกหลังได้รับคีย์ เพื่อยืนยันว่าคีย์ใช้งานได้จริง · นอกจากนั้นมันยังตอบสี่เรื่องที่หน้าอื่นถือว่าคุณรู้อยู่แล้ว: คีย์นี้ทำอะไรได้บ้าง (scopes) · กระเป๋าของคุณมีเงินเท่าไหร่และเป็นสกุลอะไร (wallet) · คุณได้ส่วนลดกี่เปอร์เซ็นต์ แยกตามประเภทสินค้า (discount) · วันนี้ยิงได้อีกกี่คำขอ (quota) · ⚠️ ระบบนี้ ไม่มีการสมัครเอง ไม่มีคีย์ทดสอบ และไม่มี sandbox คีย์ออกให้โดยแอดมินของร้านเท่านั้น ทุกคำขอตั้งแต่นี้ไปวิ่งบนระบบจริง และทุกคำสั่งซื้อใช้เงินจริง

รหัสปฏิเสธที่ด่านยืนยันตัวตน — เกิดได้กับทุกเอนด์พอยต์

ห้ารหัสนี้ถูกโยนก่อนคำขอจะไปถึงตรรกะของเอนด์พอยต์ไหนก็ตาม: invalid_key (401) ไม่มี header ยืนยันตัวตน รูปคีย์ผิด ไม่พบคีย์ หรือส่วนลับไม่ตรง · key_revoked (401) คีย์ใบนี้ถูกยกเลิกแล้ว · insufficient_scope (403) คีย์ใช้ได้แต่ไม่มี scope ที่เอนด์พอยต์นั้นต้องการ · quota_exceeded (429) ใช้โควตารายวันหมดแล้ว · too_many_inflight (429) มีคำขอของคีย์ใบนี้ค้างอยู่พร้อมกันเกินเพดาน · ไม่มีรหัสไหนในห้าตัวนี้กินโควตารายวันของคุณเลยสักใบ รวม 429 ทั้งสองตัวด้วย เพราะระบบปฏิเสธก่อนจะไปเพิ่มตัวนับ · กลุ่ม 401 กับ 403 **ไม่มี header X-RateLimit-* กลับมาเลยสักตัว เพราะยังไม่ได้แตะตัวนับจึงไม่มีค่าให้รายงาน ส่วน 429 ทั้งสองตัวมีครบพร้อม Retry-After และทั้งห้ารหัสมี Cache-Control: private, no-store เหมือนกันหมด · 429 สองแบบใช้สถานะเดียวกันแต่ต้องรับมือคนละอย่าง ให้แยกด้วย data.code ไม่ใช่ด้วยสถานะ HTTP** — quota_exceeded หมดจริงจนถึงรอบรีเซ็ต ส่วน too_many_inflight คลี่ตัวเองในไม่กี่วินาที โค้ดที่รับมือ 429 ทุกใบเหมือนกันหมดจะนอนรอเป็นชั่วโมงให้กับการชนกันที่หายเองในสองวินาที

ตัดสินใจจาก statusCode กับ data.code เท่านั้น

เวลาคำขอล้มเหลว ทุกเอนด์พอยต์ตอบด้วยโครงก้อนเดียวกันหมด ประกอบด้วย: error เป็น true เสมอและมีเฉพาะตอนล้มเหลว · url คือ URL เต็มของคำขอใบที่ล้มเหลว · statusCode คือสถานะ HTTP ตัวเดิมเขียนซ้ำไว้ในเนื้อคำตอบ · statusMessage เป็นสตริง Server Error ตรงตัวเสมอ แม้จะเป็น 400 หรือ 401 ก็ตาม เพราะเป็นค่ากลางของเฟรมเวิร์กที่ไม่มีเอนด์พอยต์ไหนตั้งเอง มันจึงไม่ได้สื่อความหมายอะไรเลย อย่าอ่านมัน · ข้อความบนบรรทัดสถานะของ HTTP เองก็เป็นค่ากลางตัวเดียวกัน คุณจะเห็น 401 Server Error ไม่ใช่ 401 Unauthorized — ตัวนั้นก็อย่าอ่านเหมือนกัน ให้ดูตัวเลขสถานะ · message เป็นประโยคสำหรับคนอ่าน ถ้อยคำเปลี่ยนได้ตลอด อย่าเอาไปแมตช์ · data.code คือรหัสที่ระบบกำหนดเองสำหรับให้โปรแกรมอ่าน มีชุดจำกัดและเป็นค่าที่เอกสารชุดนี้ผูกไว้ · รหัสใหม่ใน data.code ถูกเพิ่มเข้ามาได้เสมอ ให้มีทางเดินสำรองสำหรับค่าที่ยังไม่รู้จักไว้ด้วย อย่าแตกสาขาแบบไม่มีกรณีตั้งต้น · ออเดอร์เป็นข้อยกเว้นหนึ่งข้อ: ออเดอร์ที่ถูกสร้างสำเร็จแล้วแต่ทำไม่สำเร็จภายหลัง จะรายงานความล้มเหลวไว้ในฟิลด์ของตัวออเดอร์เอง (status กับ error) โดยที่สถานะ HTTP ยังเป็น 200

ยอดในกระเป๋ากับราคาสินค้าอยู่คนละหน่วยกันได้

ราคาที่ API ประกาศ — ของสินค้า ของรายการในตลาด และของออเดอร์ — เป็น เงินบาทเสมอ และไม่มีฟิลด์สกุลเงินกำกับ เพราะไม่มีทางเป็นสกุลอื่น · จำนวนเงินอีกสองที่มีสกุลของตัวเองกำกับมาด้วยเสมอ ให้อ่านสกุลจากฟิลด์ข้าง ๆ ห้ามสมมติว่าเป็นบาท: wallet.balance ของหน้านี้ถือสกุลที่ wallet.currency บอกไว้ และยอดที่หักจริงของออเดอร์ (ฟิลด์ charged) ถือสกุลของกระเป๋า ณ ตอนที่หัก · เอาราคาสินค้าไปลบยอดในกระเป๋าตรง ๆ เพื่อดูว่าเงินพอไหมจึงผิดหน่วยทันทีที่กระเป๋าไม่ใช่บาท

ข้อมูลที่ต้องส่ง

Header

ชื่อชนิดวิธีใช้
Authorizationบังคับstring
คีย์ของคุณในรูป Bearer <คีย์> ต้องส่งมาทุกคำขอของทุกเอนด์พอยต์ และ คีย์ออกให้โดยแอดมินของร้านเท่านั้น สมัครเองไม่ได้ ไม่มีคีย์ทดสอบและไม่มี sandbox คำขอทุกใบจึงวิ่งบนระบบจริงและคำสั่งซื้อใช้เงินจริงในกระเป๋าจริง
รายละเอียดและข้อควรระวัง
  • ตัวคีย์มีรูป nx_<key_id>_<secret> คือคำนำหน้า nx ตามด้วย key_id 12 ตัวอักษร และส่วนลับ 32 ตัวอักษร ทั้งสองส่วนเป็น A-Z a-z 0-9 ล้วน คั่นกันด้วยขีดล่าง
  • ส่วนลับถูกแสดงให้เห็นครั้งเดียวตอนออกคีย์เท่านั้น ระบบเก็บไว้เฉพาะค่าแฮช ไม่ได้เก็บตัวคีย์ไว้ที่ไหนเลย จึงขอดูย้อนหลังไม่ได้ ทำหายแล้วต้องให้ร้านออกใบใหม่แล้วใบเก่าจะถูกยกเลิก
  • เก็บคีย์ไว้ฝั่งเซิร์ฟเวอร์ของคุณ อย่าฝังลงโค้ดฝั่งหน้าเว็บหรือแอปที่ผู้ใช้ปลายทางเปิดดูได้

ข้อมูลที่ได้รับ

ชื่อชนิดวิธีใช้
uidสตริง
รหัสบัญชีในระบบของร้านที่คีย์นี้ผูกอยู่ · เงินที่ใช้ซื้อของถูกหักจากกระเป๋าของบัญชีนี้ และออเดอร์ทุกใบที่สั่งด้วยคีย์นี้เป็นของบัญชีนี้
scopesอาร์เรย์ของสตริง
สิทธิ์ที่คีย์ใบนี้ถืออยู่ (scope) ซึ่งทั้งระบบมีอยู่สี่ตัว คือ catalog:read อ่านแคตตาล็อกและรายการไอดีมือสอง
รายละเอียดและข้อควรระวัง
  • orders:write สั่งซื้อและตั้งปลายทาง webhook
  • orders:read อ่านออเดอร์ของตัวเอง
  • wallet:read เอนด์พอยต์นี้
  • คีย์ใบหนึ่งถือได้หลายอัน และแอดมินของร้านเป็นคนกำหนดตอนออกคีย์
  • เอนด์พอยต์ตรวจ scope ตรงตัว ไม่มี wildcard ขาดอันไหนได้ 403 insufficient_scope ทันที
  • scope ที่แต่ละเอนด์พอยต์ต้องใช้เขียนกำกับไว้บนหัวของหน้านั้น ๆ อยู่แล้ว
wallet.balanceตัวเลข หรือ null
ยอดในกระเป๋า โดยที่ null แปลว่าอ่านยอดไม่ได้ ไม่ได้แปลว่าเป็นศูนย์
รายละเอียดและข้อควรระวัง
  • เอาไปเทียบว่าเงินพอไหมโดยตีเป็น 0 คือการปฏิเสธคำสั่งซื้อของตัวเองทั้งที่เงินอาจจะพอ
  • กระเป๋าเติมได้จากหน้าเว็บของร้านเท่านั้น เติมเงินผ่าน API ไม่ได้ และไม่มีเอนด์พอยต์สำหรับคืนเงินหรือเคลม ต้องติดต่อร้าน
wallet.currencyสตริง
สกุลเงินของยอดนั้น · เป็น THB เมื่อบัญชีไม่ได้เก็บสกุลเงินไว้
discount.tier_percentตัวเลข
ระดับส่วนลดของบัญชีคุณ หน่วยเปอร์เซ็นต์
รายละเอียดและข้อควรระวัง
  • ห้ามเอาตัวเลขนี้ไปคิดราคาเอง เพราะสินค้าแต่ละประเภทมีเพดานส่วนลดของตัวเอง ระดับที่สูงกว่าเพดานของประเภทไหน ก็จะได้แค่เท่าเพดานของประเภทนั้น ไม่ได้เท่าตัวเลขนี้
  • เป็น 0 เมื่อบัญชีไม่มีส่วนลด
  • ถ้าต้องการรู้ว่าจริง ๆ ได้กี่เปอร์เซ็นต์ ให้ดู discount.effective_percent ข้างล่าง
discount.effective_percentอ็อบเจกต์
ส่วนลดที่คุณได้จริง แยกตามประเภทสินค้า หน่วยเปอร์เซ็นต์ (คิดเพดานของประเภทนั้นให้แล้ว) โดยคีย์ของอ็อบเจกต์คือประเภทสินค้า เช่น { "cdkey": 10, "account2": 12 }
รายละเอียดและข้อควรระวัง
  • นี่เป็นตัวเลขที่ใกล้ความจริงที่สุดเท่าที่เอนด์พอยต์นี้บอกได้ แต่ ก็ยังเอาไปคำนวณราคาเองไม่ได้อยู่ดี เพราะสินค้าบางชิ้นมีราคาขั้นต่ำที่กินส่วนลดหายไปบางส่วน
  • วิธีที่ถูกคือ อ่านราคาจากแคตตาล็อก แล้วส่งราคานั้นกลับมาเป็น expected_price ตอนสั่งซื้อ ตัวเลขในฟิลด์นี้มีไว้ให้คุณเข้าใจภาพรวมและทำรายงาน ไม่ได้มีไว้ให้คิดราคา
quota.limitตัวเลข
โควตาของวันนี้ของคีย์ใบนี้ คือ 2,000 คำขอต่อวันเป็นค่าตั้งต้น นับใหม่ตอนเที่ยงคืนตามเวลาไทย (UTC+7) และปรับรายคีย์ได้
รายละเอียดและข้อควรระวัง
  • ติดต่อร้านถ้าปริมาณงานจริงเกินค่าตั้งต้น
  • ตัวเลขเดียวกับ header X-RateLimit-Limit
quota.remainingตัวเลข
จำนวนคำขอที่เหลือของวันนี้ นับรวมคำขอใบนี้ไปแล้ว
รายละเอียดและข้อควรระวัง
  • ตัวเลขเดียวกับ header X-RateLimit-Remaining
  • คำขอที่ผ่านด่านคีย์และสิทธิ์ไปแล้วกินโควตาเสมอ ไม่ว่าผลจะออกมาเป็นอะไร แม้จะจบเป็น 404 หรือ 409 ก็ตาม
quota.resets_atสตริง ISO 8601 (UTC)
เวลาที่ตัวนับจะรีเซ็ต — จุดเวลาเดียวกับ X-RateLimit-Reset แต่เขียนเป็นวันที่แทน Unix timestamp

สถานะที่อาจได้รับ

สถานะรหัสความหมาย
200
คีย์ใช้งานได้ — ได้ข้อมูลของคีย์กลับมา
ฟิลด์ทุกตัวที่เอนด์พอยต์นี้คืนมาอยู่ในตัวอย่างครบแล้ว ไม่มีตัวไหนถูกละไว้เลย แม้บางตัวจะเป็น null ได้ก็ตาม และ wallet.balance ที่เป็น null แปลว่าอ่านยอดไม่ได้ ไม่ได้แปลว่าเป็นศูนย์
รายละเอียดและข้อควรระวัง
  • ฟิลด์ใหม่ถูกเพิ่มเข้ามาในคำตอบได้ตลอดโดยไม่แจ้งล่วงหน้า ตัวอ่านฝั่งคุณต้องข้ามฟิลด์ที่ไม่รู้จักได้ ไม่ใช่ล้มทั้งคำขอ
  • คำตอบมาพร้อม header X-RateLimit-Limit X-RateLimit-Remaining และ X-RateLimit-Reset (Unix timestamp หน่วยวินาที) เสมอ
  • ทุกเอนด์พอยต์ในเอกสารชุดนี้ตอบด้วย Cache-Control: private, no-store เพราะราคาและยอดที่คืนไปขึ้นกับคีย์ที่เรียก
  • ห้ามเอาคำตอบไปแคชร่วมกันข้าม reseller หรือข้ามผู้ใช้ปลายทาง
401invalid_key
คีย์ใช้ไม่ได้ — ยิงซ้ำไม่ช่วย
ให้กลับไปตรวจว่าส่ง header ครบและคีย์ถูกใบ เพราะยิงซ้ำไม่มีทางผ่าน
รายละเอียดและข้อควรระวัง
  • มีปัญหาห้าแบบที่ตอบเหมือนกันหมดตรงนี้โดยเจตนา คือไม่ได้ส่ง header มา
  • ส่งมาแต่ไม่ใช่รูป Bearer <คีย์>
  • รูปของคีย์ผิด
  • เราไม่เคยออกคีย์ใบนั้น
  • หรือส่วนลับผิด
  • การบอกแยกคือการช่วยคนที่กำลังเดาคีย์อยู่
401key_revoked
คีย์ถูกยกเลิกไปแล้ว — ต้องขอใบใหม่
ให้ติดต่อร้านเพื่อขอคีย์ใบใหม่ ยิงซ้ำอีกกี่ครั้งก็ไม่มีทางผ่าน
รายละเอียดและข้อควรระวัง
  • คีย์ใบนี้มีอยู่จริงและส่วนลับก็ถูกต้อง แต่มันถูกยกเลิกไปแล้ว
  • เราแยกเคสนี้ออกมาจาก invalid_key เพื่อให้คุณรู้ว่าปัญหาไม่ได้อยู่ที่โค้ดหรือการเซ็ตค่าฝั่งคุณ
403insufficient_scope
คีย์ใช้ได้ แต่ไม่มีสิทธิ์ (scope) สำหรับเอนด์พอยต์นี้
ตัวคีย์เองใช้งานได้ปกติ แค่ไม่มีสิทธิ์ที่เอนด์พอยต์นี้ต้องการ
รายละเอียดและข้อควรระวัง
  • สิทธิ์ที่แต่ละเอนด์พอยต์ต้องใช้เขียนกำกับไว้บนหัวของหน้านั้น ๆ (ของหน้านี้คือ wallet:read) ให้ติดต่อร้านเพื่อขอเพิ่มสิทธิ์นั้นให้คีย์ของคุณ
  • เนื้อคำตอบไม่ได้บอกว่าขาดสิทธิ์ตัวไหน ให้ดูจากหัวหน้าเอกสารของเอนด์พอยต์ที่คุณเพิ่งยิงไป
429quota_exceeded
โควตาของวันนี้หมดแล้ว — ต้องรอถึงรอบรีเซ็ต
อ่าน Retry-After แล้วรอตามนั้นเป๊ะ ๆ อย่าตั้งเวลาถอยเอง เพราะยิงซ้ำก่อนรอบรีเซ็ตไม่มีทางผ่าน
รายละเอียดและข้อควรระวัง
  • ตัวนับของวันนี้ถูกใช้จนหมด X-RateLimit-Remaining จึงเป็น 0 และ Retry-After คือระยะทั้งหมดจนถึงรอบรีเซ็ตถัดไป ซึ่งเป็นเลขหลักหมื่นวินาทีได้
429too_many_inflight
ยิงพร้อมกันหลายคำขอเกินไป — รอไม่กี่วินาทีแล้วลองใหม่
ตอนนี้คีย์ของคุณมีคำขอที่ยังไม่จบค้างอยู่พร้อมกันเกินเพดาน (ค่าตั้งต้นคือ 5 คำขอพร้อมกัน ปรับรายคีย์ได้)
รายละเอียดและข้อควรระวัง
  • ให้ลดจำนวนคำขอที่ยิงขนานกัน แล้วลองใหม่ในอีกไม่กี่วินาที เพราะเงื่อนไขนี้หายเองทันทีที่คำขอที่ค้างอยู่ทยอยจบ
  • สังเกตว่า X-RateLimit-Remaining ไม่ใช่ศูนย์ แปลว่าโควตารายวันยังเหลือ ปัญหาอยู่ที่ความพร้อมกันอย่างเดียว จึงต้องรับมือคนละแบบกับ quota_exceeded ที่เป็น 429 เหมือนกัน
อัปเดตล่าสุด 2026-09-07