EpinBy Com Public API Documentation

Epinby - Official Game Store & Top-Up Services
Base URL: https://mail.epinby.com/api/v1 Support: @tlh13
v1
API key not verified Use GET /getMe to verify and auto-load your webhook secret.

Introduction

Integrate voucher and top-up products, Redeem Data checks, Telegram Stars, and custom-amount Steam Top-Up into your own system using Epinby.com public JSON API. This page includes live playground blocks so resellers can verify their API key, test requests, inspect raw request bodies, and validate webhook signatures directly from the browser.

REST + JSON Live Playground Idempotent Orders Signed Webhooks Top-up Validation USD
Base URL: https://mail.epinby.com/api/v1
Catalog flow Use /games, /categories, and /products to build your browsing and purchase flow.
Safe order creation Send the required X-Idempotency-Key on every order request. You may also send callback_url plus callback_mode.
Webhook modes legacy sends final updates only. events sends signed status-change webhooks.

Base URL & Versioning

All endpoints below are relative to https://mail.epinby.com/api/v1.

Version v1 is stable. Future breaking versions should use a separate prefix.

Authentication

All /api/v1 endpoints require your personal API key in the request header below:

X-API-KEY: YOUR_API_KEY
Security note: Keep your API key on your backend only. Do not expose it inside public frontend code or mobile app bundles.

Idempotency

For POST /order, X-Idempotency-Key is required. Reusing the same key with the same payload safely returns the existing order; reusing it with a different payload returns 409 IDEMPOTENCY_CONFLICT. The Telegram Stars endpoint follows the same safe-replay principle. Steam Top-Up order creation also requires an idempotency key.

X-Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000

Get Account Details

Retrieve reseller profile data, balance, currency, and personal webhook_secret.

GET https://mail.epinby.com/api/v1/getMe
Auth: X-API-KEY 200
curl -s "https://mail.epinby.com/api/v1/getMe" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"
{
  "success": true,
  "data": {
    "user_id": 579365494,
    "username": "reseller_pro",
    "balance": "1250.5000",
    "webhook_secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "currency": "USD"
  }
}
Request
No request yet.
Response
Response will appear here.

Games

List available games that can be used to group or filter top-up products.

GET https://mail.epinby.com/api/v1/games
Auth: X-API-KEY 200
curl -s "https://mail.epinby.com/api/v1/games" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"
{
  "success": true,
  "data": [
    {
      "id": 1,
      "name": "PUBG Mobile"
    },
    {
      "id": 2,
      "name": "Mobile Legends"
    }
  ]
}
Request
No request yet.
Response
Response will appear here.

Categories

List active product categories for a specific game. game_id is required.

GET https://mail.epinby.com/api/v1/categories?game_id=1
Auth: X-API-KEY 200
QueryTypeRequiredDescription
game_id integer YES Active game ID whose categories should be returned.
curl -s "https://mail.epinby.com/api/v1/categories?game_id=1" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"
{
  "success": true,
  "data": [
    {
      "id": 10,
      "name": "UC Packages",
      "image": "https://example.com/storage/categories/category.jpg",
      "per_page_count": 15
    }
  ]
}
Request
No request yet.
Response
Response will appear here.

Products

List active products. Supports filters such as type, game, category, and IDs.

GET https://mail.epinby.com/api/v1/products
Auth: X-API-KEY 200
QueryTypeRequiredDescription
typestringNOvoucher or topup
gamestringNOSearch by game name
categorystringNOSearch by category name
game_idintegerNOFilter by game ID
category_idintegerNOFilter by category ID
pageintegerNOPage number
per_pageintegerNOMaximum 100
curl -s "https://mail.epinby.com/api/v1/products?type=voucher&per_page=10" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"
{
  "success": true,
  "data": [
    {
      "id": 55,
      "name": "Steam Wallet 10 USD",
      "game_id": 0,
      "game": "",
      "category_id": 3,
      "category": "Gift Cards",
      "type": "VOUCHER",
      "price": "9.9900",
      "stock_status": "FINITE",
      "stock_count": 120,
      "fields": [],
      "supports_player_validation": false
    }
  ],
  "meta": {
    "total": 1,
    "per_page": 10,
    "current_page": 1,
    "last_page": 1
  }
}
Request
No request yet.
Response
Response will appear here.

Validate Player

Validate the target player before creating a top-up order. This endpoint is only relevant for products that require player input.

