Orders & status
Base URL: https://api.sonofutred.com.
Use pid from GET https://api.sonofutred.com/products.
Fast delivery — place an order, then check status when you need an update.
trxid on retries so you never double-charge.
GET vs POST (rules)
GET: no body. Query string only when we show it (e.g. /history?limit=20).
POST: Content-Type: application/json when a body is listed.
| Goal | Method & path |
|---|---|
| Service lines & field requirements | GET /services |
| Catalog (GWPIDs, prices, stock where applicable) | GET /products or /catalog |
| Public IP the API sees | GET /my-ip |
| Balance in USD (read only) | GET /balance |
| Order history (newest first) or paginated | GET /history?limit= … |
| One order by id (poll status) | GET /orders/:orderId |
| Place an order | POST /orders |
| PUBG / ML verify, PUBG redeem (see ref) | POST /pubgvvfy, /mlvfy, /rdmpubg |
GWPID (pid)
GET /products → use id as pid.
userId only
{
"pid": "GWP60",
"userId": "51234567890",
"trxid": "INV-10001"
}
PUBG Mobile KR/JP (OTP)
Enter the PUBG MOBILE KR UID in userId.
Use the same POST /orders endpoint. After placement the order may
stay processing, then move to code_required until you
submit the 4-digit OTP.
| Field | Description |
|---|---|
pid |
KR pack from the catalog, e.g. GWKR60, GWKR190, GWKR660, GWKR1800, GWKR3850, GWKR8100 |
userId |
PUBG MOBILE KR UID |
trxid |
Your unique merchant reference (required on every call, including OTP) |
1 — Place KR order
POST /orders
Content-Type: application/json
X-Api-Key: YOUR_API_KEY
{
"trxid": "MERCHANT-KR-2001",
"pid": "GWKR60",
"userId": "6123456789"
}
2 — OTP required response
Poll GET /orders/:orderId until you see this status.
{
"orderCreated": true,
"orderId": "GW-API-PKR-A1B2C3-D4E5F6A7",
"status": "code_required",
"game": "pubgkr",
"packName": "60UC",
"amountUsd": 1,
"userId": "6123456789",
"message": "OTP required — POST pid=CODEKR with orderId and code"
}
3 — Submit OTP (pid=CODEKR)
Same endpoint. Send the public orderId from step 2 and the
4-digit OTP. Use a new trxid for this request.
POST /orders
Content-Type: application/json
X-Api-Key: YOUR_API_KEY
{
"trxid": "MERCHANT-KR-2001-OTP",
"pid": "CODEKR",
"orderId": "GW-API-PKR-A1B2C3-D4E5F6A7",
"code": "1234"
}
Process
- Place with PID — send a KR catalog
pid(for exampleGWKR60) and the PUBG MOBILE KR UID inuserId. - Poll until
code_required— the player must be online to receive the OTP. - POST
CODEKR— body:orderId+ 4-digitcode+ a newtrxid. - Keep polling — until
completedorcancelled.
userId + zoneId
{
"pid": "GWML86",
"userId": "123456789",
"zoneId": "1234",
"trxid": "ML-ORD-2001"
}
userId + serverId
{
"pid": "GWGI6480",
"userId": "800012345",
"serverId": "asia",
"trxid": "GI-ORD-3001"
}
RIOT ID
{
"pid": "GWVALMY475",
"userId": "Player Name#TAG",
"trxid": "VAL-ORD-5001"
}
Once Human
{
"pid": "GWOH62",
"userId": "player_01",
"region": "Europe",
"moreId": "srv001",
"trxid": "OH-ORD-6001"
}
{
"orderCreated": true,
"orderId": "GW-API-OH-A1B2C3-D4E5F6A7",
"status": "processing",
"game": "oncehuman",
"userId": "player_01",
"serverId": "Europe",
"moreId": "srv001",
"amountUsd": 0.99
}
{
"orderCreated": true,
"orderId": "GW-API-OH-A1B2C3-D4E5F6A7",
"status": "completed",
"game": "oncehuman",
"amountUsd": 0.99,
"durationSec": 12
}
{
"orderCreated": false,
"status": "cancelled",
"game": "oncehuman",
"error": "INSUFFICIENT BALANCE"
}
PUBG Subscription
{
"pid": "GWPSP1",
"userId": "51234567890",
"trxid": "PS-ORD-7001"
}
Live apps
{
"pid": "GWBGO100",
"userId": "1234567890",
"trxid": "LIVE-ORD-8001"
}
Free Fire
{
"pid": "GWFFBD100",
"userId": "123456789",
"trxid": "FF-ORD-9001"
}
Game keys & gift cards
{
"pid": "GWGKPU60",
"quantity": 2,
"trxid": "GK-BULK-4001"
}
Place an order
- Submit —
POST /orderswithpid, account fields, and a newtrxid. - Processing — if
statusisprocessing, pollGET /orders/:orderIdevery 3–10s. For PUBG KR/JP,code_requiredmeans submit the OTP (steps), then keep polling. - Completed — stop when
statusiscompleted(success) orcancelled(failure; readerror/refunded).
Balance
{
"success": true,
"balanceUsd": 12.5,
"currency": "USD"
}
Submit — POST /orders → processing
curl -X POST "https://api.sonofutred.com/orders" \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{"pid":"GWPUBG60","userId":"51234567890","trxid":"ORD-1001"}'
// Response 200
{
"orderCreated": true,
"orderId": "GW-API-PBG-A1B2C3-D4E5F6A7",
"status": "processing",
"game": "pubg",
"packName": "60 UC",
"amountUsd": 0.99,
"durationSec": 1,
"userId": "51234567890"
}
Completed
{
"orderCreated": true,
"orderId": "GW-API-PBG-A1B2C3-D4E5F6A7",
"status": "completed",
"game": "pubg",
"packName": "60 UC",
"amountUsd": 0.99,
"durationSec": 34,
"userId": "51234567890"
}
Cancelled after placement
{
"orderCreated": true,
"orderId": "GW-API-PBG-A1B2C3-D4E5F6A7",
"status": "cancelled",
"game": "pubg",
"packName": "60 UC",
"amountUsd": 0.99,
"durationSec": 18,
"userId": "51234567890",
"error": "INVALID PLAYER",
"refunded": true
}
Rejected at submit
{
"success": false,
"error": "UNKNOWN PID"
}
{
"orderCreated": false,
"status": "cancelled",
"game": "pubg",
"error": "INSUFFICIENT BALANCE"
}
GET /history
{
"success": true,
"count": 10,
"orders": [
{
"orderCreated": true,
"orderId": "GW-API-PBG-A1B2C3-D4E5F6A7",
"status": "completed",
"game": "pubg",
"packName": "60 UC",
"amountUsd": 0.99,
"userId": "51234567890"
}
]
}
GET /orders/:id
{
"orderCreated": true,
"orderId": "GW-API-PBG-A1B2C3-D4E5F6A7",
"status": "completed",
"game": "pubg",
"packName": "60 UC",
"amountUsd": 0.99,
"durationSec": 12,
"userId": "51234567890"
}
Order status
| Status | Meaning | Poll? |
|---|---|---|
processing |
Accepted — fulfillment in progress (pending is mapped to this) |
Yes — every 3–10s |
code_required |
PUBG KR/JP is waiting for the 4-digit OTP. POST pid=CODEKR with orderId and code, then keep polling. |
Yes — after you submit the OTP |
completed |
Delivered successfully | No |
cancelled |
Failed / rejected — see error, refunded |
No |
orderCreated |
status |
Meaning |
|---|---|---|
true |
processing |
Submit accepted; still working |
true |
code_required |
PUBG KR/JP — send the 4-digit OTP, then poll again |
true |
completed |
Done |
true |
cancelled |
Placed then failed (often refunded) |
false |
cancelled |
Rejected at submit (e.g. no balance, bad pid) |
Tips
- New order → new
trxid. Reuse the sametrxidonly when you mean the same purchase. GET /historyfor your last purchased history;GET /orders/<id>to check one id.- Balance is read-only. Need more? Top up in Telegram.
- Verify / redeem examples (success + fail): Reference → Redeem & verify.