01เริ่มต้น
ภาพรวม
API นี้ใช้สั่งเติมเกมให้ผู้เล่นด้วย Player ID โดยหักจากเครดิตในบัญชีของคุณ เครดิตมีหน่วยเป็นบาท (1 เครดิต = 1 บาท) ขั้นตอนการใช้งานมี 3 ขั้น:
- ดูรายการและราคาด้วย
GET /v1/items - สั่งเติมด้วย
POST /v1/ordersระบบหักเครดิตทันที - อ่านผลจากคำตอบ หรือเช็คต่อด้วย
GET /v1/orders/{id}ถ้าเติมไม่สำเร็จ ระบบคืนเครดิตให้เอง
Base URL
ทุกคำขอและคำตอบเป็น JSON (Content-Type: application/json) คำตอบที่สำเร็จมี "ok": true เสมอ
การยืนยันตัวตน
ส่ง API key ของคุณใน header x-api-key ทุกคำขอ key ขึ้นต้นด้วย tg_ สร้างได้เองจากหน้า บัญชีของฉัน หลังเข้าสู่ระบบด้วย LINE
x-api-key: tg_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ลองเรียกดู
ใส่ API key เพื่อเช็คยอดเครดิตหรือดูรายการจากหน้านี้ key ไม่ถูกบันทึก และส่งไปที่ API นี้เท่านั้น
02เส้น API
ยอดเครดิต
คืนชื่อบัญชีและยอดเครดิตคงเหลือ
{
"ok": true,
"name": "ร้านของคุณ",
"credit": 850.5
}รายการและราคา
game เป็น freefire หรือ rov คำตอบมีเฉพาะรายการที่เปิดขายอยู่ และราคาเป็นราคาของบัญชีคุณ ซึ่งคือราคาที่จะถูกหักจากเครดิตจริง
item_id หรือราคาตายตัวในโค้ด{
"ok": true,
"game": "freefire",
"count": 11,
"items": [
{
"item_id": 80,
"name": "30 Diamond",
"type": "point",
"amount": 30,
"bonus": 3,
"retail": 10,
"price": 9.7,
"image": "https://..."
}
]
}| ฟิลด์ | ความหมาย |
|---|---|
| item_id | รหัสรายการ ใช้ตอนสั่งเติม |
| type | point = เพชร/คูปอง, membership = สมาชิก, item = ไอเทม/พาส |
| amount / bonus | จำนวนที่ได้ และโบนัสที่ได้เพิ่ม |
| retail | ราคาเต็มหน้าเว็บเติมเกม หน่วยเป็นบาท ใช้เทียบส่วนต่างหรือตั้งราคาขายของคุณ |
| price | ราคาที่หักจากเครดิตของคุณ หน่วยเป็นบาท (1 เครดิต = 1 บาท) มีทศนิยมได้ 2 ตำแหน่ง |
สั่งเติม
| ฟิลด์ | จำเป็น | ความหมาย |
|---|---|---|
| game | ใช่ | freefire หรือ rov |
| item_id | ใช่ | รหัสรายการจาก /v1/items ต้องเป็นรายการที่เปิดขายอยู่ |
| player_id | ใช่ | Free Fire: UID ผู้เล่น · ROV: OpenID ของผู้เล่น |
| ref | แนะนำ | เลขอ้างอิงของคุณเอง ไม่เกิน 64 ตัวอักษร ห้ามซ้ำกันในบัญชีของคุณ |
{
"game": "freefire",
"item_id": 80,
"player_id": "1911341532",
"ref": "order-0001"
}คำตอบ:
{
"ok": true,
"order": {
"id": 1024,
"ref": "order-0001",
"game": "freefire",
"item_id": 80,
"item_name": "30 Diamond",
"player_id": "1911341532",
"price": 9.7,
"status": "success",
"created_at": "2026-11-15T03:10:00.000Z",
"updated_at": "2026-11-15T03:10:04.000Z"
}
}ref ทุกครั้ง ถ้าส่ง ref เดิมซ้ำ ระบบจะคืนออเดอร์เดิมพร้อม "duplicate": true โดยไม่เติมซ้ำและไม่หักเครดิตซ้ำ ถ้าเน็ตหลุดหรือไม่ได้คำตอบ ให้ส่งคำขอเดิมด้วย ref เดิมได้อย่างปลอดภัยคำขอนี้รอผลให้สูงสุดราว 25 วินาที ถ้ายังไม่เสร็จ จะได้ status เป็น queued หรือ processing ให้เช็คต่อด้วยเส้นถัดไป แนะนำตั้ง timeout ฝั่งคุณไว้ที่ 40 วินาทีขึ้นไป
เช็คสถานะออเดอร์
ค้นด้วยเลขออเดอร์ของระบบ หรือด้วย ref ของคุณ คำตอบมี order รูปแบบเดียวกับตอนสั่งเติม ถ้าสถานะยังเป็น queued หรือ processing ให้เช็คใหม่ทุก 3 ถึง 5 วินาที
ออเดอร์ล่าสุด
คืนออเดอร์ล่าสุดของคุณ เรียงจากใหม่ไปเก่า limit ได้ 1 ถึง 100 (ค่าเริ่มต้น 20)
03อ้างอิง
สถานะออเดอร์
| สถานะ | ความหมาย | เครดิต | ต้องทำอะไร |
|---|---|---|---|
| queued | รอคิว | หักแล้ว | เช็คสถานะต่อ |
| processing | กำลังเติม | หักแล้ว | เช็คสถานะต่อ |
| success | เติมสำเร็จ | หักแล้ว | จบ |
| failed | เติมไม่สำเร็จ ดูเหตุผลใน error | คืนให้แล้ว | แก้ไขแล้วสั่งใหม่ด้วย ref ใหม่ |
| unknown | ส่งคำสั่งแล้วแต่ยังยืนยันผลไม่ได้ | กันไว้ | อย่าสั่งซ้ำ รอผู้ดูแลตรวจ สถานะจะเปลี่ยนเป็น success หรือ failed |
ข้อผิดพลาด
เมื่อคำขอผิดพลาด จะได้ HTTP status ที่ไม่ใช่ 200 พร้อมเนื้อหา:
{
"ok": false,
"error": "Not enough credit",
"code": "insufficient_credit"
}| HTTP | code | ความหมาย |
|---|---|---|
| 400 | invalid_game / invalid_item / invalid_player / invalid_ref / invalid_json | ข้อมูลที่ส่งมาไม่ถูกต้อง |
| 401 | unauthorized | ไม่มี API key หรือ key ไม่ถูกต้อง |
| 402 | insufficient_credit | เครดิตไม่พอ ติดต่อผู้ดูแลเพื่อเติมเครดิต |
| 403 | disabled | บัญชีถูกปิดใช้งาน |
| 404 | item_not_found / order_not_found | item_not_found: ไม่มีรายการนี้ หรือรายการปิดขายอยู่ ให้ดึง /v1/items ใหม่ · order_not_found: ไม่พบออเดอร์ในบัญชีของคุณ |
| 429 | rate_limited | เรียกถี่เกินไป รอสักครู่แล้วลองใหม่ |
| 502 | service_unavailable | ระบบเติมเกมไม่พร้อมชั่วคราว ลองใหม่ภายหลัง |
ออเดอร์ที่สร้างสำเร็จแต่เติมไม่ผ่าน จะได้ HTTP 200 และ status: "failed" โดยมีเหตุผลใน order.error เช่น Player ID ไม่ถูกต้อง หรือ service_unavailable
ข้อจำกัด
- เรียก API ได้ไม่เกิน 120 ครั้งต่อนาทีต่อบัญชี
- ระบบเติมทีละออเดอร์ตามคิว ออเดอร์ Free Fire ใช้เวลาราว 30 วินาทีต่อรายการเมื่อมีคิว
- ตรวจ Player ID ให้ถูกก่อนสั่ง ออเดอร์ที่เติมสำเร็จแล้วยกเลิกหรือคืนเครดิตไม่ได้
- ราคาที่หักคือราคา ณ ตอนสั่ง ดูได้จาก
order.priceในคำตอบ ถ้าราคาเปลี่ยนหลังจากนั้น ออเดอร์เดิมไม่ถูกคิดเพิ่ม - เครดิตเติมผ่านผู้ดูแลระบบเท่านั้น ยังไม่มีเส้น API สำหรับเติมเครดิตเอง ดูยอดและประวัติคำสั่งได้ที่หน้าบัญชีของฉัน
- เรียกผ่าน HTTPS เท่านั้นเมื่อใช้งานจริง
ตัวอย่างโค้ด
ตัวอย่างสั่งเติมแล้วรอผลจนเสร็จ แทน tg_xxx ด้วย API key ของคุณ
curl -X POST "{BASE}/v1/orders" \
-H "x-api-key: tg_xxx" \
-H "Content-Type: application/json" \
-d '{"game":"freefire","item_id":80,"player_id":"1911341532","ref":"order-0001"}'
# เช็คสถานะ
curl "{BASE}/v1/orders?ref=order-0001" -H "x-api-key: tg_xxx"
const BASE = '{BASE}';
const headers = { 'x-api-key': process.env.TOPUP_API_KEY, 'Content-Type': 'application/json' };
async function topup(game, itemId, playerId, ref) {
let res = await fetch(`${BASE}/v1/orders`, {
method: 'POST',
headers,
body: JSON.stringify({ game, item_id: itemId, player_id: playerId, ref }),
signal: AbortSignal.timeout(40000),
});
let data = await res.json();
if (!data.ok) throw new Error(`${data.code}: ${data.error}`);
// ยังไม่เสร็จ: เช็คต่อทุก 4 วินาที
while (['queued', 'processing'].includes(data.order.status)) {
await new Promise((r) => setTimeout(r, 4000));
res = await fetch(`${BASE}/v1/orders/${data.order.id}`, { headers });
data = await res.json();
}
return data.order; // status: success | failed | unknown
}
const order = await topup('freefire', 80, '1911341532', 'order-0001');
console.log(order.status, order.error ?? '');
<?php
$base = '{BASE}';
$key = getenv('TOPUP_API_KEY');
function call($method, $url, $key, $body = null) {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 40,
CURLOPT_HTTPHEADER => ["x-api-key: $key", 'Content-Type: application/json'],
]);
if ($body !== null) curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
return $res;
}
$data = call('POST', "$base/v1/orders", $key, [
'game' => 'freefire', 'item_id' => 80, 'player_id' => '1911341532', 'ref' => 'order-0001',
]);
if (empty($data['ok'])) exit("{$data['code']}: {$data['error']}\n");
// ยังไม่เสร็จ: เช็คต่อทุก 4 วินาที
while (in_array($data['order']['status'], ['queued', 'processing'])) {
sleep(4);
$data = call('GET', "$base/v1/orders/{$data['order']['id']}", $key);
}
echo $data['order']['status'], "\n"; // success | failed | unknown
import os, time, requests
BASE = "{BASE}"
HEADERS = {"x-api-key": os.environ["TOPUP_API_KEY"]}
def topup(game, item_id, player_id, ref):
r = requests.post(f"{BASE}/v1/orders", headers=HEADERS, timeout=40,
json={"game": game, "item_id": item_id, "player_id": player_id, "ref": ref})
data = r.json()
if not data["ok"]:
raise RuntimeError(f'{data.get("code")}: {data["error"]}')
# ยังไม่เสร็จ: เช็คต่อทุก 4 วินาที
while data["order"]["status"] in ("queued", "processing"):
time.sleep(4)
data = requests.get(f'{BASE}/v1/orders/{data["order"]["id"]}', headers=HEADERS, timeout=20).json()
return data["order"] # status: success | failed | unknown
order = topup("freefire", 80, "1911341532", "order-0001")
print(order["status"], order.get("error", ""))