Live · Auto Topup API

NDM X Studio Top UP api âš¡ Developer Portal

$
01

NDM X Studio Top UP api API

Free Fire auto top-up for Unipin vouchers and Garena Shells across BD, SG, MY, and Indonesia. Send a request, get a webhook callback (or an instant sync response) with per-item success/failure detail. This page covers authentication, every endpoint, every callback format, and every error code the API returns.

Base URL

Base URL
http://your.vouchershop.autotopup.api.com
02

Authentication

Every request must include your API key in the Authorization header. No Bearer prefix — send the key as-is.

Header
Authorization: your_api_key_here
03

Errors & Status Codes

Auth, limit, and validation failures return JSON with an error message and a machine-readable code.

Authentication errors

Token validity, expiry & access control

6 codes
401 TOKEN_MISSING Missing API token in Authorization header
401 TOKEN_INVALID Token does not exist or has been revoked
403 TOKEN_EXPIRED Token validity period has ended
429 TOKEN_BANNED Token temporarily banned due to repeated abuse
429 IP_BANNED Too many requests — IP temporarily rate-limited
429 BURST_BANNED Burst limit exceeded — retry with back-off

Limit & server errors

Balance, capacity & internal availability

8 codes
401 TOKEN_ERROR Insufficient balance (need N, have M)
401 TOKEN_ERROR Token expired on a specific scheduled date
500 REDIS_ERROR Internal token verification failure
503 SHELL_UNAVAILABLE Shell top-up endpoint currently offline
503 OVERLOADED Server overloaded — high CPU / RAM usage
503 QUEUE_FULL Processing queue full — try again shortly
503 SERVER_BUSY Instant endpoint busy — use async /topup instead
409 VOUCHER_CONSUMED Voucher already redeemed (permanently consumed)

Request validation errors

Malformed payload, region & field checks

7 codes
400 INVALID_PLAYERID Player UID format is not valid
400 INVALID_VOUCHER Wrong format — must be SERIAL PIN
400 INVALID_VOUCHER Batch limit exceeded — max 5 vouchers per request
400 INVALID_VOUCHER Duplicate voucher detected in same batch
400 MISSING_PACKAGE Field package required for Shell orders
400 INVALID_PACKAGE Unknown package code for the selected shop
400 REGION_UNSUPPORTED Player region is not supported by this shop
04
POST /topup

Unipin Voucher Top-up

Redeems one or more Unipin voucher codes for a Free Fire player. This is the async endpoint — it accepts the order, responds immediately with processing, then sends the final result to your url as a webhook callback.

Body parameters

FieldTypeRequired
orderidstringrequired
playeridstringrequired
codestringrequired
urlstringrequired
orderid — your own ID, used to track this order and match the callback.
playerid — the Free Fire player UID being topped up.
code — one or more Unipin voucher codes, comma-separated (max 5). Each code is SERIAL PIN.
url — your webhook URL. The order result is POSTed here when processing finishes.

Example request

cURL
curl -X POST http://your.vouchershop.autotopup.api.com/topup \
  -H "Authorization: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "orderid": "order-001",
    "playerid": "123456789",
    "code": "BDMB-T-S-01885045 6591-4164-9992-5148,BDMB-Q-S-12512238 3357-3436-4346-4621",
    "url": "https://your-webhook.com/callback"
  }'

Immediate response

The server accepts the order and starts processing in the background.

200 OK
status: processing

Callback — all success

Sent to your url once every voucher in the batch has been redeemed.

Webhook POST
{
  "status": "success",
  "orderid": "test-001",
  "content": {
    "batch": [
      {
        "uc": "BDMB-Q-S-12513859 5265-6592-7735-1778",
        "ok": true,
        "detail": "✅ Success"
      },
      {
        "uc": "BDMB-Q-S-12513264 6642-2292-1792-2551",
        "ok": true,
        "detail": "✅ Success"
      }
    ],
    "callback_url": "https://testdummy.onrender.com/health"
  },
  "nickname": "KNGᴇꟙᗙᴀᴍᴘɪʀᴇ"
}

Callback — all failed

