Developer Documentation

ZankethStore
Reseller API

Deliver game top-ups through our secure fulfilment platform. One POST โ€” we handle queuing, balance checks, dispatch, and confirmation.

Base URL https://zankethstore.com/tg/api.php

๐Ÿ“กOverview

The ZankethStore Reseller API lets authorised developers trigger game top-ups via a single HTTP POST. Send a player ID and item code โ€” the API validates your key, checks balance, serialises through the queue, dispatches to the fulfilment system, waits for confirmation, deducts your balance, and returns structured JSON.

๐Ÿ’ก
Every response includes ok (boolean), status (machine-readable), message (human-readable), and data (payload). Always check ok first.

Request lifecycle

01POST
request
โ†’
02Auth &
balance
โ†’
03Queue
lock
โ†’
04Dispatch
command
โ†’
05Poll
reply
โ†’
06Deduct
balance
โ†’
07JSON
response
โš ๏ธ
Requests can take up to 90 seconds (queue wait + fulfilment). Set your HTTP client timeout to at least 120 seconds.

๐Ÿ”‘Authentication

Include your API key on every request as a POST field or HTTP header.

MethodWhereExample
POST fieldRequest bodyapi_key=your-secret-key
HTTP HeaderRequest headersX-API-Key: your-secret-key
โ„น๏ธ
API keys are stored as SHA-256 hashes โ€” the raw key is never stored. If lost, it cannot be recovered; request a new one from the admin.

Key properties

PropertyDescription
allowed_domainsComma-separated whitelist. Requests from unlisted origins โ†’ 403.
expires_atExpiry datetime. null = never expires.
rate_limitMax calls per 60-second window. 0 = unlimited.
balanceShell balance. Auto-deducted on each successful top-up.
is_activeAdmin can disable instantly. Disabled โ†’ 403.
modeproduct / test / disabled โ€” see Test vs Product Mode below.

๐ŸงชTest vs Product Mode

Every reseller account has one of three statuses, set by the admin. It controls which Telegram fulfilment group a request is routed to, and is recorded on every request so it can be told apart from real orders later. The two fulfilment groups are universal โ€” one Test group and one Product group shared by every reseller โ€” not configured per account.

ModeBehaviour
productLive requests. Dispatched to the universal Group ID โ€” Product (or the global Group ID if unset). Stored with is_test = 0. Deducts SHELLS balance as normal.
testSandbox requests. Dispatched to the universal Group ID โ€” Test (or the global Group ID if unset). Stored with is_test = 1. Never checks or deducts SHELLS balance โ€” win or lose, your balance is untouched. Counts against the Test request limit instead. Use this to integrate and test your storefront without touching production fulfilment or spending SHELLS.
disabledThe key is rejected immediately with 403 disabled โ€” identical to a fully deactivated account.
๐Ÿ’ก
is_test is decided entirely by your account's current mode โ€” you never send it yourself. Every Top-Up response includes "is_test" and "mode" so your integration can confirm which one just ran.
โ„น๏ธ
The two Group IDs (Test / Product) are set once, globally, on admin_resellers.php โ€” every reseller in Test mode shares the same Test group, and every reseller in Product mode shares the same Product group. Only the per-reseller Mode itself is set individually. The single global Group ID on the Site Settings page still works as the fallback if either universal ID is unset โ€” that page and behaviour are unchanged.
โš ๏ธ
Balance vs. request count: Test-mode requests never check or reduce your SHELLS balance โ€” low_balance can't happen in Test mode, and balance_before/balance_after in the response stay identical. What Test mode does reduce is your remaining daily Test request count (below) โ€” every Test request counts against it regardless of whether it succeeds or fails.

Test request limit

Test mode also has a dynamic, admin-configurable limit on how many Test requests a reseller can send โ€” one number, set on admin_resellers.php, applied to every reseller in Test mode. It is always a real, positive number โ€” there is no "unlimited" option. Usage is a persistent running counter per reseller that does not reset on any schedule; the admin can view, adjust, or reset it anytime for any reseller.

