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 1000 đơ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ả
statusstring—Filter: 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.