POST https://mail.epinby.com/api/v1/validate-player
Auth: X-API-KEY 200
FieldTypeRequiredDescription
product_idintegerYESActive top-up product ID
player_idstringYESPlayer or user identifier
server_idstringNOServer/zone/region value when needed
input_2...input_8stringNOExtra mapped input fields for advanced products
curl -s "https://mail.epinby.com/api/v1/validate-player" \
  -X POST \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": 91,
    "player_id": "5123456789",
    "server_id": "2001"
  }'
{
  "success": true,
  "data": {
    "nickname": "PlayerOne",
    "player_name": "PlayerOne",
    "region": "TR",
    "server_id": "2001",
    "nickname_verified": true,
    "validation_optional": false
  }
}
Request
No request yet.
Response
Response will appear here.

Create Order

Create a voucher or top-up order. For top-up products, validate the player first when required. X-Idempotency-Key is required and makes retries safe. The initial response records the order as PENDING; fulfillment continues asynchronously.

POST https://mail.epinby.com/api/v1/order
Auth: X-API-KEY 200
FieldTypeRequiredDescription
product_idintegerYESTarget product ID
qtyintegerNOVoucher quantity. Top-up orders must use 1.
player_idstringTOPUPRequired for top-up products
server_idstringNOOptional second field for supported games
input_2...input_8stringNOAdditional mapped inputs
callback_urlstringNOHTTPS webhook endpoint
callback_modestringNOlegacy (default) or events

Headers

X-API-KEY: YOUR_API_KEY
X-Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000

Voucher order example

{
  "product_id": 55,
  "qty": 2,
  "callback_url": "https://yourdomain.com/webhooks/epinbycom",
  "callback_mode": "legacy"
}

Top-up order example

{
  "product_id": 91,
  "qty": 1,
  "player_id": "5123456789",
  "server_id": "2001",
  "callback_url": "https://yourdomain.com/webhooks/epinbycom",
  "callback_mode": "events"
}

Response

{
  "success": true,
  "data": {
    "order_id": 8821,
    "status": "PENDING",
    "player": {
      "nickname": "PlayerOne",
      "player_name": "PlayerOne",
      "region": "TR",
      "server_id": "2001",
      "nickname_verified": true
    }
  }
}
Tip: Leave callback_mode as legacy for old integrations. Use events only if your webhook consumer is ready for PENDING, PROCESSING, COMPLETED, and FAILED status updates.
Request
No request yet.
Response
Response will appear here.

Get Order Status

Fetch a single order by ID.

GET https://mail.epinby.com/api/v1/order/{id}
Auth: X-API-KEY 200
curl -s "https://mail.epinby.com/api/v1/order/8821" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"
{
  "success": true,
  "data": {
    "order_id": 8821,
    "client_order_id": "7b8f0a64-4f7e-4a2f-9a0a-7b1f0a3bfa11",
    "player_id": "5123456789",
    "server_id": "2001",
    "player_name": "PlayerOne",
    "region": "TR",
    "player": {
      "nickname": "PlayerOne",
      "player_name": "PlayerOne",
      "region": "TR",
      "server_id": "2001",
      "nickname_verified": true
    },
    "status": "COMPLETED",
    "price": "19.9800",
    "created_at": "2026-01-30T13:05:04+00:00"
  }
}
Request
No request yet.
Response
Response will appear here.

List Orders

Retrieve your recent order list.

GET https://mail.epinby.com/api/v1/orders
Auth: X-API-KEY 200
{
  "success": true,
  "data": [
    {
      "order_id": 8821,
      "client_order_id": "7b8f0a64-4f7e-4a2f-9a0a-7b1f0a3bfa11",
      "player_name": "PlayerOne",
      "region": "TR",
      "player": {
        "nickname": "PlayerOne",
        "player_name": "PlayerOne",
        "region": "TR",
        "server_id": "2001",
        "nickname_verified": true
      },
      "status": "COMPLETED",
      "price": "19.9800",
      "created_at": "2026-01-30T13:05:04+00:00"
    }
  ]
}
Request
No request yet.
Response
Response will appear here.

Redeem Data API

Check redemption metadata for a redeem code through the same paid Redeem Data service used by the customer channels. Every request is billed from the API user's wallet according to the configured result price.