FieldWhereMeaning
test_request_limitadmin tableUniversal cap on Test-mode requests per reseller. Always โ‰ฅ 1 โ€” the admin panel won't accept 0 or blank. Changing it takes effect immediately โ€” no deploy needed.
test_requests_usedresellers tablePer-reseller running counter. Incremented by 1 on every Test-mode request (success or failure). Never auto-resets โ€” admin adjusts/resets it per reseller via the pencil icon next to Test Usage on admin_resellers.php.

Once a Test-mode reseller's usage reaches the limit, further Top-Up calls return 429 test_limit_reached until the admin raises the limit or resets that reseller's usage. Check current usage anytime with GET /api.php?whoami, which returns test_request_limit, test_requests_used, and test_requests_remaining. Every Test-mode Top-Up response โ€” success or failure โ€” also includes these three fields.

json
// Test-mode Top-Up once the limit is hit
{
  "ok": false,
  "status": "test_limit_reached",
  "message": "Test request limit reached (50/50). Ask admin to raise or reset your usage on admin_resellers.php, or switch to Product mode.",
  "data": {
    "test_request_limit": 50,
    "test_requests_used":  50,
    "mode":                 "test"
  }
}

Check your own current mode anytime with GET /api.php?whoami, and review past requests โ€” tagged Test or Product โ€” with GET /api.php?history. Both are read-only and never change live parameters.

โš™๏ธQueue System

Only one top-up dispatches at a time, preventing fulfilment responses from being mixed up when multiple requests arrive simultaneously.

โ”€โ”€ No other requests running โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Row inserted โ†’ proceed immediately โ†’ dispatch โ†’ poll โ†’ done โ”€โ”€ Another request is already processing โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Row inserted โ†’ detects active row โ†’ wait (check every 2s) Active finishes at 30s โ†’ proceed immediately at 30s โ”€โ”€ Active request is stuck โ‰ฅ 60s (crash / timeout) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Stale row detected โ†’ mark as timeout โ†’ proceed immediately
โ„น๏ธ
Worst-case queue wait is 60 seconds. Normal wait is however long the active request takes โ€” often 5โ€“30 seconds. Set HTTP timeout to 120s minimum.

๐Ÿš€Top-Up

POST/api.php

Validates balance, queues the request, dispatches to fulfilment, waits for confirmation, deducts balance, and returns the result.

Request parameters

ParameterTypeRequiredDescription
api_keystringREQUIREDReseller API key. Or use X-API-Key header.
player_idstringREQUIREDIn-game player ID to top up.
item_codestringREQUIREDItem to deliver (lowercase). See Item Codes.
quantityintegerOPTIONALUnits. Default: 1. Max: 99.

Success 200

json
{
  "ok": true,
  "status": "success",
  "message": "โœ… Top-up delivered successfully.",
  "data": {
    "queue_id":        1042,
    "product":         "Weekly Pass",
    "shell_cost":      86,
    "balance_before":  5000,
    "balance_after":   4914,
    "balance_deducted":true,
    "shells_deducted": "86 SHELLS",
    "new_balance":     "4914.00 SHELLS",
    "is_test":         false,
    "mode":            "product"
  }
}
๐Ÿ’ก
is_test/mode reflect your account's current status automatically โ€” see Test vs Product Mode.

Same request, but in Test mode

json
{
  "ok": true,
  "status": "success",
  "message": "โœ… Top-up delivered successfully.",
  "data": {
    "queue_id":        1043,
    "product":         "Weekly Pass",
    "shell_cost":      86,
    "balance_before":  5000,
    "balance_after":   5000,
    "balance_deducted":false,
    "is_test":         true,
    "mode":            "test",
    "test_request_limit":      50,
    "test_requests_used":      13,
    "test_requests_remaining": 37
  }
}
โš ๏ธ
balance_before equals balance_after โ€” Test mode never touches SHELLS. test_requests_used is a running total that only changes when a Test request is sent or the admin resets it โ€” it does not reset on a schedule.

Insufficient balance 402

json
{
  "ok": false,
  "status": "low_balance",
  "message": "Insufficient balance. Required: 86 SHELLS, Available: 40 SHELLS.",
  "data": {
    "queue_id":        1043,
    "required_shells": 86,
    "available_shells":40
  }
}

Failed / timeout 502

json
{
  "ok": false,
  "status": "failed",
  "message": "โš ๏ธ Top-up failed or timed out.",
  "data": { "queue_id": 1044, "debug_msgs": ["..."] }
}

