Base URL
https://api.novatopup.comAll API requests require an API key sent via the x-api-key header.
Authentication
Every request must include your API key in the header:
curl -H "x-api-key: ntk_your_api_key_here" \
https://api.novatopup.com/api/v1/statusImportant: Keep your API key secret. Never share it in client-side code, public repos, or chat messages.
Topup API
/api/v1/topupSend a diamond topup to a Free Fire player.
Request Body
{
"player_id": "10133799447",
"product": "FF100",
"region": "MY",
"idempotency_key": "order_abc123"
}Success Response (200)
{
"ok": true,
"status": "success",
"transaction_id": "TXN_123456",
"nickname": "PlayerName",
"shells_charged": 385,
"duration": 4.2
}Parameters
| Field | Type | Required | Description |
|---|---|---|---|
player_id | string | Yes | Free Fire player UID |
product | string | Yes | Product code (see Products section) |
region | string | No | SG or MY (default: MY) |
idempotency_key | string | No | Unique key to prevent duplicate charges |
Redeem API
/api/v1/redeemRedeem prepaid PIN codes to add shells to the linked Garena account. Supports single PIN or bulk (up to 100 PINs per request).
Single PIN
{
"pin": "XXXX-XXXX-XXXX-XXXX",
"region": "SG"
}Bulk Redeem (up to 100 PINs)
{
"pins": [
"XXXX-XXXX-XXXX-XXXX",
"YYYY-YYYY-YYYY-YYYY",
"ZZZZ-ZZZZ-ZZZZ-ZZZZ"
],
"region": "SG"
}Parameters
| Field | Type | Required | Description |
|---|---|---|---|
pin | string | * | Single PIN code to redeem |
pins | string[] | * | Array of PIN codes (max 100) |
region | string | Yes | SG or MY |
* Either pin or pins is required. If both are provided, pins takes priority.
Success Response (200)
{
"success": true,
"total": 3,
"succeeded": 2,
"failed": 1,
"durationSeconds": 4.5,
"region": "SG",
"results": [
{
"pin": "XXXX-XXXX-XXXX-XXXX",
"status": "success",
"success": true,
"transactionId": "123456",
"shellsAdded": "330",
"message": "Redeemed! +330 Shells (tx 123456)"
},
{
"pin": "YYYY-...",
"status": "invalid_pin",
"success": false,
"message": "Invalid or expired PIN"
}
]
}Bulk Limitations
- Maximum 100 PINs per request
- Each PIN counts against your monthly redeem limit
- Timeout scales with PIN count (~15s per PIN)
- If CAPTCHA is triggered, remaining PINs may fail
Level Up Pass Eligibility Check
/api/v1/levelup-checkFREECheck which Level Up Pass tiers a player is eligible to purchase. This is a read-only check — no shells are charged and nothing is purchased. All 6 tiers (Level 6, 10, 15, 20, 25, 30) are checked in a single request. Included free with the Full Plan.
Request Body
{
"player_id": "13565228584",
"region": "MY"
}Parameters
| Field | Type | Required | Description |
|---|---|---|---|
player_id | string | Yes | Free Fire player UID (5-15 digits) |
region | string | No | SG or MY (default: MY) |
Success Response (200)
{
"success": true,
"player_id": "13565228584",
"nickname": "NARUTO•™##",
"region": "MY",
"results": {
"level6": { "name": "Level Up Pass - Level 6", "eligible": true },
"level10": { "name": "Level Up Pass - Level 10", "eligible": false },
"level15": { "name": "Level Up Pass - Level 15", "eligible": true },
"level20": { "name": "Level Up Pass - Level 20", "eligible": true },
"level25": { "name": "Level Up Pass - Level 25", "eligible": true },
"level30": { "name": "Level Up Pass - Level 30", "eligible": true }
},
"duration_seconds": 3.2
}How it works
eligible: true— player can purchase this Level Up Pass tiereligible: false— player already owns this tier or is above that level- This endpoint does NOT count against your topup or redeem limits
- Typical response time: 2-5 seconds
Status
/api/v1/statusCheck your subscription status and API usage.
{
"ok": true,
"subscription": {
"topup_used": 150,
"topup_limit": 10000,
"redeem_used": 42,
"redeem_limit": 200,
"includes_topup": true
}
}Packages
/api/v1/packagesList available diamond topup packages with product codes and shell costs for both MY and SG regions.
Query Parameters
| Param | Description |
|---|---|
region | SG or MY — sets the default shells field. Both shellsMY and shellsSG are always returned. |
Response
{
"success": true,
"region": "MY",
"packages": [
{
"product": "FF100",
"name": "100 Diamonds",
"region": "MY",
"levelUp": false,
"shells": 50,
"shellsMY": 50,
"shellsSG": 50
}
]
}Products
Available product codes for the product field in the Topup API. Shell costs differ between Malaysia (MY) and Singapore (SG).
Diamond Packages
| Product Code | Name | Shells (MY) | Shells (SG) |
|---|---|---|---|
FF25 | 25 Diamonds | 13 | 13 |
FF100 | 100 Diamonds | 50 | 50 |
FF310 | 310 Diamonds | 152 | 150 |
FF520 | 520 Diamonds | 254 | 250 |
FF1060 | 1,060 Diamonds | 500 | 500 |
FF2180 | 2,180 Diamonds | 1,010 | 1,000 |
FF5600 | 5,600 Diamonds | 2,500 | 2,500 |
FF11500 | 11,500 Diamonds | 5,150 | 5,000 |
Memberships
| Product Code | Name | Shells (MY) | Shells (SG) |
|---|---|---|---|
WEEKLY_LITE | Weekly Lite Membership | 18 | 14 |
WEEKLY | Weekly Membership | 86 | 85 |
MONTHLY | Monthly Membership | 430 | 399 |
Level Up Passes
| Product Code | Name | Shells (MY) | Shells (SG) |
|---|---|---|---|
LVL6 | Level Up Pass - Level 6 | 16 | 16 |
LVL10 | Level Up Pass - Level 10 | 34 | 34 |
LVL15 | Level Up Pass - Level 15 | 34 | 34 |
LVL20 | Level Up Pass - Level 20 | 34 | 34 |
LVL25 | Level Up Pass - Level 25 | 34 | 34 |
LVL30 | Level Up Pass - Level 30 | 50 | 50 |
Note: Level Up Passes are one-time purchases, only available if the player is below the specified level. Use the /api/v1/packages endpoint for the live catalog.
Error Codes
| Status | Error | Description |
|---|---|---|
| 401 | unauthorized | Missing or invalid API key |
| 403 | plan_required | No active subscription or plan doesn't include this feature |
| 429 | limit_reached | Monthly request limit exceeded |
| 400 | invalid_player | Player ID not found in the specified region |
| 400 | invalid_pin | PIN code is invalid or already used |
| 400 | captcha_required | CAPTCHA triggered — wait and retry |
| 500 | engine_error | Internal processing error — retry after a moment |