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.
https://mail.epinby.com/api/v1
/games, /categories, and /products to build your browsing and purchase flow.
X-Idempotency-Key on every order request. You may also send callback_url plus callback_mode.
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
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.
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"
}
}
No request yet.
Response will appear here.
Games
List available games that can be used to group or filter top-up products.
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"
}
]
}
No request yet.
Response will appear here.
Categories
List active product categories for a specific game. game_id is required.
| Query | Type | Required | Description |
|---|---|---|---|
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
}
]
}
No request yet.
Response will appear here.
Products
List active products. Supports filters such as type, game, category, and IDs.
| Query | Type | Required | Description |
|---|---|---|---|
type | string | NO | voucher or topup |
game | string | NO | Search by game name |
category | string | NO | Search by category name |
game_id | integer | NO | Filter by game ID |
category_id | integer | NO | Filter by category ID |
page | integer | NO | Page number |
per_page | integer | NO | Maximum 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
}
}
No request yet.
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.
| Field | Type | Required | Description |
|---|---|---|---|
product_id | integer | YES | Active top-up product ID |
player_id | string | YES | Player or user identifier |
server_id | string | NO | Server/zone/region value when needed |
input_2...input_8 | string | NO | Extra 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
}
}
No request yet.
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.
| Field | Type | Required | Description |
|---|---|---|---|
product_id | integer | YES | Target product ID |
qty | integer | NO | Voucher quantity. Top-up orders must use 1. |
player_id | string | TOPUP | Required for top-up products |
server_id | string | NO | Optional second field for supported games |
input_2...input_8 | string | NO | Additional mapped inputs |
callback_url | string | NO | HTTPS webhook endpoint |
callback_mode | string | NO | legacy (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
}
}
}
callback_mode as legacy for old integrations.
Use events only if your webhook consumer is ready for PENDING,
PROCESSING, COMPLETED, and FAILED status updates.
No request yet.
Response will appear here.
Get Order Status
Fetch a single order by ID.
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"
}
}
No request yet.
Response will appear here.
List Orders
Retrieve your recent order list.
{
"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"
}
]
}
No request yet.
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.
charged_amount and the updated balance.
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
}
}
No request yet.
Response will appear here.
| Field | Type | Required | Description |
|---|---|---|---|
code | string | YES | Redeem 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
}
}
No request yet.
Response will appear here.
| Query | Type | Required | Description |
|---|---|---|---|
limit | integer | NO | Number 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"
No request yet.
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.
/telegram-stars/config → /telegram-stars/recipient → /telegram-stars/quote → /telegram-stars/order.
Poll /telegram-stars/order/{id} when the returned status is PROCESSING.
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"
}
}
No request yet.
Response will appear here.
| Field | Type | Required | Description |
|---|---|---|---|
telegram_username | string | YES | Telegram 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"}'
No request yet.
Response will appear here.
| Field | Type | Required | Description |
|---|---|---|---|
stars_amount | integer | YES | Exact 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"
}
}
No request yet.
Response will appear here.
| Field / Header | Type | Required | Description |
|---|---|---|---|
telegram_username | string | YES | Recipient username. |
stars_amount | integer | YES | Exact Stars amount. |
X-Idempotency-Key | header | RECOMMENDED | Unique 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"
}
}
}
No request yet.
Response will appear here.
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"
}
}
No request yet.
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.
/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.
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"
}
}
No request yet.
Response will appear here.
| Field | Type | Required | Description |
|---|---|---|---|
amount | decimal | YES | USD 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"
}
}
No request yet.
Response will appear here.
| Field | Type | Required | Description |
|---|---|---|---|
steam_login | string | YES | Steam 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
}
}
No request yet.
Response will appear here.
| Field / Header | Type | Required | Description |
|---|---|---|---|
steam_login | string | YES | Steam account login. |
amount | decimal | YES | USD amount to send to the Steam account. |
X-Idempotency-Key | header | YES | Unique value, maximum 128 characters. Same key + same payload safely returns the existing order. |
callback_url | HTTPS URL | NO | Optional order status webhook URL. |
callback_mode | string | NO | legacy 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"
}
}
No request yet.
Response will appear here.
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"
}
}
No request yet.
Response will appear here.
Price Change Webhooks
Receive a webhook notification whenever a product's selling price changes.
old_priceshows the previous selling price for your API account.new_priceshows 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.
curl -s "https://mail.epinby.com/api/v1/price-webhook" \ -H "X-API-KEY: YOUR_API_KEY" \ -H "Accept: application/json"
| Field | Type | Required | Description |
|---|---|---|---|
enabled | boolean | YES | Enable or disable sale price notifications. |
url | string | WHEN ENABLED | Public 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"
}'
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"
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"
}
| Header | Description |
|---|---|
X-GAMEX-Event | products.prices_changed |
X-GAMEX-Event-Id | Stable UUID for idempotent processing. |
X-GAMEX-Timestamp | Timestamp matching the event body. |
X-GAMEX-Signature | sha256=HMAC_SHA256(raw_body, webhook_secret) |
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.
No request yet.
Response will appear here.
Webhooks
If you send a valid callback_url while creating an order, webhook behavior depends on callback_mode.
| Mode | Behavior |
|---|---|
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
PROCESSINGbefore 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_urlis used for the final webhook. - Your webhook endpoint should answer with
2xxquickly and tolerate duplicate deliveries.
Signature Verification
Signed webhook requests include an HMAC header generated using your personal webhook_secret
from /getMe.
| Header | Description |
|---|---|
X-GAMEX-Signature | HMAC SHA-256 of the raw request body in format sha256=... |
X-GAMEX-Event-Id | Stable event identifier. Store it and ignore a duplicate delivery with the same value. |
X-GAMEX-Timestamp | ISO-8601 timestamp matching the webhook payload. |
X-GAMEX-Event | Present for event-mode webhooks. Current value: order.status_changed |
Content-Type | application/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);
No calculation yet.
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
| Status | Description | Where 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."
}
}
Changelog
Steam Top-Up Public API endpoints for configuration, quoting, Steam login validation, idempotent order creation, optional order callbacks, and order status checks.
products.prices_changed webhooks with per-API-account old/new prices, isolated delivery retries, live configuration endpoints, and documentation playground controls.
Redeem Data and custom-amount Telegram Stars, including live documentation playgrounds, Stars idempotency, recipient lookup, quote, order status, and Redeem Data history.
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.
callback_mode documentation, event-style webhook coverage,
signed status-change payload examples, and dynamic project branding from admin settings.