B
bangiftcode auto-topup · Tài liệu API
Dashboard Đăng nhập
Public · v1.0

Tài liệu API tích hợp

Hệ thống tự động nạp topup bangiftcode cho website của bạn — bot tự giải captcha, gọi BANGIFTCODE.COM, trả kết quả qua callback URL. Tích hợp bằng HTTP REST chỉ cần API key.

Base URL https://topup.accnro.vn Auth Header X-API-Key hoặc query ?key= Format JSON

Tổng quan #

Ý tưởng: thay vì nhân viên copy-paste lệnh nạp lên bangiftcode.com, hệ thống nhận đơn qua API, đẩy vào hàng đợi, worker login + giải captcha + submit, ghi kết quả vào DB và gọi callback về website của bạn.

Luồng xử lý

  1. Website của bạn POST /api/order/create → trả lại order_id + status: queued.
  2. Worker pick đơn → đăng nhập bangiftcode (cached session) → fetch captcha → solve → submit topup.
  3. Khi xong: cập nhật status + bgc_topup_id trong DB; nếu có callback_url → POST kết quả về.
  4. Website tự xác minh + trả lượng cho khách. external_id bảo đảm idempotent (gửi lại không bị nạp 2 lần).
Bot KHÔNG giữ tiền của bạn. Mỗi user có credentials BANGIFTCODE.COM riêng — tiền nạp trừ thẳng vào ví đó. Bot chỉ là cầu nối tự động hoá thao tác submit.

Authentication #

Mỗi request phải kèm API key. Có 2 cách:

Cách 1 — Header (khuyên dùng)

curl -H "X-API-Key: bgc_xxxxxxxxxxxxxxxxxxxxxxxxxxx" \
     "https://topup.accnro.vn/api/me"

Cách 2 — Query string (tiện debug, chú ý log)

curl "https://topup.accnro.vn/api/me?key=bgc_xxxxxxxxxxxxxxxxxxxxxxxxxxx"
Tuyệt đối không nhúng API key vào JS chạy ở browser của user cuối. API key cấp cho backend của bạn. Nếu cần website public gọi → backend bạn proxy lại. Nếu lộ key, vào dashboard → Tích hợp API → bấm để sinh key mới.

IP Whitelist (tùy chọn nhưng nên bật)

Trong dashboard, mỗi user có thể thêm IP / CIDR được phép gọi API. Nếu để trống = không giới hạn IP. Web UI luôn vào được bằng cookie session đăng nhập.

Quickstart — gửi đơn đầu tiên #

  1. Đăng nhập dashboard → tab Tích hợp API.
  2. Copy API key (định dạng bgc_xxx...).
  3. Cấu hình Tài khoản bangiftcode (username + password của bạn trên BANGIFTCODE.COM) — bot sẽ login bằng creds này.
  4. (Tùy chọn) Set IP whitelist cho IP server backend của bạn.
  5. Gọi endpoint /api/order/create:
cURL
PHP
Node.js
curl "https://topup.accnro.vn/api/order/create" \
  -H "X-API-Key: bgc_xxx..." \
  --data-urlencode "game=nr" \
  --data-urlencode "server=21" \
  --data-urlencode "account=customer@gmail.com" \
  --data-urlencode "price=10000" \
  --data-urlencode "external_id=acc_001" \
  --data-urlencode "callback_url=https://accnro.vn/api/cb" \
  -G
