API reference

Place game top-ups on your own connected Smile.One, Garena, Midasbuy and NetEase Games accounts. Orders are paid from your upstream balance; a small per-order service fee is taken from your prepaid wallet. JSON over HTTPS.

BASE URL

Quick start

1. Create a partner account and wait for approval. 2. Connect a provider account in the dashboard. 3. Generate an API key. 4. Check the player, then place the order:

cURL
curl "$BASE/api/v2/check-id?provider=smileone&region=br&game=mobilelegends&user_id=123456789&zone_id=2214" \
  -H "x-api-key: sk_live_..."

curl -X POST "$BASE/api/v2/orders" \
  -H "x-api-key: sk_live_..." -H "content-type: application/json" \
  -d '{"provider":"smileone","region":"br","game":"mobilelegends","product_id":"212",
       "user_id":"123456789","zone_id":"2214","reference":"order-0001"}'

Authentication

Create an API key in your dashboard and send it on every request except /ping, using either header:

Headers
x-api-key: sk_live_xxx
# or
Authorization: Bearer sk_live_xxx
!The key is shown only once. It gives access to your connected accounts and can spend your provider balance — keep it on your server, never in a browser or app. Generating a new key revokes the old one.

Errors

Every response has success. Errors use an HTTP 4xx/5xx status and a stable machine-readable code:

Error body
{ "success": false, "error": "Daily order limit reached (300)...", "code": "DAILY_LIMIT" }
CodeHTTPMeaning
INVALID_API_KEY401Missing or wrong API key.
SELLER_PENDING403Your partner account is awaiting approval.
SELLER_SUSPENDED403Your partner account is suspended.
MISSING_FIELD400A required field is missing.
UNKNOWN_PROVIDER400The provider value is not recognised.
PROVIDER_DISABLED400That provider is temporarily unavailable.
NO_CONNECTION400You haven't connected an account for this provider/region.
CONNECTION_DISABLED400The connection has been disabled.
INSUFFICIENT_FEE_BALANCE402Your fee wallet can't cover this order's fee. Includes balance and required.
SESSION_EXPIRED409Your provider session expired — reconnect it in the dashboard.
ORDER_FAILED400The provider rejected the order. Includes the failed order; the fee is refunded.
DAILY_LIMIT429Daily order limit reached.
RATE_LIMITED429Too many requests per minute. See the Retry-After header.
NOT_FOUND404Order or resource not found.
UPSTREAM_ERROR502The provider could not be reached or errored; the fee is refunded.
INTERNAL500Unexpected server error.

Idempotency

Send a unique reference (up to 80 characters) with every order. If a request times out or you aren't sure it went through, retry with the same reference: you get the original order back with "idempotent": true and HTTP 200, and the player is never topped up twice.

Limits & fees

Rate limit60 requests per minute per partner (all endpoints).
Daily ordersA daily order cap applies per partner; new accounts have a lower cap during their first 7 days.
Service fee$0.05 per order by default; some products have their own fee (see fee_usd in /products). Held when the order is placed and refunded automatically if it fails.
GET/api/v2/pingHealth check · no auth
Response
{ "success": true, "ts": 1767000000000 }
GET/api/v2/providersProviders enabled for you

Returns each provider's id, regions, default_region, whether it is per_region, and the fields needed to connect it.

GET/api/v2/connectionsYour connected accounts

Lists your connections with provider, region, status (active · expired · error · disabled), last balance and last check time. Session values are never returned.

GET/api/v2/gamesGames you can sell

Answered from FARAMENG's stored catalog (fast, no shop account needed). A region that isn't stored is fetched live from the shop on your connected account. source says which: "stored" or "live". Each game includes image — the shop's own image link for that game.

QueryDescription
providerREQUIREDsmileone · garena · midasbuy · neteasegames
regionREQUIREDSmile.One e.g. br · ph · id, Garena sg · my · ph · tw, Midasbuy kh, NetEase us. The full list per provider is in /providers; a missing or unknown region returns MISSING_REGION / INVALID_REGION with the valid list.
Request
curl "$BASE/api/v2/games?provider=smileone&region=br" -H "x-api-key: sk_live_..."
GET/api/v2/productsPackages for a game

Like /games, answered from the stored catalog when the game is stored (source: "stored"), otherwise live from the shop (source: "live"). Stored prices are the shop's price when the catalog was saved; the order itself is always charged at the shop's current price. Each product includes fee_usd — the service fee you'll pay for it — and fee_custom: true when that product has its own fee. Like games, each product has image — the shop's own image link for that item.

QueryDescription
providerREQUIREDProvider id.
gameREQUIREDGame slug / app id from /games.
regionREQUIREDSame region as in /games.
packed_role_idGARENAFrom /check-id.
urlSMILE.ONEGame page path, for Smile.One games that need it.
GET/api/v2/serversGame servers (NetEase)

Many NetEase games have several servers (for example Identity V: Asia, NA and EU). Send the chosen host_id to /check-id and /orders. A game with a single server uses it automatically.

QueryDescription
providerREQUIREDneteasegames
gameREQUIREDGame slug from /games, e.g. identityv.
regionREQUIREDA NetEase region, e.g. us. If the game isn't sold there, its own region is used.
Response
{ "success": true, "servers": [ { "host_id": "2001", "name": "Asia", "zone": "" }, { "host_id": "2011", "name": "NA and EU", "zone": "" } ], "count": 2 }
GET/api/v2/check-idValidate a player id

Returns the player's nickname when the id is valid. For Garena it also returns packed_role_id to pass to /products and /orders. Always check before ordering.

