API สำหรับพาร์ตเนอร์ (B2B)
Errors & rate limits
Partner API error codes, per-key rate limits with X-RateLimit headers, and how to retry.
On this page
Error format#
เนื้อหาข้อผิดพลาดอยู่ในรูปแบบ { statusCode, code, message } โดย message เป็นข้อความภาษาอังกฤษที่อ่านเข้าใจได้และอาจเปลี่ยนแปลง จึงควรแยกเงื่อนไขตาม code เสมอ
// Success
{ "success": true, "data": ..., "total": 128, "page": 1, "limit": 20 }
// Error
{ "statusCode": 401, "code": "INVALID_API_KEY", "message": "The API key is invalid." }หมายเหตุ
Error codes#
| HTTP | code | ความหมายและวิธีแก้ไข |
|---|---|---|
| 401 | API_KEY_REQUIRED | ไม่ได้ส่งคีย์ — เพิ่มเฮดเดอร์ X-API-Key |
| 401 | INVALID_API_KEY | คีย์มีรูปแบบผิดหรือไม่รู้จัก — ตรวจสอบว่าคัดลอกครบถ้วนและไม่ใช่คีย์ Public API |
| 401 | KEY_REVOKED | คีย์ถูกเพิกถอนแล้ว — ออกคีย์ใหม่ |
| 401 | KEY_EXPIRED | คีย์หมดอายุ (รวมถึงคีย์เก่าหลังพ้นช่วงผ่อนผันการหมุนเวียนคีย์) — ใช้คีย์ใหม่ |
| 403 | PARTNER_SUSPENDED | บัญชีไม่ได้ใช้งาน — ติดต่อ esimoa |
| 403 | INSUFFICIENT_SCOPE | คำขออยู่นอกขอบเขตสิทธิ์ของคีย์ |
| 403 | IP_NOT_ALLOWED | เรียกจาก IP ที่ไม่อยู่ในรายการที่อนุญาต — เพิ่ม IP ขาออกของเซิร์ฟเวอร์คุณ |
| 404 | PRODUCT_NOT_FOUND | สินค้าที่ไม่รู้จักหรือเลิกจำหน่ายแล้ว |
| 429 | RATE_LIMITED | เกินขีดจำกัดอัตราคำขอ — ลองใหม่หลังจากจำนวนวินาทีใน Retry-After |
Rate limits#
หมายเหตุ
คำขอ API แบบ B2B มีค่าเริ่มต้น 20,000 ครั้งต่อชั่วโมงต่อคีย์
กรอบเวลา 3,600 วินาทีเริ่มนับตั้งแต่คำขอแรก และมีขีดจำกัดต่อนาทีด้วย โควตานับจากจำนวนการเรียก ไม่ใช่ MB ที่รับส่ง การตั้งค่าการดำเนินงานอาจเปลี่ยนโควตาได้
X-RateLimit-Hour-Limit · X-RateLimit-Hour-Remaining · X-RateLimit-Hour-Reset
เฮดเดอร์เหล่านี้แสดงขีดจำกัดรายชั่วโมง จำนวนการเรียกที่เหลือ และเวลารีเซ็ต (วินาที Unix) เมื่อใช้ครบโควตารายชั่วโมงจะคืนค่า HTTP 429 พร้อม Retry-After เป็นวินาที การเรียกที่ถูกปฏิเสธจากขีดจำกัดต่อนาทีจะไม่นับรวมในโควตารายชั่วโมง
ค่าเริ่มต้นคือ 300 คำขอต่อนาทีต่อคีย์ (ต่อกรอบเวลา 60 วินาที ใช้ร่วมกันทุกเซิร์ฟเวอร์) esimoa สามารถเพิ่มขีดจำกัดให้แต่ละบัญชีได้ตามสัญญา ทุกการตอบกลับที่ยืนยันตัวตนแล้วจะมีเฮดเดอร์โควตา
X-RateLimit-Limit— จำนวนคำขอที่อนุญาตต่อนาทีX-RateLimit-Remaining— จำนวนคำขอที่เหลือในช่วงเวลาปัจจุบันX-RateLimit-Reset— เวลาที่ช่วงเวลาจะรีเซ็ต (วินาที Unix)Retry-After— เมื่อได้รับ 429 คือจำนวนวินาทีที่ต้องรอก่อนลองใหม่
HTTP/1.1 200 OK
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 1790000000
HTTP/1.1 429 Too Many Requests
Retry-After: 18
{ "statusCode": 429, "code": "RATE_LIMITED", "message": "Rate limit exceeded (300 requests per minute)." }Retrying#
- เมื่อได้รับ 429 ให้รอตามจำนวนวินาทีใน Retry-After แล้วลองใหม่
- ลองส่งคำขอที่ได้ 5xx ใหม่สองสามครั้งด้วย exponential backoff
- 400, 401, 403 และ 404 จะไม่เปลี่ยนแม้ลองใหม่ — ให้แก้ไขที่สาเหตุ
- การแคชแคตตาล็อกไว้สักไม่กี่นาทีช่วยให้ใช้งานต่ำกว่าขีดจำกัดได้สบาย
async function b2bFetch(url, attempt = 0) {
const res = await fetch(url, { headers: { 'X-API-Key': process.env.ESIMOA_PARTNER_KEY } });
if (res.status === 429 && attempt < 3) {
const wait = Number(res.headers.get('Retry-After') ?? 1);
await new Promise((r) => setTimeout(r, wait * 1000));
return b2bFetch(url, attempt + 1);
}
const body = await res.json();
if (!res.ok) throw Object.assign(new Error(body.message), { code: body.code, status: res.status });
return body;
}