TH Gamers Bot API Customer care · @thgamesbot

Reference

Base URL: https://api.thgamersbot.cc. Every request needs X-API-Key or Authorization: Bearer <key>.

API URL Prefix every path with https://api.thgamersbot.cc (example: POST /orders).

GET /services

Games and what each one needs in the order body (userId, zoneId, serverId, …). Unavailable games don’t show up.

Response: { "success": true, "services": [ ... ] }

Each service includes: productName, slug, gameName, required (array of field + label), status. Some lines may also include serverIdOptions or regionOptions when a server/region is required. Pack ids: Games & PIDs.

curl -X GET "https://api.thgamersbot.cc/services" -H "X-API-Key: YOUR_API_KEY"

GET /products and /catalog

Alias: GET /catalog returns the same payload as GET /products.

The product database for ordering: one row per active pack with a stable id (THPID). That value is what you pass as pid on POST /orders. Rows include slug, gameName, serviceName, price, stock where applicable, etc.

For gamekey and giftcard (and PUBG stock packs), each row also includes quantity = live available stock, plus inStock, quantityMin, and quantityMax (capped by stock, max 500 per order).

curl -X GET "https://api.thgamersbot.cc/products" -H "X-API-Key: YOUR_API_KEY"

// gamekey / giftcard example
{
  "success": true,
  "products": [
    {
      "id": "THPK60",
      "slug": "gamekeypubg",
      "gameName": "Game Keys — PUBG Mobile",
      "serviceName": "60UC",
      "category": "gamekeypubg",
      "price": 0.858,
      "quantityMin": 1,
      "quantityMax": 42,
      "inStock": true,
      "quantity": 42,
      "status": "active"
    }
  ]
}
id → pid Copy products[i].id from this response into the order body as pid (or PID).

GET /my-ip

Your public IP as our side sees it.

curl -X GET "https://api.thgamersbot.cc/my-ip" -H "X-API-Key: YOUR_API_KEY"

// { "success": true, "ip": "203.0.113.4" }

GET /balance

Check your account balance (USD). Read-only; top up in Telegram.

curl -X GET "https://api.thgamersbot.cc/balance" -H "X-API-Key: YOUR_API_KEY"

// 200
{
  "success": true,
  "balanceUsd": 12.5,
  "currency": "USD"
}

POST /orders

Submit / create an order. Game is picked from the pid (catalog id). On success you get the same invoice shape as GET /orders/:orderId.

Body (unified)

Field Notes
pid / PID Required. THPID from GET /productsid.
trxid (or trxId, idtrx, idTrx) Your id for the order. New purchase → new trxid.
userId / userID Required for most games (player / uid / Riot ID / Zepeto username as defined by the line).
zoneId Required for ML-style lines (numeric zone).
serverId Required for Wuthering Waves, Identity V, and similar. Once Human also accepts region shortcuts (eu, na, …).
quantity Only for gamekey and giftcard kinds (1–500 per order). Over 500 → rejected with QUANTITY EXCEEDS MAX (no silent cap).
idempotencyKey / idempotency Optional; if omitted, trxid is used for idempotency as implemented.
curl -X POST "https://api.thgamersbot.cc/orders" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{"pid":"THP60","userId":"51234567890","trxid":"ORD-1001"}'

Responses — submit / processing / completed

orderCreated: true means the order was accepted. Poll GET /orders/:orderId while status is processing. Stop on completed or cancelled. Empty fields may be omitted.

Accepted — still processing (200)

{
  "orderCreated": true,
  "orderId": "TH-API-PBG-A1B2C3-D4E5F6A7",
  "status": "processing",
  "game": "pubg",
  "packName": "60 UC",
  "amountUsd": 0.99,
  "durationSec": 1,
  "userId": "51234567890"
}

Completed (200) — instant fulfillment, or after polling

{
  "orderCreated": true,
  "orderId": "TH-API-PBG-A1B2C3-D4E5F6A7",
  "status": "completed",
  "game": "pubg",
  "packName": "60 UC",
  "amountUsd": 0.99,
  "durationSec": 34,
  "userId": "51234567890"
}

Gamekey / gift card completed (200) — includes delivered codes