QueryDescription
providerREQUIREDProvider id.
regionREQUIREDSame region as in /games.
gameREQUIREDGame slug / app id.
user_idREQUIREDIn-game player id.
zone_idOPTIONALServer / zone, for games that use one (e.g. Mobile Legends).
host_idNETEASEGame server id, only for NetEase games that have several servers. Leave out for the default server.
product_id, urlOPTIONALSome providers need these for the check.
POST/api/v2/ordersPlace a top-up

Places the order through your connected account. Returns 201 for a new order, or 200 with "idempotent": true when the reference was already used.

BodyDescription
providerREQUIREDProvider id.
gameREQUIREDGame slug / app id.
product_idREQUIREDFrom /products.
user_idREQUIREDPlayer id (player_id is also accepted).
zone_idOPTIONALServer / zone if the game needs one.
referenceRECOMMENDEDYour unique order id — see Idempotency.
regionREQUIREDSame region as in /games and /products.
packed_role_id, channel_idGARENAFrom /check-id.
host_idNETEASEGame server id, same as for /check-id. NetEase orders are paid from your NetEase Credit.
urlSMILE.ONEGame page path, for Smile.One games that need it.
Request
curl -X POST "$BASE/api/v2/orders" \
  -H "x-api-key: sk_live_..." -H "content-type: application/json" \
  -d '{"provider":"smileone","region":"br","game":"mobilelegends",
       "product_id":"212","user_id":"123456789","zone_id":"2214",
       "reference":"order-0001"}'
Response · 201
{
  "success": true,
  "idempotent": false,
  "order": {
    "id": "6f1c2a9e-...",
    "reference": "order-0001",
    "provider": "smileone",
    "game": "mobilelegends",
    "product_id": "212",
    "player_id": "123456789",
    "zone_id": "2214",
    "status": "success",
    "upstream_order_id": "SO123456789",
    "fee_usd": 0.05,
    "created_at": "2026-11-06T08:00:00.000Z"
  },
  "fee_balance": 9.95
}
istatus is success or failed. A failed order returns an error (ORDER_FAILED, SESSION_EXPIRED or UPSTREAM_ERROR) and its fee is refunded to your wallet.
iMulti-buy products place several shop orders for the same player, one after another, so they take longer. They are:
• Smile.One BR Mobile Legends: 16642x2 … 16642x10 (Weekly Diamond Pass 2 to 10 times), and 23+16642 and 25+16642 (diamonds, then the Weekly Diamond Pass).
• Garena MY Free Fire: 8067x2 … x10 (Monthly Membership), 67386x2 … x10 (Weekly Lite), 8066x2 … x10 (Weekly Membership), and 8067+67386+8066 (all three).
• Garena SG Free Fire: 35642x2 … x10 (Monthly Membership), 67383x2 … x10 (Weekly Lite), 35637x2 … x10 (Weekly Membership), and 35642+67383+35637 (all three).
A Garena x10 can take several minutes, so keep your request open, or send a reference and look the order up with it.
Their price and fee are the sum of their parts. The order adds quantity and delivered, and upstream_order_id lists every shop order ID, comma-separated. If a pass fails partway, the order stops there with status partial. The passes already delivered stay delivered, you pay the fee only for those, and the rest is refunded.
GET/api/v2/orders/:idOne order

Fetch an order by its id or by your reference. Smile.One orders refresh their upstream_status from the provider when fetched.

GET/api/v2/ordersRecent orders
QueryDescription
limitOPTIONAL1–100, default 20. Newest first.
GET/api/v2/balanceWallet & upstream balance

With no query, returns your fee wallet as fee_balance. With ?provider= and region (required with a provider), also returns the connected account's upstream balance — available for Smile.One and Garena; Midasbuy and NetEase Games balances can't be read.

POST/api/v2/vouchers/redeemSmile.One voucher codes → Smile Coins

Redeems Smile.One voucher codes (Smile Cards) straight into the Smile Coin balance of your connected Smile.One account. Each code is checked first; only valid codes are redeemed. Every Smile.One region has its own Smile Coin balance and a code only works in its own country, so region is required: a code for another country is refused before it is used (wrong_region). Up to 20 codes per call (they are sent one at a time, so a full batch takes up to a minute); at most 60 codes per 10 minutes. Codes are never stored in full.

POST /api/v2/vouchers/check takes the same body and only looks the codes up (value and country) without using them. GET /api/v2/vouchers lists your last redemptions.

BodyDescription
regionREQUIREDThe Smile.One region whose balance receives the coins, e.g. br, ph, id (see /providers).
codesREQUIREDAn array of codes, or one text with a code per line. Codes are 11 or more letters and digits.
Request
curl -X POST "$BASE/api/v2/vouchers/redeem"   -H "x-api-key: sk_live_..." -H "content-type: application/json"   -d '{"region":"br","codes":["ABCDEFGHIJK","LMNOPQRSTUV"]}'
Response
{ "success": true, "region": "br", "count": 2, "redeemed": 1,
  "balance_before": 120, "balance_after": 1120,
  "coins_by_country": { "Brasil(Brazil)": 1000 },
  "results": [
    { "code": "ABCD…IJK", "status": "redeemed", "coins": 1000, "country": "Brasil(Brazil)" },
    { "code": "LMNO…TUV", "status": "used", "message": "This voucher code was already used." }
  ] }

Each result's status: redeemed, valid (check only), used, invalid, illegal (not bought from an official seller), wrong_region (the code is for another country), failed or error. /vouchers/check also returns the region's current balance.