๐Ÿ“ฆProducts

GET/api.php?products

Returns the live product catalogue. No authentication required. Fetch at startup to keep pricing in sync.

json
{
  "ok": true,
  "products": [
    { "item_code": "25",     "name": "25 Shells Pack",  "shell_cost": "13.00" },
    { "item_code": "weekly", "name": "Weekly Pass",     "shell_cost": "86.00" }
  ]
}

๐ŸฉบHealth Check

GET/api.php?test

Returns server health โ€” PHP version, DB connectivity, table existence, reseller count. No auth required. Use this to diagnose integration issues before going live.

๐Ÿ”Verify Player

GET/api.php?verify&api_key=KEY&uid=UID&region=REGION

Looks up a player's profile before placing a top-up. Requires a valid API key โ€” included free with all reseller accounts. The upstream verification service URL and credentials are never exposed.

Parameters

ParameterTypeRequiredDescription
api_keystringREQUIREDYour reseller API key.
uidstringREQUIREDIn-game player UID to look up.
regionstringOPTIONALServer region code (e.g. SG, IND). Default: IND.

Success 200

json
{
  "ok": true,
  "status": "found",
  "data": {
    "basicInfo": {
      "accountId":       "12345678",
      "nickname":        "FB:ใ…ค@GMRemyX",
      "level":           68,
      "liked":           3907634,
      "headPic":         902000157,
      "bannerId":        901052004,
      "badgeId":         1001000097,
      "badgeCnt":        14,
      "exp":             2430062,
      "region":          "SG",
      "rank":            323,
      "rankingPoints":   4828,
      "maxRank":         323,
      "csRank":          317,
      "csRankingPoints": 70,
      "csMaxRank":       317,
      "releaseVersion":  "OB53",
      "seasonId":        51,
      "title":           904990070,
      "weaponSkinShows": [907193507, 912053001, 914053001],
      "createAt":        "1512595169",
      "lastLoginAt":     "1780502412",
      "showBrRank":      true,
      "showCsRank":      true,
      "accountType":     1,
      "pinId":           910040001,
      "primePrivilegeDetail": { "primeLevel": 8, "privilegeIdList": ["..."] },
      "externalIconInfo":    { "showType": "...", "status": "..." }
    },
    "captainBasicInfo": { /* same fields as basicInfo + extraField_77, extraField_78 */ },
    "clanBasicInfo": {
      "clanId":    "60893361",
      "clanName":  "MแดœแดแดสEแด แด€Tแด‡แด€แด",
      "clanLevel": 7,
      "capacity":  55,
      "memberNum": 32,
      "captainId": "12345678"
    },
    "creditScoreInfo": {
      "creditScore": 100,
      "rewardState": "REWARD_STATE_UNCLAIMED",
      "rewardEndAt": "1780279506",
      "rewardStartAt":"1780279506"
    },
    "petInfo": {
      "id":              1300000071,
      "level":           7,
      "exp":             6000,
      "isSelected":      true,
      "skinId":          1310000071,
      "selectedSkillId": 1315000005
    },
    "profileInfo": {
      "avatarId":         902000157,
      "clothes":          [205000455, 203000156, "..."],
      "equipedSkills":    [16, 7606, 8, 1, "..."],
      "isSelected":       true,
      "isSelectedAwaken": true
    },
    "socialInfo": {
      "accountId": "12345678",
      "signature": "FB : GM Remy | TikTok :gmremyx | IG GM Remy"
    },
    "diamondCostRes": { "diamondCost": 0 }
  }
}

Key fields for checkout

Field pathTypeUse
data.basicInfo.nicknamestringDisplay to customer for confirmation
data.basicInfo.levelintegerPlayer level (1โ€“100)
data.basicInfo.headPicintegerAvatar ID โ€” use to build avatar URL
data.basicInfo.regionstringServer region, e.g. SG
data.basicInfo.likedintegerTotal likes received
data.clanBasicInfo.clanNamestringGuild name
data.petInfo.idintegerActive pet ID
๐Ÿ’ก
Always verify the player UID before top-up. A wrong UID wastes shells with no recourse. Call this from your checkout page to show the player name before payment.

cURL example

bash
curl "https://zankethstore.com/tg/api.php?verify&api_key=YOUR_KEY&uid=12345678®ion=SG"