Webhook POST
{
  "status": "failed",
  "orderid": "test-001",
  "content": {
    "batch": [
      {
        "uc": "BDMB-Q-S-12513859 5265-6592-7735-1778",
        "ok": false,
        "detail": "❌ Consumed Voucher"
      },
      {
        "uc": "BDMB-Q-S-12513264 6642-2292-1792-2551",
        "ok": false,
        "detail": "❌ Consumed Voucher"
      }
    ],
    "callback_url": "https://testdummy.onrender.com/health"
  },
  "nickname": "KNGᴇꟙᗙᴀᴍᴘɪʀᴇ"
}

Callback — partial success

Some vouchers redeemed, others failed. Check each batch item's ok field individually.

Webhook POST
{
  "status": "partial",
  "orderid": "test-001",
  "content": {
    "batch": [
      {
        "uc": "BDMB-Q-S-12513859 5265-6592-7735-1778",
        "ok": true,
        "detail": "✅ Success"
      },
      {
        "uc": "BDMB-Q-S-12513264 6642-2292-1792-2551",
        "ok": false,
        "detail": "❌ Consumed Voucher"
      }
    ],
    "callback_url": "https://testdummy.onrender.com/health"
  },
  "nickname": "KNGᴇꟙᗙᴀᴍᴘɪʀᴇ"
}

Possible detail values

Voucher detail enum 3 rows
DetailMeaning
❌ Consumed VoucherVoucher was already used
Uid is invalidThe provided Player ID doesn't exist
Only BD region supported. Your region: SGThis shop only accepts Bangladesh-server UIDs
05
POST /topup-instant

Unipin Voucher Top-up — Instant

Same Unipin redemption, but synchronous: the full result comes back in the HTTP response itself. No url field, no callback — useful when you would rather wait on the request than handle a webhook.

Example request

Note the codes use a colon SERIAL:PIN format on this endpoint.

cURL
curl -X POST http://your.vouchershop.autotopup.api.com/topup-instant \
  -H "Authorization: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "orderid": "order-002",
    "playerid": "123456789",
    "code": "BDMB-T-S-01885045:6591-4164-9992-5148,BDMB-Q-S-12512238:3357-3436-4346-4621,BDMB-I-S-03420017:2334-2751-3366-1131,BDMB-I-S-03421301:6497-3777-3756-4271,BDMB-I-S-03422906:1449-1937-9239-3661"
  }'

Response — all success

200 OK
{
  "status": "success",
  "orderid": "order-002",
  "content": {
    "batch": [
      { "uc": "BDMB-T-S-01885045 6591-4164-9992-5148", "ok": true, "detail": "✅ Success" },
      { "uc": "BDMB-Q-S-12512238 3357-3436-4346-4621", "ok": true, "detail": "✅ Success" },
      { "uc": "BDMB-I-S-03420017 2334-2751-3366-1131", "ok": true, "detail": "✅ Success" },
      { "uc": "BDMB-I-S-03421301 6497-3777-3756-4271", "ok": true, "detail": "✅ Success" },
      { "uc": "BDMB-I-S-03422906 1449-1937-9239-3661", "ok": true, "detail": "✅ Success" }
    ]
  },
  "nickname": "PlayerName"
}

Response — all failed / partial

Same batch shape as the async endpoint — see the /topup examples above for the all-failed and partial-success formats. The same detail values apply (Consumed Voucher, invalid UID, region mismatch).

06

Supported Vouchers

Each Unipin denomination has both a voucher and gift-card variant, both accepted by code.

