คู่มือ API
การเรียกใช้งานจริงต้องมี API key — สมัครและรออนุมัติก่อน
สมัครใช้งาน APIภาพรวม
REST API สำหรับดึงสินค้า ID Offline สั่งซื้อ และรับข้อมูลบัญชีอัตโนมัติ ทุก endpoint รับ-ส่ง JSON และตัดเงินจากยอดเงินในบัญชี store ของคุณตามเรทที่ได้รับ
https://store.499k-network.com/api/v1เรียกใช้จากฝั่ง server ของคุณเท่านั้น — ห้ามฝัง API key ในหน้าเว็บหรือแอปฝั่งลูกค้าเด็ดขาด
การยืนยันตัวตน
สร้างคีย์ได้ที่หน้า API Store — ส่งคีย์ผ่าน header ได้ 2 แบบ (เลือกอย่างใดอย่างหนึ่ง)
HTTP Headers
Authorization: Bearer 499k_live_xxxxxxxxxxxxxxxxxxxxxxxx
# หรือ
x-api-key: 499k_live_xxxxxxxxxxxxxxxxxxxxxxxxSandbox (โหมดทดสอบ)
สมัครแล้วสร้างคีย์ทดสอบ (ขึ้นต้น
499k_test_) ใช้ได้ทันทีไม่ต้องรออนุมัติ — endpoint เดียวกันทั้งหมด แต่เห็นเฉพาะสินค้าทดสอบ ไม่ตัดเงินจริง ข้อมูลบัญชีและโค้ด Steam Guard เป็นของจำลอง ทดสอบสั่งซื้อสำเร็จอย่างน้อย 1 ครั้งแล้วจึงส่งคำขอใช้งานจริงได้ที่หน้า API Store| คีย์ทดสอบ (499k_test_) | คีย์จริง (499k_live_) | |
|---|---|---|
| สินค้า | สินค้าทดสอบ 1 ตัว — type sandbox product_id 999001 | สินค้าจริงทั้งหมด |
| การตัดเงิน | ยอดจำลอง ไม่ตัดเงินจริง | ตัดจากยอดเงินในบัญชี |
| เงื่อนไข | ใช้ได้ทันทีหลังสมัคร | ต้องอนุมัติ + ยอดเติมสะสมถึงขั้นต่ำ |
| เลขออเดอร์ | ขึ้นต้น TEST- | ขึ้นต้น API- |
ข้อจำกัดการเรียกใช้ (Rate Limit)
| ประเภท | จำกัด |
|---|---|
| คำขอทั่วไป (ต่อคีย์) | 60 ครั้ง/นาที |
| สั่งซื้อ (ต่อคีย์) | 10 ครั้ง/นาที |
| ระดับ IP | 120 ครั้ง/นาที |
| ขอโค้ด Steam Guard | 3 รอบ/ออเดอร์ (รอบละ 60 วิ) |
เกินจำกัดจะได้ HTTP 429 พร้อม header Retry-After (วินาที) — แนะนำให้รอตามค่านั้นแล้วลองใหม่แบบ exponential backoff และใช้ ref เดิมเมื่อ retry การสั่งซื้อ (ระบบ idempotent ไม่ตัดเงินซ้ำ)
รูปแบบ Response และ Error Codes
Envelope
สำเร็จ: {"success": true, "data": { ... }}
ผิดพลาด: {"success": false, "error": {"code": "OUT_OF_STOCK", "message": "สินค้าหมดชั่วคราว"}}| Code | HTTP | ความหมาย |
|---|---|---|
UNAUTHORIZED | 401 | ไม่พบ API key หรือคีย์ไม่ถูกต้อง |
KEY_REVOKED | 401 | คีย์ถูกเพิกถอนแล้ว (ถูกรีเซ็ตหรือถูกแอดมินปิด) |
CLIENT_NOT_APPROVED | 403 | บัญชี API ยังไม่ได้รับอนุมัติ |
CLIENT_SUSPENDED | 403 | บัญชี API ถูกระงับ |
MIN_TOPUP_REQUIRED | 403 | ยอดเติมเงินสะสมยังไม่ถึงขั้นต่ำ |
FORBIDDEN | 403 | บัญชีผู้ใช้ถูกปิดการใช้งาน |
SYSTEM_DISABLED | 503 | ระบบ API ปิดให้บริการชั่วคราว |
VALIDATION_ERROR | 422 | ข้อมูลที่ส่งมาไม่ถูกต้อง (ดู message) |
PRODUCT_NOT_FOUND | 404 | ไม่พบสินค้า |
PRODUCT_DISABLED | 404 | สินค้านี้ไม่เปิดขายผ่าน API |
OUT_OF_STOCK | 409 | สินค้าหมดชั่วคราว |
INSUFFICIENT_BALANCE | 400 | ยอดเงินไม่พอ (ดู required / balance) |
CODE_LIMIT_REACHED | 403 | ขอโค้ดครบ 3 รอบแล้ว |
CODE_UNAVAILABLE | 409 | บัญชีนี้ไม่รองรับการขอโค้ดอัตโนมัติ |
ORDER_REFUNDED | 403 | ออเดอร์ถูกคืนเงินแล้ว ขอโค้ด/ดูข้อมูลบัญชีไม่ได้ |
NOT_FOUND | 404 | ไม่พบออเดอร์ |
RATE_LIMITED | 429 | คำขอถี่เกินไป — ดู header Retry-After |
INTERNAL_ERROR | 500 | ข้อผิดพลาดภายในระบบ |
Endpoints
GET
/api/v1/meข้อมูลบัญชี API: ยอดเงิน ยอดซื้อสะสม เรทปัจจุบัน และสถานะยอดเติมขั้นต่ำ
ตัวอย่าง Response
{
"success": true,
"data": {
"client": { "first_name": "สมชาย", "last_name": "ใจดี", "website_name": "GameShop", "status": "approved" },
"balance": 5000,
"volume": 12500,
"rate_percent": 95,
"current_tier": null,
"next_tier": { "min_volume": 20000, "rate": 93, "remaining": 7500 },
"min_topup": { "required": 2000, "current": 3500, "passed": true },
"key_prefix": "499k_live_a1b2c3"
}
}GET
/api/v1/productsรายการสินค้าทั้งหมดที่เปิดขายผ่าน API — price คือราคาที่คุณจ่ายจริงตามเรทของคุณ (กรองได้: ?type=offline, ?platform=steam|epic|uplay|other) — field "type" คือประเภทสินค้า ปัจจุบันมี offline และอาจเพิ่มประเภทใหม่ในอนาคต (ดูรายการได้จาก field types)
ตัวอย่าง Response
{
"success": true,
"data": {
"products": [
{
"type": "offline",
"product_id": "1030300",
"platform": "steam",
"name": "Hollow Knight: Silksong",
"image": "https://...",
"stock": 3,
"web_price": 25,
"price": 23.75,
"rate_percent": 95
}
],
"total": 1,
"types": ["offline"]
}
}GET
/api/v1/products/{product_id}รายละเอียดสินค้าตัวเดียว + สถานะว่าง (available) — เหมาะสำหรับเช็คสต็อกก่อนสั่งซื้อ (?type= ไม่บังคับ default offline)
ตัวอย่าง Response
{
"success": true,
"data": {
"type": "offline",
"product_id": "1030300",
"platform": "steam",
"name": "Hollow Knight: Silksong",
"image": "https://...",
"stock": 3,
"available": true,
"web_price": 25,
"price": 23.75,
"rate_percent": 95
}
}POST
/api/v1/ordersสั่งซื้อสินค้า — ตัดเงินจากยอดเงินของคุณและได้ข้อมูลบัญชีทันที ต้องส่ง ref (เลขอ้างอิงฝั่งคุณ ไม่ซ้ำ, case-sensitive) เพื่อกันการสั่งซ้ำ: สั่งใหม่สำเร็จได้ HTTP 201 — ยิงซ้ำด้วย ref เดิมได้ HTTP 200 พร้อม idempotent:true โดยไม่ตัดเงินอีก (response แบบ 200 จะไม่มี balance_after) ดังนั้นให้เช็คผลจาก json.success เสมอ อย่าอิงจาก HTTP status code
ตัวอย่าง curl
curl -X POST "https://store.499k-network.com/api/v1/orders" \
-H "Authorization: Bearer 499k_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"product_id": "1030300", "ref": "my-order-0001"}'ตัวอย่าง JavaScript
const res = await fetch("https://store.499k-network.com/api/v1/orders", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.API_KEY_499K,
"Content-Type": "application/json",
},
body: JSON.stringify({ product_id: "1030300", ref: myOrderId }),
});
const json = await res.json();
if (!json.success) throw new Error(json.error.code + ": " + json.error.message);
const { order_no, account } = json.data; // account.username / account.passwordตัวอย่าง Response (201)
{
"success": true,
"data": {
"order_no": "API-260714-A1B2C3D4E5",
"type": "offline",
"product_id": "1030300",
"game_title": "Hollow Knight: Silksong",
"platform": "steam",
"web_price": 25,
"rate_percent": 95,
"price": 23.75,
"ref": "my-order-0001",
"balance_after": 4976.25,
"account": { "username": "steamuser01", "password": "p@ssw0rd" },
"code_requests": { "used": 0, "max": 3 },
"created_at": "2026-07-14T09:00:00.000Z"
}
}GET
/api/v1/orders?page=1&limit=20รายการออเดอร์ของคุณ (ใหม่สุดก่อน, limit สูงสุด 100) — ไม่รวมข้อมูลบัญชี ใช้ GET /orders/{order_no} เพื่อดูรายละเอียด
ตัวอย่าง Response
{
"success": true,
"data": {
"orders": [
{
"order_no": "API-260714-A1B2C3D4E5",
"type": "offline",
"product_id": "1030300",
"game_title": "Hollow Knight: Silksong",
"price": 23.75,
"rate_percent": 95,
"status": "success",
"code_requests_used": 1,
"ref": "my-order-0001",
"created_at": "2026-07-14T09:00:00.000Z"
}
],
"pagination": { "page": 1, "limit": 20, "total": 1 }
}
}GET
/api/v1/orders/{order_no}รายละเอียดออเดอร์ + ข้อมูลบัญชี + ประวัติการขอโค้ด
ตัวอย่าง Response
{
"success": true,
"data": {
"order_no": "API-260714-A1B2C3D4E5",
"type": "offline",
"product_id": "1030300",
"game_title": "Hollow Knight: Silksong",
"platform": "steam",
"web_price": 25,
"rate_percent": 95,
"price": 23.75,
"ref": "my-order-0001",
"status": "success",
"account": { "username": "steamuser01", "password": "p@ssw0rd" },
"code_requests": {
"used": 1,
"max": 3,
"history": [{ "reason": "ลูกค้าล็อกอินครั้งแรก", "created_at": "2026-07-14T09:05:00.000Z" }]
},
"created_at": "2026-07-14T09:00:00.000Z"
}
}POST
/api/v1/orders/{order_no}/codeขอโค้ด Steam Guard แบบหน้าต่างเวลา (เหมือนหน้าเว็บ): เรียกครั้งแรกพร้อม reason (5-500 ตัวอักษร) = เปิด 1 รอบ เปิดหน้าต่าง 60 วินาที — ภายในหน้าต่างเรียกซ้ำ (ไม่ต้องส่ง reason) เพื่อรับโค้ดล่าสุดได้ไม่จำกัด ไม่เผาโควตา (TOTP หมุนทุก 30 วิ) มีทั้งหมด 3 รอบต่อออเดอร์ พอหน้าต่างปิด เรียกอีกครั้งพร้อม reason = เปิดรอบใหม่
ตัวอย่าง Request Body (เปิดรอบใหม่)
{ "reason": "ลูกค้าล็อกอินเข้าเครื่องครั้งแรก" }ตัวอย่าง Request Body (ดึงซ้ำในหน้าต่าง)
{} // ไม่ต้องส่ง reasonตัวอย่าง Response
{
"success": true,
"data": {
"code": "ABC12",
"valid_for_sec": 21,
"window": { "expires_in_sec": 54, "new_round": true },
"code_requests": { "used": 1, "max": 3 }
}
}AI Prompt สำเร็จรูป
คัดลอกทั้งก้อนไปวางใน AI (Claude, ChatGPT ฯลฯ) เพื่อสร้างเว็บที่เชื่อมต่อ API นี้ — ตอนตั้งค่าค่อยแทน YOUR_API_KEY ด้วยคีย์จริง (อย่าส่งคีย์จริงให้ AI)
AI Prompt (ภาษาไทย)
คุณคือนักพัฒนาเว็บมืออาชีพ ช่วยสร้างเว็บไซต์ขายไอดีเกม Steam แบบ Offline ที่เชื่อมต่อกับ API ของร้านค้าต้นทางให้หน่อย
ข้อมูล API (REST, JSON ทั้งหมด):
- Base URL: https://store.499k-network.com
- การยืนยันตัวตน: ทุก request ต้องส่ง header "Authorization: Bearer YOUR_API_KEY" (หรือ "x-api-key: YOUR_API_KEY")
- Sandbox: คีย์ทดสอบ (ขึ้นต้น 499k_test_) ใช้ endpoint เดียวกันทั้งหมด แต่เห็นเฉพาะสินค้าทดสอบ type "sandbox" product_id "999001" และไม่ตัดเงินจริง — ให้ทำระบบด้วยคีย์ทดสอบก่อน เสร็จแล้วสลับเป็นคีย์จริงได้เลยโดยไม่ต้องแก้โค้ด (เก็บคีย์ใน env variable)
- สำคัญมาก: ต้องเรียก API จากฝั่ง server ของเว็บเท่านั้น (API route / backend) ห้ามใส่ API key ในโค้ดฝั่ง browser เด็ดขาด
- รูปแบบ response สำเร็จ: {"success":true,"data":{...}} / ผิดพลาด: {"success":false,"error":{"code":"...","message":"..."}}
Endpoints:
1) GET https://store.499k-network.com/api/v1/me
ข้อมูลบัญชี: data = { client:{first_name,last_name,website_name,status}, balance, volume, rate_percent, current_tier, next_tier:{min_volume,rate,remaining}|null, min_topup:{required,current,passed}, key_prefix }
2) GET https://store.499k-network.com/api/v1/products (optional ?type=offline, ?platform=steam|epic|uplay|other)
รายการสินค้า: data = { products:[{ type, product_id, platform, name, image, stock, web_price, price, rate_percent }], total, types }
- price คือราคาที่เราต้องจ่ายจริง (หักเรทแล้ว) — เว็บของเราควรบวกกำไรเองก่อนแสดงขายต่อ
- type คือประเภทสินค้า (ตอนนี้มี "offline" — อาจมีประเภทใหม่เพิ่มในอนาคต ดูได้จาก field types)
- product_id ของ type offline คือ appid ของเกม (string ตัวเลข)
3) GET https://store.499k-network.com/api/v1/products/{product_id} (optional ?type=offline, default offline)
สินค้าตัวเดียว: data = { type, product_id, platform, name, image, stock, available, web_price, price, rate_percent }
4) POST https://store.499k-network.com/api/v1/orders
body: {"product_id":"123456","ref":"เลขออเดอร์ฝั่งเราที่ไม่ซ้ำ","type":"offline"} (type ไม่บังคับ default "offline")
- ref จำเป็น: a-z A-Z 0-9 _ - ยาวไม่เกิน 64 ตัว (case-sensitive) แนะนำใช้ UUID ต่อ 1 ออเดอร์
- สั่งซื้อใหม่สำเร็จ (HTTP 201): data = { order_no, type, product_id, game_title, platform, web_price, rate_percent, price, ref, balance_after, account:{username,password}, code_requests:{used,max}, created_at }
- ยิงซ้ำด้วย ref เดิม (HTTP 200): ได้ออเดอร์เดิมกลับมา ไม่ตัดเงินซ้ำ — data เพิ่ม idempotent:true และ status แต่ "ไม่มี" balance_after ดังนั้นเช็คผลจาก json.success เสมอ อย่าเช็คจาก HTTP status code หรือ balance_after
- ต้องเก็บ order_no ไว้เสมอ และแสดง username/password ให้ลูกค้าปลายทาง
5) GET https://store.499k-network.com/api/v1/orders?page=1&limit=20
รายการออเดอร์ (ไม่มีข้อมูลบัญชี): data = { orders:[{order_no, type, product_id, game_title, price, rate_percent, status, code_requests_used, ref, created_at}], pagination:{page,limit,total} }
6) GET https://store.499k-network.com/api/v1/orders/{order_no}
รายละเอียด + ข้อมูลบัญชี: data = { ...เหมือนตอนสั่งซื้อ, account:{username,password}, code_requests:{used,max,history:[{reason,created_at}]} }
7) POST https://store.499k-network.com/api/v1/orders/{order_no}/code
ขอโค้ด Steam Guard สำหรับล็อกอิน: body {"reason":"เหตุผล 5-500 ตัวอักษร เช่น ลูกค้าล็อกอินครั้งแรก"}
- โมเดลหน้าต่างเวลา (เหมือนหน้าเว็บ): เรียกครั้งแรกต้องส่ง reason = "เปิด 1 รอบ" เปิดหน้าต่าง 60 วินาที
- ภายในหน้าต่าง 60 วิ เรียก endpoint นี้ซ้ำได้ไม่จำกัดเพื่อรับโค้ดล่าสุด (TOTP หมุนทุก 30 วิ) โดยไม่ต้องส่ง reason และไม่เผาโควตา
- มีทั้งหมด 3 รอบต่อออเดอร์ — พอหน้าต่างปิดแล้วเรียกอีกครั้ง (พร้อม reason) = เปิดรอบใหม่ (เผาโควตา 1)
- data = { code, valid_for_sec, window:{expires_in_sec, new_round}, code_requests:{used,max} } — used = จำนวนรอบที่เปิดไปแล้ว, window.expires_in_sec = หน้าต่างเหลือกี่วินาที
Error codes ที่ต้องรองรับ: UNAUTHORIZED(401), KEY_REVOKED(401), CLIENT_NOT_APPROVED(403), CLIENT_SUSPENDED(403), MIN_TOPUP_REQUIRED(403), SYSTEM_DISABLED(503), VALIDATION_ERROR(422), PRODUCT_NOT_FOUND(404), PRODUCT_DISABLED(404), OUT_OF_STOCK(409), INSUFFICIENT_BALANCE(400 พร้อม required/balance), CODE_LIMIT_REACHED(403), CODE_UNAVAILABLE(409), ORDER_REFUNDED(403), NOT_FOUND(404), RATE_LIMITED(429 พร้อม header Retry-After), INTERNAL_ERROR(500)
Rate limit: ทั่วไป 60 req/นาที/คีย์, สั่งซื้อ 10 ครั้ง/นาที — ถ้าเจอ 429 ให้รอตาม Retry-After แล้วค่อยลองใหม่ (exponential backoff) และ retry การสั่งซื้อด้วย ref เดิมเสมอ
สิ่งที่ต้องมีในเว็บ:
1. หน้ารายการสินค้า: ดึงจาก /api/v1/products (ผ่าน backend ของเราเอง + cache สั้น ๆ ประมาณ 1 นาที) แสดงรูป ชื่อเกม ราคาขาย (price ของเรา + กำไรที่เราตั้ง) และสถานะสต็อก
2. หน้าสั่งซื้อ/ชำระเงิน: ตามระบบชำระเงินของเว็บเรา เมื่อลูกค้าจ่ายเงินสำเร็จค่อยยิง POST /orders ด้วย ref ที่ gen ไว้ (UUID) — ถ้า error ให้แจ้งลูกค้าและ retry ด้วย ref เดิมได้อย่างปลอดภัย
3. หน้าออเดอร์ของลูกค้า: แสดง username/password (มีปุ่มคัดลอก) + ปุ่ม "ขอโค้ด Steam Guard" ที่ให้กรอกเหตุผลก่อนขอ (เปิดรอบ) จากนั้นภายใน 60 วิ auto-refresh โค้ดจาก endpoint เดิม (ไม่ต้อง reason) แสดงนับถอยหลัง valid_for_sec + หน้าต่างเหลือ window.expires_in_sec และจำนวนรอบคงเหลือ (max 3)
4. จัดการ error ทุก code ข้างต้นเป็นข้อความภาษาไทยที่ลูกค้าเข้าใจง่าย โดยเฉพาะ OUT_OF_STOCK และ INSUFFICIENT_BALANCE (อันหลังคือเงินของ "เรา" ในร้านต้นทางหมด — แจ้งแอดมินเว็บเรา ไม่ใช่ลูกค้า)
5. เก็บ log การเรียก API ฝั่งเราไว้ตรวจสอบย้อนหลัง
เริ่มจากถามเทคโนโลยีที่ฉันใช้ (เช่น Next.js/PHP/Node) แล้วเขียนโค้ดให้ครบทุกส่วนจัดการคีย์และดูเรทได้ที่หน้า API Store — ติดปัญหาติดต่อทีมงานได้เลย