PHP example

php
$res = json_decode(file_get_contents(
    'https://zankethstore.com/tg/api.php?verify'
    .'&api_key=YOUR_KEY'
    .'&uid=' . urlencode($playerId)
    .'®ion=SG'
), true);

if ($res['ok']) {
    $name   = $res['data']['basicInfo']['nickname'];
    $level  = $res['data']['basicInfo']['level'];
    $avatar = $res['data']['basicInfo']['headPic'];
    echo "Player: $name (Level $level)";
} else {
    echo "Error: " . $res['message'];
}

Error responses

json
// Invalid or missing key
{ "ok": false, "status": "invalid_key",   "message": "Invalid API key." }
{ "ok": false, "status": "missing_key",   "message": "api_key is required." }
{ "ok": false, "status": "missing_uid",   "message": "uid (player_id) is required." }
{ "ok": false, "status": "key_expired",   "message": "API key expired." }
{ "ok": false, "status": "upstream_error", "message": "Verification service unavailable." }

๐ŸชชAccount / Whoami

GET/api.php?whoami&api_key=KEY

Returns your account's current status โ€” Product, Test, or Disabled โ€” plus balance and rate limit. Read-only: it never changes any live top-up parameters, so it's safe to call before every session to confirm which mode you're about to dispatch into.

Success 200

json
{
  "ok": true,
  "status": "found",
  "data": {
    "reseller":     "Shop Name",
    "account_mode": "test",
    "is_test":      true,
    "active":       true,
    "balance":      4914,
    "rate_limit":   30,
    "expires_at":   "2026-12-31 23:59:59",
    "key_expired":  false,
    "test_request_limit":      50,
    "test_requests_used":      12,
    "test_requests_remaining": 38
  }
}
๐Ÿ’ก
test_request_limit is always a real, positive number set by the admin โ€” it can never be unlimited. test_requests_used is a running counter that only changes when you send a Test request or the admin manually adjusts/resets it on admin_resellers.php โ€” it does not reset automatically.

๐Ÿ“œRequest History

GET/api.php?history&api_key=KEY&limit=20&mode=test

Returns your own past requests โ€” read-only, does not consume balance, touch the queue, or change any current top-up parameters. Use it to review or audit what's already been sent, filtered by Test or Product if needed.

Parameters

ParamTypeDescription
api_keystringREQUIREDYour reseller API key.
limitintegerOPTIONALMax rows to return. Default 20, max 100.
modestringOPTIONALtest or product to filter. Omit for both.

Success 200

json
{
  "ok": true,
  "status": "found",
  "data": {
    "count": 2,
    "requests": [
      { "queue_id": 1042, "player_id": "123456789", "item_code": "weekly", "quantity": 1, "status": "success", "is_test": 0, "shell_cost": 86, "created_at": "2026-07-01 10:04:12" },
      { "queue_id": 1041, "player_id": "999999999", "item_code": "25",     "quantity": 1, "status": "failed",  "is_test": 1, "shell_cost": 13, "created_at": "2026-07-01 09:58:44" }
    ]
  }
}

๐ŸŽฎItem Codes

Pass item_code exactly as shown (lowercase). Total shell cost = shell_cost ร— quantity.

Shell packs

item_codeNameShell cost / unit
2525 Shells Pack13 SHELLS
100100 Shells Pack50 SHELLS
310310 Shells Pack152 SHELLS
520520 Shells Pack254 SHELLS
10601,060 Shells Pack500 SHELLS
21802,180 Shells Pack1,010 SHELLS
56005,600 Shells Pack2,500 SHELLS
1150011,500 Shells Pack5,150 SHELLS

Passes & subscriptions

item_codeNameShell cost / unit
liteLite Pass18 SHELLS
weeklyWeekly Pass86 SHELLS
monthlyMonthly Pass430 SHELLS

Evo passes

item_codeNameShell cost / unit
evo3Evo 3-Day Pass30 SHELLS
evo7Evo 7-Day Pass45 SHELLS
evo30Evo 30-Day Pass135 SHELLS
๐Ÿ’ก
Always call GET /api.php?products at startup to get live pricing. Admin can update prices at any time.

โšกError Codes

All errors return JSON with "ok": false. Use the status field for programmatic handling.