Billing behavior: the service temporarily reserves the highest possible check fee, performs the redemption lookup, then refunds the difference. The final response contains charged_amount and the updated balance.
GET https://mail.epinby.com/api/v1/redeem-data/config
Auth: X-API-KEY 200
curl -s "https://mail.epinby.com/api/v1/redeem-data/config" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"
{
  "success": true,
  "data": {
    "enabled": true,
    "success_price": 0.05,
    "not_found_price": 0.02,
    "technical_error_price": 0,
    "currency_code": "USD",
    "balance": 1250.5
  }
}
Request
No request yet.
Response
Response will appear here.
POST https://mail.epinby.com/api/v1/redeem-data/check
Auth: X-API-KEY Paid request
FieldTypeRequiredDescription
codestringYESRedeem code to inspect. Length: 6-160 characters.
curl -s "https://mail.epinby.com/api/v1/redeem-data/check" \
  -X POST \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"code":"YOUR-REDEEM-CODE"}'
{
  "success": true,
  "data": {
    "id": 4812,
    "status": "found",
    "code_masked": "ABCD********WXYZ",
    "charged_amount": 0.05,
    "balance": 1250.45,
    "currency_code": "USD",
    "redemption_time": "2026-08-12 18:10:24",
    "expiration_time": null,
    "amount": 60,
    "product_name": "PUBG Mobile 60 UC",
    "player_id": "5123456789",
    "player_name": "PlayerOne",
    "receipt_id": 98765,
    "receipt_successful": true
  }
}
Paid test: clicking the button performs a real Redeem Data check and may charge the API wallet.
Request
No request yet.
Response
Response will appear here.
GET https://mail.epinby.com/api/v1/redeem-data/history?limit=20
Auth: X-API-KEY 200
QueryTypeRequiredDescription
limitintegerNONumber of recent checks to return. Range: 1-100.
curl -s "https://mail.epinby.com/api/v1/redeem-data/history?limit=20" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"
Request
No request yet.
Response
Response will appear here.

Telegram Stars API

Send an exact Stars amount to a Telegram username using the same custom-amount pricing rules as the reseller panel. Telegram Premium is intentionally not exposed by these endpoints.

Recommended flow: /telegram-stars/config/telegram-stars/recipient/telegram-stars/quote/telegram-stars/order. Poll /telegram-stars/order/{id} when the returned status is PROCESSING.
GET https://mail.epinby.com/api/v1/telegram-stars/config
Auth: X-API-KEY 200
curl -s "https://mail.epinby.com/api/v1/telegram-stars/config" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"
{
  "success": true,
  "data": {
    "enabled": true,
    "service_online": true,
    "custom_amount_enabled": true,
    "min_stars": 50,
    "max_stars": 10000,
    "group_discount_percent": "0.0000",
    "balance": "1250.5000",
    "currency": "USD",
    "pricing_mode": "custom_amount"
  }
}
Request
No request yet.
Response
Response will appear here.
POST https://mail.epinby.com/api/v1/telegram-stars/recipient
Auth: X-API-KEY200
FieldTypeRequiredDescription
telegram_usernamestringYESTelegram username with or without @.
curl -s "https://mail.epinby.com/api/v1/telegram-stars/recipient" \
  -X POST \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"telegram_username":"@exampleuser"}'
Request
No request yet.
Response
Response will appear here.
POST https://mail.epinby.com/api/v1/telegram-stars/quote
Auth: X-API-KEY200
FieldTypeRequiredDescription
stars_amountintegerYESExact number of Stars. Must be within the min/max returned by config.
curl -s "https://mail.epinby.com/api/v1/telegram-stars/quote" \
  -X POST \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"stars_amount":137}'
{
  "success": true,
  "data": {
    "service_type": "stars",
    "label": "137 Stars",
    "stars_amount": 137,
    "discount_percent": "0.0000",
    "reseller_price_usd": "2.1235",
    "you_pay_text": "$ 2.1235",
    "receive_text": "137 Stars"
  }
}
Request
No request yet.
Response
Response will appear here.
POST https://mail.epinby.com/api/v1/telegram-stars/order
Auth: X-API-KEYCharges wallet
Field / HeaderTypeRequiredDescription
telegram_usernamestringYESRecipient username.
stars_amountintegerYESExact Stars amount.
X-Idempotency-KeyheaderRECOMMENDEDUnique value, maximum 128 characters. Same key + same payload safely replays the existing Stars order.
curl -s "https://mail.epinby.com/api/v1/telegram-stars/order" \
  -X POST \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "X-Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
  -H "Content-Type: application/json" \
  -d '{"telegram_username":"@exampleuser","stars_amount":137}'
{
  "success": true,
  "data": {
    "order_id": 9912,
    "client_order_id": "550e8400-e29b-41d4-a716-446655440000",
    "status": "completed",
    "quote": {
      "service_type": "stars",
      "stars_amount": 137,
      "reseller_price_usd": "2.1235",
      "receive_text": "137 Stars"
    }
  }
}
Real order: this request deducts the quoted price from the API wallet and sends Stars to the recipient.
Request
No request yet.
Response
Response will appear here.
GET https://mail.epinby.com/api/v1/telegram-stars/order/{id}
Auth: X-API-KEY200
curl -s "https://mail.epinby.com/api/v1/telegram-stars/order/9912" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"
{
  "success": true,
  "data": {
    "order_id": 9912,
    "client_order_id": "550e8400-e29b-41d4-a716-446655440000",
    "status": "COMPLETED",
    "telegram_username": "@exampleuser",
    "stars_amount": 137,
    "price": "2.1235",
    "currency": "USD"
  }
}
Request
No request yet.
Response
Response will appear here.

