GW Ultimate API
Docs

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.

Reseller tip Reuse the same 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

  1. Place with PID — send a KR catalog pid (for example GWKR60) and the PUBG MOBILE KR UID in userId.
  2. Poll until code_required — the player must be online to receive the OTP.
  3. POST CODEKR — body: orderId + 4-digit code + a new trxid.
  4. Keep polling — until completed or cancelled.

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

  1. Submit — POST /orders with pid, account fields, and a new trxid.
  2. Processing — if status is processing, poll GET /orders/:orderId every 3–10s. For PUBG KR/JP, code_required means submit the OTP (steps), then keep polling.
  3. Completed — stop when status is completed (success) or cancelled (failure; read error / 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

  1. New order → new trxid. Reuse the same trxid only when you mean the same purchase.
  2. GET /history for your last purchased history; GET /orders/<id> to check one id.
  3. Balance is read-only. Need more? Top up in Telegram.
  4. Verify / redeem examples (success + fail): Reference → Redeem & verify.
GW Ultimate