HTTP
status
Cause & fix
400
missing_player
missing_item
Required POST field missing.
401
missing_key
invalid_key
Key absent or unknown. Visit ?checkkey=YOUR_KEY to diagnose.
403
disabled
key_expired
domain_blocked
Account disabled, key expired, or origin not whitelisted.
402
low_balance
Shell balance too low. Product mode only โ€” Test mode never checks balance. Response includes required_shells and available_shells.
429
rate_limited
Too many requests in 60s. Slow down or ask admin to raise the limit.
429
test_limit_reached
Test-mode usage cap hit. Doesn't reset on a schedule โ€” admin must raise the limit or reset your usage on admin_resellers.php. Check ?whoami for current usage, or switch to Product mode. Doesn't apply to Product-mode requests.
500
processing_error
db_error
Server error. Contact admin with your queue_id.
502
failed
Fulfilment failed or timed out. Check debug_msgs and retry.

๐Ÿ›ก๏ธSecurity

Key Hashing

Raw keys never stored. Only SHA-256 hashes in DB.

Domain Whitelist

Each key locked to approved domains. Unknown origins โ†’ 403.

Balance Guard

Shell balance checked before dispatch. Orders that would overdraft โ†’ 402.

Queue Lock

Only one fulfilment runs at a time. Prevents mixed responses.

Key Expiry

Every key has an expiry date. Expired โ†’ 403. Renew via admin panel.

Audit Log

Every call logged to api_call_log with IP, domain, status, timestamp.

๐Ÿšจ
Never expose your API key in client-side JavaScript or public repos. All calls must come from your server backend, not from browsers.

โฑRate Limits

Sliding 60-second window per API key. Exceeding the limit โ†’ 429.

PlanLimitUse case
Standard30 / minModerate traffic
High-volume60 / minBusy storefronts
Unlimited0 (none)Trusted internal systems
โš ๏ธ
Do not send concurrent requests from the same key. Each request waits in the queue โ€” concurrent calls all count against the rate limit while waiting.

๐Ÿ˜PHP

php
<?php
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL            => 'https://zankethstore.com/tg/api.php',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_TIMEOUT        => 120,
    CURLOPT_POSTFIELDS     => http_build_query([
        'api_key'   => 'your-reseller-api-key',
        'player_id' => '123456789',
        'item_code' => 'weekly',
        'quantity'  => 1,
    ]),
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);

if ($res['ok']) {
    echo "โœ… Cost: " . $res['data']['shell_cost'] . " | Balance: " . $res['data']['balance_after'];
} elseif ($res['status'] === 'low_balance') {
    echo "โŒ Need: ".$res['data']['required_shells']." | Have: ".$res['data']['available_shells'];
} else {
    echo "โŒ " . $res['message'];
}

๐ŸŸจJavaScript (Node.js)

javascript
const axios = require('axios');

async function topUp(playerId, itemCode, qty = 1) {
  const { data } = await axios.post(
    'https://zankethstore.com/tg/api.php',
    new URLSearchParams({
      api_key: 'your-key', player_id: playerId,
      item_code: itemCode, quantity: qty
    }).toString(),
    { headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, timeout: 120000 }
  );
  if (data.ok)
    console.log(`โœ… Cost: ${data.data.shell_cost} | Balance: ${data.data.balance_after}`);
  else if (data.status === 'low_balance')
    console.error(`โŒ Need ${data.data.required_shells}, have ${data.data.available_shells}`);
  else
    console.error(`โŒ ${data.message}`);
  return data;
}

๐ŸPython

python
import requests

def top_up(player_id, item_code, quantity=1):
    data = requests.post(
        'https://zankethstore.com/tg/api.php',
        data={
            'api_key':   'your-key',
            'player_id': player_id,
            'item_code': item_code,
            'quantity':  quantity
        },
        timeout=120
    ).json()
    if data['ok']:
        print(f"โœ… Cost: {data['data']['shell_cost']} | Balance: {data['data']['balance_after']}")
    elif data['status'] == 'low_balance':
        print(f"โŒ Need {data['data']['required_shells']}, have {data['data']['available_shells']}")
    else:
        print(f"โŒ {data['message']}")
    return data

๐Ÿ–ฅcURL