Unipin Voucher Prefix Matrix 10 rows
ValueVoucher prefixGift card prefix
20UC / 25 DiamondBDMB-T-S-xxxxxxxxUPBD-Q-S-xxxxxxxx
36UC / 50 DiamondBDMB-U-S-xxxxxxxxUPBD-R-S-xxxxxxxx
80UC / 115 DiamondBDMB-J-S-xxxxxxxxUPBD-G-S-xxxxxxxx
160UC / 240 DiamondBDMB-I-S-xxxxxxxxUPBD-F-S-xxxxxxxx
161UC / WeeklyBDMB-Q-S-xxxxxxxxUPBD-N-S-xxxxxxxx
405UC / 610 DiamondBDMB-K-S-xxxxxxxxUPBD-H-S-xxxxxxxx
800UC / MonthlyBDMB-S-S-xxxxxxxxUPBD-P-S-xxxxxxxx
810UC / 1240 DiamondBDMB-L-S-xxxxxxxxUPBD-I-S-xxxxxxxx
1625UC / 2530 DiamondBDMB-M-S-xxxxxxxxUPBD-J-S-xxxxxxxx
2000UCWallet-loadable UC — no fixed prefix
🔎 Pattern match the first 8 chars after BDMB- to detect the voucher variant programatically. The final S indicates region-locked (BD market).
07
POST /topup Garena Shell

Garena Shell Top-up

Tops up Garena Shell on the SG, MY, BD, or Indonesia shop backend. Same /topup endpoint as Unipin — the code field switches it into shell mode. Async: responds immediately, then calls your url with the result.

Body parameters

FieldTypeRequired
orderidstringrequired
playeridstringrequired
codestringrequired
packagestringrequired
qtyintegerrequired
usernamestringrequired
passwordstringrequired
autocodestringrequired
urlstringrequired
code — which shop backend to use: shell (bdgamebazar.com), sgshell (shop.garena.sg), myshell (shop.garena.my), or indoshell (kiosgamer.co.id).
package — the package code for that shop (see the reference table below).
qty — quantity to purchase.
username / password — your Garena shop account credentials.
autocode — your secret OTP/auth key for that shop account.

Example request

cURL
curl -X POST http://your.vouchershop.autotopup.api.com/topup \
  -H "Authorization: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "orderid": "shell-001",
    "playerid": "123456789",
    "code": "shell",
    "package": "lvl6",
    "qty": 1,
    "username": "your_username",
    "password": "your_password",
    "autocode": "your_secret_key",
    "url": "https://your-webhook.com/callback"
  }'

Immediate response

200 OK
status: accepted

Callback — single item, success

Webhook POST
{
    "status": "success",
    "orderid": "ORDER123",
    "content": {
        "batch": [
            {
                "package": "LITE",
                "ok": true,
                "detail": "Success"
            }
        ]
    },
    "nickname": "PlayerName"
}

Callback — single item, failed

Webhook POST
{
    "status": "failed",
    "orderid": "ORDER123",
    "content": {
        "batch": [
            {
                "package": "LITE",
                "ok": false,
                "detail": "Insufficient Garena shells"
            }
        ]
    },
    "nickname": "PlayerName"
}

Callback — multiple shells, all success

Webhook POST
{
    "status": "success",
    "orderid": "ORDER123",
    "content": {
        "batch": [
            {"package": "LITE", "ok": true, "detail": "Success"},
            {"package": "LITE", "ok": true, "detail": "Success"},
            {"package": "LITE", "ok": true, "detail": "Success"},
            {"package": "LITE", "ok": true, "detail": "Success"},
            {"package": "LITE", "ok": true, "detail": "Success"}
        ]
    },
    "nickname": "PlayerName"
}

Callback — multiple shells, partial / all failed

When any item fails, status is "failed" at the top level even if some items succeeded — check each batch entry's ok field for the real per-item outcome.

Webhook POST
{
    "status": "failed",
    "orderid": "ORDER123",
    "content": {
        "batch": [
            {"package": "LITE", "ok": false, "detail": "Insufficient Garena shells"},
            {"package": "LITE", "ok": false, "detail": "Insufficient Garena shells"},
            {"package": "LITE", "ok": false, "detail": "Insufficient Garena shells"},
            {"package": "LITE", "ok": false, "detail": "Insufficient Garena shells"},
            {"package": "LITE", "ok": false, "detail": "Insufficient Garena shells"}
        ]
    },
    "nickname": "PlayerName"
}
08
POST /topup-instant Garena Shell

Garena Shell — Instant Sync

Same Garena Shell payload as the async /topup endpoint, but synchronous. Drop the url field — the result comes back immediately in the HTTP response, no webhook callback needed.

Example request

