Free Fire Free Fire Auto Topup API
v1
ff-auto-topup.sh
$
> █
Docs

Free Fire Auto Topup API

The Free Fire Auto Topup API is a Free Fire automatic top-up processing solution developed by Hexabot Technologies. It completes orders at the highest average speed that no other API can match. It is primarily built for those who want to set up automated top-up processing through their own stock. You send your Vouchers and UID and it instantly completes the transaction. You send your Garena Shell account details and UID, and it instantly processes your Free Fire UID top-up to the targeted player using your shell accounts. Designed mainly for top-up websites, bots, and apps — with both sync and async endpoints for maximum reliability.

This page covers authentication, every endpoint, every callback format, and every error code the API returns.

বাংলা

Free Fire Auto Topup API হলো Hexabot Technologies কর্তৃক তৈরি একটি Free Fire স্বয়ংক্রিয় টপ-আপ প্রক্রিয়াকরণ সমাধান। এটি সবচেয়ে দ্রুততম গড় গতিতে অর্ডার সম্পন্ন করে — বাজারের অন্য কোনো API এই গতির সাথে পেরে উঠতে পারে না। এটি মূলত তাদের জন্য তৈরি করা হয়েছে যারা নিজেদের স্টকের মাধ্যমে অটোমেটিক টপ-আপ প্রসেসিং চালু করতে চান। আপনি আপনার Voucher এবং UID পাঠালে এটি তাৎক্ষণিকভাবে ট্রানজেকশন সম্পন্ন করে। আপনি আপনার Garena Shell অ্যাকাউন্টের বিস্তারিত তথ্য এবং UID পাঠালে, এটি আপনার Shell অ্যাকাউন্ট ব্যবহার করে নির্ধারিত খেলোয়াড়ের Free Fire UID-এ তাৎক্ষণিকভাবে টপ-আপ প্রক্রিয়া সম্পন্ন করে। এটি মূলত টপ-আপ ওয়েবসাইট, বট এবং অ্যাপের জন্য তৈরি। নির্ভরযোগ্যতার জন্য উভয় Sync এবং Async এন্ডপয়েন্ট সমর্থিত।

Base URL

base url
http://api.hexabot.shop

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

Errors & Status Codes

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

Authentication errors

StatusCodeMeaning
401TOKEN_MISSINGMissing API token
401TOKEN_INVALIDInvalid token
403TOKEN_EXPIREDToken expired
429TOKEN_BANNEDToken temporarily banned due to abuse
429IP_BANNEDToo many requests — IP temporarily banned
429BURST_BANNEDBurst limit exceeded — banned temporarily

Limit & server errors

StatusCodeMeaning
401TOKEN_ERRORInsufficient limit (need N, have M)
401TOKEN_ERRORToken expired on a given date
500REDIS_ERRORToken verification error (internal)
503SHELL_UNAVAILABLEShell top-up unavailable
503OVERLOADEDServer overloaded (high CPU/RAM)
503QUEUE_FULLQueue full — try again shortly
503SERVER_BUSYInstant endpoint busy — use /topup instead
409VOUCHER_CONSUMEDVoucher already consumed (permanently banned)

Request validation errors

StatusCodeMeaning
400INVALID_PLAYERIDInvalid playerid
400INVALID_VOUCHERInvalid code — must be SERIAL:PIN format
400INVALID_VOUCHERMax 5 vouchers per request exceeded
400INVALID_VOUCHERDuplicate voucher in the same request
400MISSING_PACKAGE'package' is required for shell orders
400INVALID_PACKAGEUnknown package for the chosen shop
400REGION_UNSUPPORTEDPlayer region not supported by this shop
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://api.hexabot.shop/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

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
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://api.hexabot.shop/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).

Supported Vouchers

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

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
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://api.hexabot.shop/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"
}
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://api.hexabot.shop/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"
}

Shop & Package Reference

code: sgshell — shop.garena.sg backend

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

code: indoshell — kiosgamer.co.id backend

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

code: myshell — shop.garena.my backend

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

code: shell — bdgamebazar.com backend

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 the callback / response

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)

Shell Detail Messages

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

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