bash
# Top-up
curl -X POST https://zankethstore.com/tg/api.php \
  --max-time 120 \
  -d "api_key=your-key" \
  -d "player_id=123456789" \
  -d "item_code=weekly" \
  -d "quantity=1"

# Verify player
curl "https://zankethstore.com/tg/api.php?verify&api_key=your-key&uid=123456789®ion=SG"

# Live product list
curl https://zankethstore.com/tg/api.php?products

# Health check
curl https://zankethstore.com/tg/api.php?test

# Diagnose key
curl https://zankethstore.com/tg/api.php?checkkey=your-raw-key

โš™๏ธKey Management

Create and manage keys from the Admin Panel at /admin.php or via the CLI script. Per-reseller Test/Product/Disable mode and the two Telegram Group IDs are managed separately on /admin_resellers.php โ€” the global Site Settings page (admin_variables.php) is unaffected.

bash
# List resellers
php reseller_admin.php list

# Create (prints key ONCE โ€” save immediately)
php reseller_admin.php add "Shop Name" "shop.com" 365 60

# Disable / enable
php reseller_admin.php revoke 3
php reseller_admin.php enable 3

# History & stats
php reseller_admin.php history 3
php reseller_admin.php stats
โš ๏ธ
The raw API key is shown once only at creation. Only its SHA-256 hash is stored. Copy it immediately.
๐Ÿ’ก
After creating a reseller, open /admin_resellers.php to set its Mode (Product / Test / Disable). The Group ID โ€” Test and Group ID โ€” Product fields on that same page are universal and apply to every reseller; you only set them once, not per account.

๐Ÿ—„๏ธDatabase

Run api_schema.sql once to create all tables. Safe to re-run.

resellers

ColumnTypeNotes
api_keyVARCHAR(64)SHA-256 hash of raw key
balanceDECIMAL(10,2)Auto-deducted on success. Top up via admin.
allowed_domainsTEXTComma-separated whitelist
rate_limitSMALLINTCalls/min. 0 = unlimited
modeENUM('product','test','disabled')3-way status. See Test vs Product Mode. Managed on admin_resellers.php.
test_requests_usedINTPer-reseller running counter checked against the universal test_request_limit. +1 on every Test-mode request. Never auto-resets โ€” admin adjusts/resets per reseller on admin_resellers.php.

admin

ColumnTypeNotes
group_idBIGINTOriginal single Group ID. Managed on admin_variables.php (unchanged). Used as the fallback below.
group_id_testBIGINT NULLUniversal Telegram group used for every reseller when mode=test. Falls back to group_id if NULL. Managed on admin_resellers.php.
group_id_productBIGINT NULLUniversal Telegram group used for every reseller when mode=product. Falls back to group_id if NULL. Managed on admin_resellers.php.
test_request_limitINTUniversal cap on Test-mode requests per reseller, checked against each reseller's test_requests_used. Always โ‰ฅ 1 โ€” never unlimited. Dynamic โ€” takes effect immediately. Managed on admin_resellers.php.

products

ColumnTypeNotes
item_codeVARCHAR(60)Unique, lowercase. Matches API item_code
shell_costDECIMAL(10,2)Cost per unit checked against reseller balance
is_activeTINYINT(1)Inactive items โ†’ missing_item error

api_queue

ColumnNotes
idReturned as queue_id in all responses
reseller_idNULL for internal orders (manual/wallet/instant)
statuspending โ†’ processing โ†’ success | failed | timeout
origin_domainmanual / instant / wallet / reseller domain
is_testSet automatically from the reseller's mode at request time. 1 = Test, 0 = Product.

api_call_log

ColumnNotes
is_testSame flag as api_queue.is_test, mirrored onto every logged call.
๐Ÿ’ก
These columns (mode/test_requests_used on resellers; group_id_test/group_id_product/test_request_limit on admin; is_test on api_queue/api_call_log) are added automatically the first time api.php or admin_resellers.php runs โ€” no manual migration needed.
Built by
Need a website like this?

ZankethStore was built by IdeaFlow โ€” a Sri Lankan web development studio specialising in game top-up platforms, reseller portals, payment integrations, and custom business software.

Top-up Portals Reseller Systems Payment Integrations API Development Admin Dashboards Custom Web Apps
Visit ideaflow.lk