cURL
curl -X POST http://your.vouchershop.autotopup.api.com/topup-instant \
  -H "Authorization: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "orderid": "shell-001",
    "playerid": "123456789",
    "code": "shell",
    "package": "lvl6",
    "qty": 1,
    "username": "your_username",
    "password": "your_password",
    "autocode": "your_secret_key"
  }'

No url parameter. Response is immediate (no webhook). Formats are identical to the async callback examples above (single success/failed, multiple success/partial/failed). If server is busy, returns HTTP 503.

Response — single shell, success

200 OK
{
    "status": "success",
    "orderid": "shell-001",
    "content": {
        "batch": [
            {
                "package": "LVL6",
                "ok": true,
                "detail": "Success"
            }
        ]
    },
    "nickname": "PlayerName"
}

Response — single shell, failed

200 OK
{
    "status": "failed",
    "orderid": "shell-001",
    "content": {
        "batch": [
            {
                "package": "LVL6",
                "ok": false,
                "detail": "Wrong OTP"
            }
        ]
    },
    "nickname": "PlayerName"
}

Response — multiple shells (qty > 1)

200 OK
{
    "status": "success",
    "orderid": "shell-001",
    "content": {
        "batch": [
            {"package": "LVL6", "ok": true, "detail": "Success"},
            {"package": "LVL6", "ok": true, "detail": "Success"},
            {"package": "LVL6", "ok": false, "detail": "Insufficient Garena shells"}
        ]
    },
    "nickname": "PlayerName"
}

Response — server busy

If the instant endpoint is overloaded, use async /topup instead.

503
{
    "error": "Server busy — use /topup for queued processing.",
    "code": "SERVER_BUSY"
}
09

Shop & Package Reference

sgshell shop.garena.sg backend

Categories & Packages 3 rows
CategoryPackages
Membershipweekly, monthly, Lite, 3D, 7D, 30D
Level Uplvl6, lvl10, lvl15, lvl20, lvl25, lvl30, lvlall
Diamonds25, 100, 310, 520, 1060, 2180, 5600, 11500

indoshell kiosgamer.co.id backend

ID Region Packages 4 rows
CategoryPackages
Membershipweekly, monthly
Booyah Passbp
Diamonds5, 50, 70, 140, 355, 720, 7290
Level Uplvl6, lvl10, lvl15, lvl20, lvl25, lvl30, lvlall

myshell shop.garena.my backend

MY Region Packages 3 rows
CategoryPackages
Membershipweekly, monthly
Diamonds25, 100, 310, 520, 1060, 2180, 5600, 11500
OtherLite, 3D, 7D, 30D, lvl6, lvl10, lvl15, lvl20, lvl25, lvl30

shell bdgamebazar.com backend

BD Default Packages 2 rows
CategoryPackages
MembershipLite, 3D, 7D, 30D
Level Up108588 (Lvl 6), 108589 (Lvl 10), 108590 (Lvl 15), 108591 (Lvl 20), 108592 (Lvl 25), 108593 (Lvl 30)

Package names returned in callbacks

Callback Package Names 4 rows
ShopPackage names
BD ShellLITE, EVO3, EVO7, EVO30, LVL6, LVL10, LVL15, LVL20, LVL25, LVL30
SG / MY ShellLITE, EVO3, EVO7, EVO30, 25, 100, 310, 520, 1060, 2180, 5600, 11500, Weekly, Monthly
Indo Shell5, 50, 70, 140, 355, 720, 7290, 36500, 73100, Weekly, Monthly, BP
All regionsLVL6, LVL10, LVL15, LVL20, LVL25, LVL30 (Level Up Pass)
💡 These are the exact package values you will receive in the POST callback body — match them in your DB lookup, not the input codes.
10

Shell Detail Messages

Possible values for the detail field on shell top-up responses.

Shell detail enum values 8 values
Detail
Insufficient garena shells
Wrong OTP
UID is invalid
Inaccurate region
UID region mismatch
Garena server error or wrong shell account
Garena transaction error
Level up pass not eligible
⚡ All values are returned in plain English — check exact string match (case-sensitive) when parsing the detail field in your webhook handler.