Steam Top-Up API

Send a custom USD amount to a Steam account. The supported amount range and your account discount are returned by the configuration endpoint.

Recommended flow: /steam-topup/config/steam-topup/quote/steam-topup/check-login/steam-topup/order. Poll /steam-topup/order/{id} while the returned status is PENDING or PROCESSING.
GET https://mail.epinby.com/api/v1/steam-topup/config
Auth: X-API-KEY200
curl -s "https://mail.epinby.com/api/v1/steam-topup/config" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"
{
  "success": true,
  "data": {
    "enabled": true,
    "currency": "USD",
    "min_amount": "0.15",
    "max_amount": "1000.00",
    "discount_percent": "1.5000"
  }
}
Request
No request yet.
Response
Response will appear here.
POST https://mail.epinby.com/api/v1/steam-topup/quote
Auth: X-API-KEY200
FieldTypeRequiredDescription
amountdecimalYESUSD amount to send to the Steam account. Use the min/max values returned by config.
curl -s "https://mail.epinby.com/api/v1/steam-topup/quote" \
  -X POST \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"amount":"100.00"}'
{
  "success": true,
  "data": {
    "amount": "100.0000",
    "discount_percent": "1.5000",
    "price": "98.5000",
    "currency": "USD"
  }
}
Request
No request yet.
Response
Response will appear here.
POST https://mail.epinby.com/api/v1/steam-topup/check-login
Auth: X-API-KEY200
FieldTypeRequiredDescription
steam_loginstringYESSteam account login to validate before placing an order.
curl -s "https://mail.epinby.com/api/v1/steam-topup/check-login" \
  -X POST \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"steam_login":"examplelogin"}'
{
  "success": true,
  "data": {
    "can_refill": true
  }
}
Request
No request yet.
Response
Response will appear here.
POST https://mail.epinby.com/api/v1/steam-topup/order
Auth: X-API-KEYCharges wallet
Field / HeaderTypeRequiredDescription
steam_loginstringYESSteam account login.
amountdecimalYESUSD amount to send to the Steam account.
X-Idempotency-KeyheaderYESUnique value, maximum 128 characters. Same key + same payload safely returns the existing order.
callback_urlHTTPS URLNOOptional order status webhook URL.
callback_modestringNOlegacy or events. Defaults to legacy.
curl -s "https://mail.epinby.com/api/v1/steam-topup/order" \
  -X POST \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "X-Idempotency-Key: steam-20260904-0001" \
  -H "Content-Type: application/json" \
  -d '{"steam_login":"examplelogin","amount":"100.00"}'
{
  "success": true,
  "data": {
    "order_id": 10452,
    "client_order_id": "steam-20260904-0001",
    "status": "PROCESSING",
    "steam_login": "examplelogin",
    "amount": "100.0000",
    "discount_percent": "1.5000",
    "price": "98.5000",
    "currency": "USD"
  }
}
Real order: this request deducts the quoted price from the API wallet and sends the requested amount to the Steam account.
Request
No request yet.
Response
Response will appear here.
GET https://mail.epinby.com/api/v1/steam-topup/order/{id}
Auth: X-API-KEY200
curl -s "https://mail.epinby.com/api/v1/steam-topup/order/10452" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"
{
  "success": true,
  "data": {
    "order_id": 10452,
    "client_order_id": "steam-20260904-0001",
    "status": "COMPLETED",
    "steam_login": "examplelogin",
    "amount": "100.0000",
    "discount_percent": "1.5000",
    "price": "98.5000",
    "currency": "USD"
  }
}
Request
No request yet.
Response
Response will appear here.