{
  "orderCreated": true,
  "orderId": "TH-API-GK-A1B2C3-D4E5F6A7",
  "status": "completed",
  "game": "gamekey",
  "packName": "60 UC Code",
  "amountUsd": 0.95,
  "durationSec": 2,
  "codes": ["XXXX-XXXX-XXXX", "YYYY-YYYY-YYYY"]
}

Rejected at submit (400) — no order created

{
  "orderCreated": false,
  "status": "cancelled",
  "game": "pubg",
  "error": "INSUFFICIENT BALANCE"
}

Other submit failures

// 400
{ "success": false, "error": "INVALID BODY" }
{ "success": false, "error": "INVALID REQUEST" }
{ "success": false, "error": "UNKNOWN PID" }
{ "success": false, "error": "INVALID PACK" }
{ "success": false, "error": "GAME DISABLED" }

// 403 — trxid owned by another API user
{ "success": false, "code": "FORBIDDEN", "error": "FORBIDDEN" }

// 429 — same order still in flight
{ "success": false, "code": "DUPLICATE_IN_FLIGHT", "error": "DUPLICATE_IN_FLIGHT" }

// 503
{ "success": false, "code": "MAINTENANCE", "error": "MAINTENANCE" }
{ "success": false, "code": "API_ORDER_DISABLED", "error": "API_ORDER_DISABLED" }

Idempotent replay (200) — same trxid again

{
  "orderCreated": true,
  "orderId": "TH-API-PBG-A1B2C3-D4E5F6A7",
  "status": "completed",
  "game": "pubg",
  "packName": "60 UC",
  "amountUsd": 0.99,
  "durationSec": 120,
  "userId": "51234567890",
  "idempotentReplay": true
}

Walkthrough: Orders & status. Fixed subscription / CN PIDs: Games & PIDs.

Downtime: you may get 503 and MAINTENANCE or API_ORDER_DISABLED — see errors.

GET /history

Your last purchased history — recent orders for your account, newest first. Same invoice shape as GET /orders/:orderId (and successful POST /orders). Single-order lookup: GET /orders/:orderId.

Query: simple limit

Default limit=30 (min 1, max 200).

curl -G "https://api.thgamersbot.cc/history" \
  -H "X-API-Key: YOUR_API_KEY" \
  --data-urlencode "limit=25"

// 200
{
  "success": true,
  "count": 25,
  "orders": [ { "orderId": "TH-API-PBG-…", "status": "completed", "game": "pubg", ... }, ... ]
}

Query: pagination

Pass page to switch to paged mode (optional pageSize, default 20, max 50). Response includes total and hasMore.

curl -G "https://api.thgamersbot.cc/history" \
  -H "X-API-Key: YOUR_API_KEY" \
  --data-urlencode "page=1" \
  --data-urlencode "pageSize=20"
Id lookup Use a specific public or internal id with GET /orders/:orderId after POST /orders (see Guides: lifecycle & examples).

GET /orders/:orderId

Check status for one order on your account. Same invoice fields as a successful POST /orders.

curl -X GET "https://api.thgamersbot.cc/orders/TH-API-PBG-A1B2C3-D4E5F6A7" \
  -H "X-API-Key: YOUR_API_KEY"

Still processing (200)

{
  "orderCreated": true,
  "orderId": "TH-API-PBG-A1B2C3-D4E5F6A7",
  "status": "processing",
  "game": "pubg",
  "packName": "60 UC",
  "amountUsd": 0.99,
  "durationSec": 45,
  "userId": "51234567890"
}

Completed (200)

{
  "orderCreated": true,
  "orderId": "TH-API-PBG-A1B2C3-D4E5F6A7",
  "status": "completed",
  "game": "pubg",
  "packName": "60 UC",
  "amountUsd": 0.99,
  "durationSec": 52,
  "userId": "51234567890"
}

Cancelled / failed after placement (200)

{
  "orderCreated": true,
  "orderId": "TH-API-PBG-A1B2C3-D4E5F6A7",
  "status": "cancelled",
  "game": "pubg",
  "packName": "60 UC",
  "amountUsd": 0.99,
  "durationSec": 18,
  "userId": "51234567890",
  "error": "INVALID PLAYER",
  "refunded": true
}

Not found (404)

{
  "success": false,
  "error": "ORDER NOT FOUND"
}

404 if the id does not belong to your account or does not exist.

TH Gamers Bot API · Public documentation