<?php
$ch = curl_init();
$params = http_build_query([
    'key'          => 'bgc_xxx...',
    'game'         => 'nr',
    'server'       => '21',
    'account'      => 'customer@gmail.com',
    'price'        => 10000,
    'external_id'  => 'acc_001',
    'callback_url' => 'https://accnro.vn/api/cb',
]);
curl_setopt($ch, CURLOPT_URL, "https://topup.accnro.vn/api/order/create?" . $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$resp = json_decode(curl_exec($ch), true);
echo $resp['id']; // order_id để tra cứu sau
const resp = await fetch(
  'https://topup.accnro.vn/api/order/create?' + new URLSearchParams({
    key:          'bgc_xxx...',
    game:         'nr',
    server:       '21',
    account:      'customer@gmail.com',
    price:        10000,
    external_id:  'acc_001',
    callback_url: 'https://accnro.vn/api/cb',
  })
);
const order = await resp.json();
console.log(order.id, order.status); // 42 "queued"

Response 200:

{
  "id": 42,
  "external_id": "acc_001",
  "status": "queued",
  "game": "nr", "server": "21",
  "account": "customer@gmail.com",
  "price": 10000, "amount": 1,
  "created_at": "2026-05-09T17:30:00Z",
  "callback_url": "https://accnro.vn/api/cb"
}

Endpoints chi tiết

Mọi endpoint dưới đây đều cần API key. {token} trong URL = chỗ thay bằng giá trị thật.

GET
/api/me?key={API_KEY}
Lấy thông tin user

Trả về tên, balance, status, IP whitelist, và liệu user đã cấu hình credentials bangiftcode chưa.

Response (200)

{
  "id": 5,
  "name": "accnro",
  "role": "user", "status": "approved",
  "has_bgc_credentials": true,
  "ip_whitelist": ["203.0.113.5"],
  "created_at": "2026-05-09T17:00:00Z"
}
GET
/api/games?key={API_KEY}
Game / Server / Mệnh giá

Metadata để build form trên website. Mỗi game có code, label tiếng Việt, danh sách server.

Response (200)

{
  "games": {
    "nr": {
      "name": "Ngọc Rồng",
      "servers": [
        {"id": "21", "label": "Super 3"},
        {"id": "22", "label": "Super 4"}
      ]
    },
    "nj": { /* Ninja School */ }
  },
  "prices": [10000, 20000, 50000, 100000, 200000, 500000, 1000000]
}
GET
/api/order/create?key={API_KEY}&game={game}&server={server}&account={account}&price={price}&external_id={external_id}&callback_url={callback_url}
Tạo đơn nạp

Đẩy 1 đơn vào queue. Worker xử lý async. Status mặc định là queued, polling hoặc chờ callback để biết kết quả.

Tham số

ParamTypeBắt buộcMô tả
game string Code game (vd. nr, nj, kpah). Xem /api/games.
server string tuỳBắt buộc nếu game có server. id hoặc label đều được.
account string Account / nhân vật cần nạp.
price int 10000 / 20000 / 50000 / 100000 / 200000 / 500000 / 1000000.
amount int noSố đơn lặp (1–10). Mặc định 1.
external_id string noId đơn của bạn — idempotent. Gửi lại cùng external_id không tạo đơn 2 lần (xem Idempotency).
callback_url URL noURL public HTTPS — bot sẽ POST kết quả về khi đơn xong (xem Callback).
extra_* string noTrường mở rộng cho 1 số game (vd. extra_player_id).
note string noGhi chú nội bộ — hiển thị ở dashboard.

Response (200) — Order vừa tạo

{
  "id": 42, "external_id": "acc_001",
  "status": "queued",
  "game": "nr", "server": "21",
  "account": "customer@gmail.com",
  "price": 10000, "amount": 1,
  "created_at": "2026-05-09T17:30:00Z",
  "callback_url": "https://accnro.vn/api/cb"
}

Khi đơn được retry idempotent, response thêm field "_idempotent": true — nghĩa là không có đơn mới tạo, đây là đơn cũ.

POST
/api/orders/bulk?key={API_KEY}
Tạo nhiều đơn cùng lúc

Bulk enqueue. Tối đa 100 đơn / call. Mỗi item validate độc lập — đơn lỗi không làm fail batch.

Body (JSON)

{
  "orders": [
    {"game":"nr","server":"21","account":"u1@a.com","price":10000,"external_id":"e1"},
    {"game":"nr","server":"21","account":"u2@a.com","price":20000,"external_id":"e2"}
  ],
  "callback_url": "https://accnro.vn/api/cb"
}

Response (200)

{
  "ok": 2, "failed": 0,
  "items": [
    {"index": 0, "ok": true, "order": { /* full order */ }},
    {"index": 1, "ok": true, "order": { /* ... */ }}
  ]
}
GET
/api/order/{id}?key={API_KEY}
Xem đơn theo bot id

Tra trạng thái 1 đơn bằng id bot trả về lúc tạo đơn.

GET
/api/order?key={API_KEY}&external_id={external_id}
Xem đơn theo external_id của bạn

Tra theo id bên hệ thống bạn — không cần lưu id bot.

GET
/api/orders?key={API_KEY}&status={status}&limit={limit}&offset={offset}
List nhiều đơn

Tham số

ParamTypeMặc địnhMô tả
statusstringFilter: queued, processing, success, failed, cancelled.
limit int 200Số đơn / page.
offsetint 0 Bỏ qua N đơn đầu (paginate).

Trạng thái đơn #

Đơn đi qua: queued → processing → success | failed | cancelled.

queued
Đã nhận, đang chờ worker pick.
processing
Worker đang login + giải captcha + submit.
success
bangiftcode confirm nạp xong. bgc_topup_id đã được fill.
failed
Số dư không đủ / sai account / captcha thua hết retry / response không parse được. Đọc server_message.
cancelled
User / admin huỷ trước khi worker pick.

Idempotency #

Mỗi đơn nên có external_id duy nhất từ phía bạn (vd. "order_2026_001").

  • Gửi lại request với cùng external_id + cùng user → KHÔNG tạo đơn mới, trả lại đơn cũ kèm field "_idempotent": true.
  • Hữu ích khi network timeout — bạn cứ retry, không sợ nạp 2 lần.
  • Trong 1 user, external_id phải duy nhất. Khác user thì OK.
Best practice: dùng UUID v4 hoặc {your_order_id}_{timestamp} để chắc chắn unique.

Callback / Webhook #

Khi đơn xong (status đổi sang success hoặc failed), bot POST JSON về callback_url:

Body

{
  "order_id": 42,
  "external_id": "acc_001",
  "status": "success",
  "ok": true,
  "attempts": 1,
  "server_message": "Bạn đã nạp 13 lượng vào tài khoản customer@gmail.com",
  "bgc_topup_id": "1001053"
}

Yêu cầu phía bạn

  • Endpoint phải HTTPS, public, không xác thực phức tạp (bot chỉ POST plain JSON).
  • Phản hồi 2xx trong <10s — bot không retry callback.
  • Xác minh đơn bằng cách GET lại /api/order/{id} trước khi cộng lượng cho khách.
Không tin tuyệt đối callback — kẻ tấn công có thể giả callback. Luôn verify bằng GET /api/order/{id} trước khi credit lượng.

Bot block IP private / metadata (169.254.169.254) trong callback_url để chống SSRF.

Mã lỗi HTTP #

CodeKhi nàoCách xử lý
400Tham số sai / thiếu / vượt giới hạn (vd. amount > 10).Đọc detail trong response, sửa request.
401API key sai hoặc đã bị regenerate.Vào dashboard sinh key mới.
403User chưa được duyệt / bị banned / IP không trong whitelist.Xác minh trên dashboard.
404Đơn không tồn tại (sai id hoặc external_id).Check lại id.
409Trả về kèm _idempotent: true — đây là đơn cũ, không phải lỗi.Dùng đơn cũ.
429Vượt rate limit nginx hoặc đã có quá nhiều request đang chờ.Backoff + retry.
500Lỗi server / DB / model AI.Retry sau 30s. Liên hệ admin nếu kéo dài.

Format response lỗi

{
  "detail": "invalid price 5000; valid: [10000, 20000, 50000, ...]"
}

Bảo mật #

  • HTTPS bắt buộc — mọi request đều TLS 1.2+, HSTS preloaded.
  • API key dạng SHA-256 hash trong DB — không thể truy ngược nếu DB bị lộ. Plain text chỉ hiển thị 1 lần lúc tạo / sinh lại.
  • Session cookie HMAC-signed — không thể giả mạo.
  • SSRF guard trên callback_url: chặn private IPs (10.x, 172.16-31.x, 192.168.x), loopback, link-local, AWS metadata 169.254.169.254.
  • Per-user IP whitelist — nên enable cho production.
  • Rate limit nginx: ~50 req/s per IP, burst 100. Vượt giới hạn → 429.
  • PBKDF2-SHA256 100k iterations cho mật khẩu user.

Khi key bị lộ

  1. Đăng nhập dashboard → tab Tích hợp API.
  2. Bấm icon bên cạnh API key.
  3. Key cũ vô hiệu ngay lập tức. Cập nhật key mới vào backend của bạn.