Price Change Webhooks

Receive a webhook notification whenever a product's selling price changes.

  • old_price shows the previous selling price for your API account.
  • new_price shows the new selling price for your API account.
  • If several product prices change together, they may be included in a single delivery.

Configure price notifications

Use your existing X-API-KEY. The same personal webhook_secret returned by GET /getMe signs these deliveries.

GET https://mail.epinby.com/api/v1/price-webhook
Auth: X-API-KEY200
curl -s "https://mail.epinby.com/api/v1/price-webhook" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"
PUT https://mail.epinby.com/api/v1/price-webhook
Auth: X-API-KEY200
FieldTypeRequiredDescription
enabledbooleanYESEnable or disable sale price notifications.
urlstringWHEN ENABLEDPublic HTTPS endpoint on port 443.
curl -X PUT "https://mail.epinby.com/api/v1/price-webhook" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "enabled": true,
    "url": "https://yourdomain.com/webhooks/catalog-prices"
  }'
POST https://mail.epinby.com/api/v1/price-webhook/test
Auth: X-API-KEY200

Sends a signed test notification to the configured URL.

curl -X POST "https://mail.epinby.com/api/v1/price-webhook/test" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"
DELETE https://mail.epinby.com/api/v1/price-webhook
Auth: X-API-KEY200

Disables price notifications.

curl -X DELETE "https://mail.epinby.com/api/v1/price-webhook" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/json"

Price change event

The event name and header value are both products.prices_changed.

{
  "event": "products.prices_changed",
  "event_id": "8b56f17d-45ba-44d0-b851-98a73017a66f",
  "currency": "USD",
  "products": [
    {
      "product_id": 145,
      "name": "660 UC",
      "old_price": "9.0000",
      "new_price": "9.9000",
      "change_amount": "0.9000",
      "change_percent": "10.0000",
      "direction": "increased"
    },
    {
      "product_id": 146,
      "name": "720 UC",
      "old_price": "12.5000",
      "new_price": "12.0000",
      "change_amount": "-0.5000",
      "change_percent": "-4.0000",
      "direction": "decreased"
    }
  ],
  "changed_at": "2026-09-03T21:30:00+04:00"
}
HeaderDescription
X-GAMEX-Eventproducts.prices_changed
X-GAMEX-Event-IdStable UUID for idempotent processing.
X-GAMEX-TimestampTimestamp matching the event body.
X-GAMEX-Signaturesha256=HMAC_SHA256(raw_body, webhook_secret)
Use product_id as the stable mapping key in your catalog. Treat new_price as the latest price for your API account. Periodically reconcile with GET /products as the authoritative catalog source.

Delivery and retries

Any HTTP 2xx response marks the delivery successful. Failed deliveries are retried automatically, up to 12 attempts.

Price Webhook Playground Live API
Request
No request yet.
Response
Response will appear here.

Webhooks

If you send a valid callback_url while creating an order, webhook behavior depends on callback_mode.

ModeBehavior
legacy Backward-compatible mode. Only one final reseller webhook is sent when the order reaches COMPLETED or CANCELED.
events Status-change mode. Signed webhooks are sent for public lifecycle changes such as PENDING, PROCESSING, COMPLETED, and FAILED.
  • Voucher orders may finalize very quickly.
  • Top-up orders may remain in PROCESSING before completion.
  • Event mode is best for automation flows that should react before final completion.
  • When an order is later completed or canceled from the admin panel, the same saved callback_url is used for the final webhook.
  • Your webhook endpoint should answer with 2xx quickly and tolerate duplicate deliveries.

Signature Verification

Signed webhook requests include an HMAC header generated using your personal webhook_secret from /getMe.

HeaderDescription
X-GAMEX-SignatureHMAC SHA-256 of the raw request body in format sha256=...
X-GAMEX-Event-IdStable event identifier. Store it and ignore a duplicate delivery with the same value.
X-GAMEX-TimestampISO-8601 timestamp matching the webhook payload.
X-GAMEX-EventPresent for event-mode webhooks. Current value: order.status_changed
Content-Typeapplication/json
$secret = 'YOUR_WEBHOOK_SECRET';
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_GAMEX_SIGNATURE'] ?? '';

