JinBot API
The JinBot Merchant API gives you programmatic access to Unipin voucher purchasing, Garena Shell card purchasing, direct Free Fire top-ups, payment verification, and player lookups — all under one base URL with a single API key.
Base URL
http://api.pinbot.shop
Sync vs Async: /uc and /shell are synchronous — they return voucher codes immediately in the response. /tp is async — it accepts the order and sends the result to your url webhook when done.
Authentication
Pass your API key in the X-API-Key header on every request. Your merchant ID goes in the query string.
X-API-Key: fl_yourkey
?merchant=YOUR_MERCHANT_ID
Contact your Unipin seller and bot developer to receive your API key and merchant ID.
Common Errors
| Response | Status | Meaning |
|---|---|---|
| {"detail": "Invalid API key"} | 401 | Wrong or missing API key |
| {"detail": "User not found"} | 401 | You are not signed up in the bot |
| {"detail": "orders is required"} | 400 | Item field was empty |
| {"detail": "currency must be bdt or usdt"} | 400 | Invalid currency value |
| {"detail": "USDT not active"} | 403 | USDT not enabled for your account |
| {"detail": "Unknown product: xyz"} | 400 | Invalid UC product code |
| {"detail": "Unknown shell products: xyz"} | 400 | Invalid shell product code |
| {"detail": "Price not configured"} | 400 | Price not set for your account |
| {"detail": "Baki system is off"} | 403 | Due/credit system disabled |
| {"error": "insufficient_balance"} | 402 | Not enough balance |
| {"error": "due_limit_exceeded"} | 402 | Due limit reached |
| {"error": "out_of_stock"} | 409 | Stock empty — retry in ~40s |
Free Fire Player Info
Look up any Free Fire player by UID and region. Returns the player's nickname instantly — useful for verification before placing a top-up order.
Query parameters
| Field | Type | Required |
|---|---|---|
| uid | string | required |
| region | string | required |
| token | string | required |
region — e.g. BD, SG, MY, IND
Example request
curl "http://api.pinbot.shop/getinfo?uid=2716319203�ion=BD&token=your_api_key"
Buy Unipin Voucher Codes
Purchase Unipin voucher codes instantly. The response contains the actual voucher codes ready to deliver to your customer. No webhook needed — codes come back in the HTTP response.
Body parameters
| Field | Type | Required |
|---|---|---|
| item | string | required |
| currency | string | required |
| credit | string | required |
| orderid | string | required |
item — UC denomination and quantity, e.g. 80:5,161:2 (see item reference below).
currency — bdt or usdt.
credit — balance (deduct from balance) or baki (use due/credit system).
Example — pay with balance
curl -X POST "http://api.pinbot.shop/uc?merchant=7024464702" \
-H "X-API-Key: fl_yourkey" \
-H "Content-Type: application/json" \
-d '{
"item": "80:5,161:5,405:5",
"currency": "bdt",
"credit": "balance",
"orderid": "191"
}'
Response
{
"status": "success",
"orderid": "191",
"currency": "bdt",
"payment": "balance",
"total": 750.00,
"balance_after": 250.00,
"due_after": 0.0,
"codes": {
"80UC": {
"label": "115 �",
"codes": [
"BDMB-J-S-03811638 5562-1363-6736-1546",
"BDMB-J-S-03814108 8717-4446-3425-9452"
],
"qty": 2,
"price": 50.00
},
"161UC": {
"label": "Weekly �",
"codes": [
"BDMB-Q-S-12511213 1111-7557-1794-1734"
],
"qty": 1,
"price": 60.00
}
}
}
Response — with due (baki) credit
When credit: "baki" and balance runs out, the shortfall is added to due_after.
{
"status": "success",
"orderid": "191",
"payment": "baki",
"total": 750.00,
"balance_after": 0.00,
"due_after": 350.00,
"codes": { "...": "same structure as above" }
}
UC Item Reference
Use these item codes in the item field, formatted as code:qty. Multiple items comma-separated.
| Item Code | UC Amount | Diamond Value |
|---|---|---|
| 20:1 | 20 UC | 25 � |
| 36:1 | 36 UC | 50 � |
| 80:1 | 80 UC | 115 � |
| 160:1 | 160 UC | 240 � |
| 161:1 | 161 UC | Weekly � |
| 405:1 | 405 UC | 610 � |
| 800:1 | 800 UC | Monthly � |
| 810:1 | 810 UC | 1240 � |
| 1625:1 | 1625 UC | 2530 � |
| 2000:1 | 2000 UC | Wallet-loadable UC |
Alternate aliases also accepted: 25:1 = 20UC, 50:1 = 36UC, 115:1 = 80UC, 240:1 = 160UC, weekly:1 = 161UC, 610:1 = 405UC, monthly:1 = 800UC, etc.
Buy Garena Shell Codes
Purchase Garena Prepaid Card PINs (shell codes) instantly. Codes are returned directly in the response — no webhook.
Body parameters
| Field | Type | Required |
|---|---|---|
| item | string | required |
| currency | string | required |
| credit | string | required |
| orderid | string | required |
Example — single shell type
curl -X POST "http://api.pinbot.shop/shell?merchant=7024464702" \
-H "X-API-Key: fl_yourkey" \
-H "Content-Type: application/json" \
-d '{
"item": "50:2",
"currency": "bdt",
"credit": "balance",
"orderid": "192"
}'
Response
{
"status": "success",
"orderid": "192",
"currency": "bdt",
"payment": "balance",
"total": 300.00,
"balance_after": 700.00,
"due_after": 0.0,
"codes": {
"50Sgshell": {
"codes": ["SGSHELL-CODE-XXXXX", "SGSHELL-CODE-YYYYY"],
"qty": 2,
"price": 150.00
}
}
}
Example — multiple shell types
"item": "50:2,100:1"
{
"status": "success",
"orderid": "192",
"total": 450.00,
"balance_after": 550.00,
"codes": {
"50Sgshell": { "codes": ["SGSHELL-XXXXX","SGSHELL-YYYYY"], "qty": 2, "price": 150.00 },
"100Sgshell": { "codes": ["SGSHELL-ZZZZZ"], "qty": 1, "price": 150.00 }
}
}
Shell Code Item Reference
| Item Code | Product | Region |
|---|---|---|
| 50:1 | 50Sgshell | Singapore |
| 100:1 | 100Sgshell | Singapore |
| 250:1 | 250Sgshell | Singapore |
| 320:1 | 320Sgshell | Singapore |
| 1000:1 | 1000Sgshell | Singapore |
| 33:1 | 33Indoshell | Indonesia |
| 66:1 | 66Indoshell | Indonesia |
| 165:1 | 165Indoshell | Indonesia |
| 330:1 | 330Indoshell | Indonesia |
| 65:1 | 65Myshell | Malaysia |
| 130:1 | 130Myshell | Malaysia |
| 260:1 | 260Myshell | Malaysia |
| 390:1 | 390Myshell | Malaysia |
| 650:1 | 650Myshell | Malaysia |
| 1300:1 | 1300Myshell | Malaysia |
| 2600:1 | 2600Myshell | Malaysia |
Direct Top-up
Top up a Free Fire player directly — UC diamonds via Unipin vouchers, or Garena Shell packages. Unlike /uc and /shell, this endpoint is async: it returns processing immediately and POSTs the full result to your url when done.
Body parameters
| Field | Type | Required |
|---|---|---|
| playerid | string | required |
| item | string | required |
| currency | string | required |
| credit | string | required |
| orderid | string | required |
| url | string | required |
Immediate response
{"status": "processing", "orderid": "191"}
If playerid has fewer than 5 digits, you get {"detail": "player_id must be 5+ digits"} (400). If the top-up service is down: {"detail": "UC topup is currently disabled"} or {"detail": "Shell topup is currently disabled"} (503).
UC Direct Top-up — Callback Formats
Example request
curl -X POST "http://api.pinbot.shop/tp?merchant=7024464702" \
-H "X-API-Key: fl_yourkey" \
-H "Content-Type: application/json" \
-d '{
"playerid": "12345678",
"item": "80:1",
"currency": "bdt",
"credit": "balance",
"orderid": "191",
"url": "https://yourcallback.com/result"
}'
Callback — success
{
"status": "success",
"orderid": "191",
"player_id": "12345678",
"player_name": "PlayerName",
"currency": "bdt",
"total": 50.00,
"balance_after": 950.00,
"due_after": 0.0,
"fail_reason": null,
"elapsed_sec": 35.2,
"timestamp": "2026-06-27T10:00:00+00:00",
"voucher_detail": {
"api_status": "success",
"items": [
{
"status": "success",
"code": "BDMB-J-S-03811638 5562-1363-6736-1546",
"product": "80UC",
"label": "115 �",
"unit_price": 50.00,
"fail_reason": ""
}
],
"summary": { "total": 1, "success": 1, "consumed": 0, "failed": 0 }
}
}
Callback — failed (voucher issue)
{
"status": "failed",
"orderid": "191",
"total": 0.0,
"balance_after": 1000.00,
"fail_reason": "Voucher top-up failed",
"voucher_detail": {
"api_status": "failed",
"items": [
{
"status": "failed",
"code": "HIDDEN",
"product": "80UC",
"label": "115 �",
"unit_price": 50.00,
"fail_reason": "Voucher top-up failed"
}
],
"summary": { "total": 1, "success": 0, "consumed": 0, "failed": 1 }
}
}
Callback — consumed voucher
When a voucher was already used, balance is still deducted and status is consumed.
{
"status": "failed",
"fail_reason": "Consumed Voucher",
"total": 50.00,
"balance_after": 950.00,
"voucher_detail": {
"items": [{ "status": "consumed", "fail_reason": "Consumed Voucher" }],
"summary": { "total": 1, "success": 0, "consumed": 1, "failed": 0 }
}
}
Callback — partial success
Some items succeeded, some failed. Check each items entry's status individually.
{
"status": "partial",
"orderid": "191",
"total": 100.00,
"balance_after": 900.00,
"voucher_detail": {
"api_status": "partial",
"items": [
{ "status": "success", "code": "BDMB-J-S-03811638...", "product": "80UC", "unit_price": 50.00 },
{ "status": "consumed", "code": "BDMB-J-S-03814108...", "product": "80UC", "fail_reason": "Consumed Voucher" },
{ "status": "failed", "code": "HIDDEN", "product": "80UC", "fail_reason": "Voucher top-up failed" }
],
"summary": { "total": 3, "success": 1, "consumed": 1, "failed": 1 }
}
}
Shell Direct Top-up — Callback Formats
Example request
curl -X POST "http://api.pinbot.shop/tp?merchant=7024464702" \
-H "X-API-Key: fl_yourkey" \
-H "Content-Type: application/json" \
-d '{
"playerid": "12345678",
"item": "lite:1",
"currency": "bdt",
"credit": "balance",
"orderid": "192",
"url": "https://yourcallback.com/result"
}'
Callback — success
{
"status": "success",
"orderid": "192",
"player_id": "12345678",
"player_name": "PlayerName",
"total": 150.00,
"balance_after": 850.00,
"shell_detail": {
"api_status": "success",
"label": "Weekly Lite",
"qty": 1,
"items": [
{ "component": "Weeklylite", "status": "success", "unit_price": 150.00 }
],
"summary": { "total": 1, "success": 1, "failed": 0 }
}
}
Callback — partial (e.g. full Level Up pass)
{
"status": "partial",
"orderid": "192",
"total": 75.00,
"balance_after": 925.00,
"fail_reason": "Shell top-up failed",
"shell_detail": {
"api_status": "partial",
"label": "Full Level Up Pass (6→30)",
"items": [
{ "component": "Levelup6", "status": "success", "unit_price": 25.00 },
{ "component": "Levelup10", "status": "success", "unit_price": 25.00 },
{ "component": "Levelup15", "status": "failed", "detail": "Shell top-up failed" },
{ "component": "Levelup20", "status": "failed", "detail": "Shell top-up failed" }
],
"summary": { "total": 4, "success": 2, "failed": 2 }
}
}
Callback component names
The component field identifies each sub-item in a shell order so you can parse results per piece.
| Component | Item |
|---|---|
| Weeklylite | Weekly Lite pass |
| Evo3 | 3-day Evo pass |
| Evo7 | 7-day Evo pass |
| Evo30 | 30-day Evo pass |
| Levelup6 | Level Up 6 |
| Levelup10 | Level Up 10 |
| Levelup15 | Level Up 15 |
| Levelup20 | Level Up 20 |
| Levelup25 | Level Up 25 |
| Levelup30 | Level Up 30 |
| Component | Item |
|---|---|
| 5Indodiamond | 5 Indo Diamond |
| 50Indodiamond | 50 Indo Diamond |
| 70Indodiamond | 70 Indo Diamond |
| 140Indodiamond | 140 Indo Diamond |
| 355Indodiamond | 355 Indo Diamond |
| 720Indodiamond | 720 Indo Diamond |
| 7290Indodiamond | 7290 Indo Diamond |
| IndoLvl6–30 | Indo Level Up passes |
Direct Top-up Item Reference
Use these in the item field for /tp only.
UC items
| Item Code | UC / Diamonds |
|---|---|
| 20:1 or 25:1 | 20UC / 25 � |
| 36:1 or 50:1 | 36UC / 50 � |
| 80:1 or 115:1 | 80UC / 115 � |
| 160:1 or 240:1 | 160UC / 240 � |
| 161:1 or weekly:1 | Weekly � |
| 405:1 or 610:1 | 610 � |
| 800:1 or monthly:1 | Monthly � |
| 810:1 or 1240:1 | 1240 � |
| 1625:1 or 2530:1 | 2530 � |
Shell items
| Item Code | Product |
|---|---|
| lite:1 | Weekly Lite |
| evo3:1 / evo7:1 / evo30:1 | Evo passes |
| lvl6:1 → lvl30:1 | Level Up 6–30 |
| lvlall:1 | Full Level Up (6→30) |
| indo5:1 → indo7290:1 | Indo Diamonds |
| indoweekly:1 | Indo Weekly |
| indomonthly:1 | Indo Monthly |
| indobp:1 | Indo Booyah Pass |
| indolvl6:1 → indolvl30:1 | Indo Level Up |
Verify BDT Payment
Verify a mobile banking transaction (bKash, Nagad, Rocket, Upay). When verified, the amount is credited to your bot balance automatically — no manual approval needed. You can embed your merchant payment details in your platform so customers send money directly.
Body parameters
| Field | Type | Required |
|---|---|---|
| trxid | string | required |
Example
curl -X POST "http://api.pinbot.shop/verify?merchant=xxxxx" \
-H "X-API-Key: fl_yourkey" \
-H "Content-Type: application/json" \
-d '{"trxid": "ABC123456"}'
Response — success
{
"success": true,
"trxid": "ABC123456",
"gateway": "bkash",
"subtype": null,
"raw_amount": 500.00,
"fee_pct": 1.5,
"fee_deducted": 7.50,
"credited": 492.50,
"prev_balance": 1000.00,
"new_balance": 1492.50,
"currency": "BDT"
}
Error responses
| Response | Status | Meaning |
|---|---|---|
| {"detail": "Transaction already verified"} | 409 | Already credited before |
| {"detail": "Transaction ID not found"} | 404 | TRX not in database |
Verify USDT Payment
Verify a USDT transaction and credit your bot balance. Supports Binance Pay, TRC20, BEP20, and Polygon.
Body parameters
| Field | Type | Required |
|---|---|---|
| trxid | string | required |
trxid format by network:
• Binance Pay — numeric order ID
• BEP20 / Polygon — 0x + 64 hex characters
• TRC20 — 64 hex characters, no 0x
Example
curl -X POST "http://api.pinbot.shop/usdverify?merchant=7024464702" \
-H "X-API-Key: fl_yourkey" \
-H "Content-Type: application/json" \
-d '{"trxid": "a1b2c3d4e5f6..."}'
Response — success
{
"success": true,
"trxid": "123456789",
"network": "BinancePay",
"raw_amount": 10.00,
"fee_pct": 0.0,
"fee_deducted": 0.00,
"credited": 10.00,
"prev_balance": 50.00,
"new_balance": 60.00,
"from": "",
"pay_date": "2026-06-27T10:00:00+00:00",
"currency": "USDT"
}
Error responses
| Response | Status | Meaning |
|---|---|---|
| {"detail": "USDT not active for your account"} | 403 | Not signed up for USDT |
| {"detail": "Transaction already verified"} | 409 | Already credited |
| {"detail": "Unrecognised transaction ID format..."} | 400 | Wrong TRX ID format |
Check Shell Account Balance
Returns the current Garena shell balance for a given account.
Example
curl -X POST "https://api.pinbot.shop/shell?balance" \ -H "Authorization: your_api_key" \ -d "username=youruser&password=yourpass"
Response
{"username": "Hasina-Magi", "shells": "69"}
{"status": "failed", "reason": "Error text"}
Redeem Shell PINs
Redeem Garena Prepaid Card PINs into a shell account. Multiple PINs can be submitted in one request, comma-separated.
Country codes
| Code | Account Region |
|---|---|
| sg | Singapore shell account |
| my | Malaysia shell account |
| indo | Indonesia shell account |
Example
curl -X POST "https://api.pinbot.shop/shell?redeem=sg" \ -H "Authorization: your_api_key" \ -d "username=youruser&password=yourpass&pin=pin1,pin2"
Response
{
"status": "success",
"batch": {
"pin": "71828822828",
"ok": true,
"status": "success"
}
}
Possible batch status values
| Status | Meaning |
|---|---|
| success | PIN redeemed successfully |
| failed | Redemption failed |
| Invalid Card | PIN is not valid |
| Used Card | PIN already redeemed |
| Wrong Region Card | PIN is for a different region |