$computed = 'sha256=' . hash_hmac('sha256', $payload, $secret);

if (!hash_equals($computed, $signature)) {
    http_response_code(401);
    exit('Invalid signature');
}

http_response_code(204);
Signature Tester Client-side
Computed Signature
No calculation yet.
Verification Result
Result will appear here.

Payload Examples

Legacy final webhook example

{
  "event_id": "47c8c6ba-16a5-4089-9f62-7ae1e51d4c0f",
  "order_id": 8821,
  "client_order_id": "7b8f0a64-4f7e-4a2f-9a0a-7b1f0a3bfa11",
  "status": "COMPLETED",
  "product_name": "Steam Wallet 10 USD",
  "qty": 2,
  "player_id": null,
  "player_name": null,
  "server_id": null,
  "region": null,
  "player": [],
  "price": "19.9800",
  "currency": "USD",
  "delivery": ["CODE_1", "CODE_2"],
  "timestamp": "2026-01-30T13:05:10+00:00"
}

Events mode webhook example

{
  "event": "order.status_changed",
  "event_id": "63bca98d-d2de-4a95-a98a-d5be39098f17",
  "callback_mode": "events",
  "order_id": 8821,
  "client_order_id": "7b8f0a64-4f7e-4a2f-9a0a-7b1f0a3bfa11",
  "product_id": 91,
  "product_name": "PUBG Mobile 60 UC",
  "product_type": "TOPUP",
  "game_id": 1,
  "game_name": "PUBG Mobile",
  "player_id": "5123456789",
  "player_name": "PlayerOne",
  "server_id": "2001",
  "region": "TR",
  "player": {
    "nickname": "PlayerOne",
    "player_name": "PlayerOne",
    "region": "TR",
    "server_id": "2001",
    "nickname_verified": true
  },
  "qty": 1,
  "price": "0.8800",
  "status": "PROCESSING",
  "message": "Order is currently being processed.",
  "timestamp": "2026-03-30T02:00:00+00:00"
}

Order Status Lifecycle

StatusDescriptionWhere used
PENDING Order created and waiting for provisioning. Event mode public webhook
PROCESSING Provisioning started but not finalized yet. Order responses and event mode webhooks
COMPLETED Order delivered successfully. All modes
CANCELED Internal final failure state used by legacy/final flows. Legacy final callbacks and order views
FAILED Public failure name used by event mode webhook payloads. Treat it as a terminal canceled/failed order. Events mode public webhook

Error Codes

Use error.code for programmatic handling.

{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "player_id is required."
  }
}
VALIDATION_ERROR Input, quantity, product, or field validation failed.
INSUFFICIENT_FUNDS Wallet balance is too low for the requested order.
VALIDATION_REQUIRED Top-up character validation must be completed before ordering.
IDEMPOTENCY_CONFLICT The same idempotency key was reused with a different payload.
SECURITY_ERROR Callback URL is invalid, unsafe, or rejected by SSRF protection.
SERVICE_ERROR External validation or provisioning service is temporarily unavailable.
SERVICE_DISABLED The requested optional service is disabled by the current configuration.
ORDER_NOT_FOUND The requested service order does not exist for the authenticated API user.
STEAM_LOGIN_NOT_REFILLABLE The submitted Steam login cannot receive a top-up.
AMOUNT_OUT_OF_RANGE The Steam Top-Up amount is outside the allowed range returned by the config endpoint.

Changelog

2026-09-04 Added custom-amount Steam Top-Up Public API endpoints for configuration, quoting, Steam login validation, idempotent order creation, optional order callbacks, and order status checks.
2026-09-03 Added optional signed products.prices_changed webhooks with per-API-account old/new prices, isolated delivery retries, live configuration endpoints, and documentation playground controls.
2026-08-12 Added dedicated Public API coverage for Redeem Data and custom-amount Telegram Stars, including live documentation playgrounds, Stars idempotency, recipient lookup, quote, order status, and Redeem Data history.
2026-05-14 Final events webhooks are now dispatched when orders are completed or canceled after creation, including admin/manual status changes. Legacy webhook payload documentation was aligned with the stable payload shape.
2026-03-30 Added callback_mode documentation, event-style webhook coverage, signed status-change payload examples, and dynamic project branding from admin settings.