BeePay QR API · v1

Tài liệu VietQR API.

BeePay QR sinh mã QR chuyển khoản theo chuẩn NAPAS / EMVCo hoàn toàn offline trên server riêng — không phụ thuộc bên thứ ba. Quét được trên mọi app ngân hàng Việt Nam.

Quick Link Example
https://qr.beepay.vn/img/VCB-1031234567.png?amount=50000&addInfo=BEEPAY+HD123
QR demo

Quick Start

Cách nhanh nhất là dùng Quick Link — chỉ cần URL, không cần API key, không cần backend.

URL TEMPLATE
https://qr.beepay.vn/img/{BANK}-{ACCOUNT}.png

Trong đó:

Thêm số tiền & nội dung

URL
https://qr.beepay.vn/img/VCB-1031234567.png?amount=50000&addInfo=BEEPAY+HD123
Tự động chuẩn QR động: Nếu có amount, EMV sẽ dùng Point of Initiation = 12 (dynamic). Nếu không, là 11 (static).

Khái niệm cơ bản

GET/img/{BANK}-{ACCOUNT}.png

Trả về ảnh PNG mã QR. Phù hợp nhúng trực tiếp vào <img src>, email, sticker, in ấn.

Query parameters

Tham sốKiểuMô tả
amountnumberoptSố tiền (VND). Có = QR động.
addInfostringoptNội dung chuyển khoản, ≤ 25 ký tự.
serviceCodestringoptQRIBFTTA (mặc định) hoặc QRIBFTTC.
sizenumberoptKích thước ảnh (128–1024 px, mặc định 512).

GET /v1/qr/image

GET/v1/qr/image?bank=VCB&accountNo=1031234567

Phiên bản verbose của Quick Link — dùng query string thay vì path.

GET /v1/qr/string

GET/v1/qr/string?bank=VCB&accountNo=1031234567

Trả về chuỗi EMV thuần (text/plain). Dùng khi bạn muốn tự render QR ở client (vd với thư viện qrcode.js).

RESPONSE · text/plain
00020101021238540010A00000072701240006970436011010312345670208QRIBFTTA5204000053037045405500005802VN62150811BEEPAY HD12363046A8E

POST /v1/qr/generate

POST/v1/qr/generate

Trả về JSON đầy đủ gồm chuỗi EMV + ảnh PNG base64 + metadata. Dùng khi build app/dashboard.

Request body

application/json
{
  "bank": "VCB",
  "accountNo": "1031234567",
  "amount": "50000",
  "addInfo": "BEEPAY HD123",
  "serviceCode": "QRIBFTTA"
}

Response · 200 OK

application/json
{
  "bank": { "code": "VCB", "bin": "970436", "shortName": "Vietcombank" },
  "accountNo": "1031234567",
  "amount": "50000",
  "addInfo": "BEEPAY HD123",
  "serviceCode": "QRIBFTTA",
  "emv": "00020101021238540010A00...63046A8E",
  "qrBase64": "data:image/png;base64,iVBORw0KGgoA..."
}

GET /v1/banks

GET/v1/banks

Trả về danh sách 47 ngân hàng VN kèm BIN NAPAS, mã ngắn, SWIFT.

application/json
{
  "count": 47,
  "banks": [
    { "code": "VCB", "bin": "970436", "name": "Ngân hàng TMCP Ngoại Thương Việt Nam", "shortName": "Vietcombank", "swift": "BFTVVNVX" },
    ...
  ]
}

Tham số đầy đủ

Tham sốKiểuMô tả
bank*stringMã ngắn (vd VCB) hoặc BIN 6 số.
accountNo*stringSố tài khoản / thẻ thụ hưởng (alphanumeric).
amountnumberoptSố tiền (VND). Trống = QR tĩnh.
addInfostringoptNội dung CK ≤ 25 ký tự.
serviceCodestringoptQRIBFTTA | QRIBFTTC. Mặc định QRIBFTTA.

Service codes

CodeLoạiKhi nào dùng
QRIBFTTATới tài khoảnMặc định. Chuyển vào số tài khoản ngân hàng.
QRIBFTTCTới thẻChuyển vào số thẻ (debit/credit).

Mã lỗi

StatusLỗiNguyên nhân
400Unknown bankbank không hợp lệ — không phải mã ngắn nào trong danh sách và không phải BIN 6 số.
400accountNo is requiredThiếu hoặc rỗng accountNo.
400amount must be a positive numberSai định dạng số tiền.
400serviceCode must be QRIBFTTA or QRIBFTTCService code không hợp lệ.
200OKSinh QR thành công.

Examples

SHELL
# Tải PNG về
curl -o qr.png "https://qr.beepay.vn/img/VCB-1031234567.png?amount=50000&addInfo=BEEPAY+HD123"

# Lấy chuỗi EMV
curl "https://qr.beepay.vn/v1/qr/string?bank=VCB&accountNo=1031234567&amount=50000"

# POST → JSON đầy đủ
curl -X POST https://qr.beepay.vn/v1/qr/generate \
  -H "Content-Type: application/json" \
  -d '{"bank":"VCB","accountNo":"1031234567","amount":"50000"}'
NODE.JS / FETCH
const res = await fetch("https://qr.beepay.vn/v1/qr/generate", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    bank: "VCB",
    accountNo: "1031234567",
    amount: "50000",
    addInfo: "BEEPAY HD123",
  }),
});
const { emv, qrBase64 } = await res.json();
console.log(emv);
PYTHON · requests
import requests

r = requests.post(
    "https://qr.beepay.vn/v1/qr/generate",
    json={
        "bank": "VCB",
        "accountNo": "1031234567",
        "amount": "50000",
    },
)
data = r.json()
print(data["emv"])
HTML
<!-- Nhúng trực tiếp ảnh QR -->
<img src="https://qr.beepay.vn/img/VCB-1031234567.png?amount=50000&addInfo=BEEPAY+HD123"
     width="320" alt="VietQR" />

Một URL duy nhất, mở trên mobile sẽ tự bật app ngân hàng và điền sẵn thông tin chuyển khoản. Trên desktop, hiển thị landing page có QR + tên người nhận.

GET/pay?app={BANK}&ba={ACCOUNT}@{BANK}&am={AMOUNT}&tn={MEMO}

Tương thích contract của dl.vietqr.io/pay — bạn có thể đổi domain trong link sẵn có và dùng ngay.

Query parameters

Tham sốKiểuMô tả
app*stringMã ngắn ngân hàng (vd vcb, acb).
ba*stringSố tài khoản theo định dạng {account}@{BANK}, vd 1031234567@VCB.
amnumberoptSố tiền (VND).
tnstringoptNội dung chuyển khoản (transaction note).
bnstringoptTên người nhận (beneficiary name).
urlstringoptReturn URL — landing page hiện nút "Quay lại" sau khi thanh toán.
EXAMPLE
https://qr.beepay.vn/pay?app=acb&ba=5847@ACB&am=100000&tn=BEEPAY+HD123
Hành vi: trên mobile, page sẽ thử bật app ngân hàng qua URL scheme. Nếu không cài app, người dùng vẫn thấy QR + thông tin để quét bằng app khác. Trên desktop, luôn hiển thị landing page.
POST/v1/deeplink

Build URL deeplink theo định dạng chuẩn từ thông tin chuyển khoản.

REQUEST · application/json
{
  "bank": "ACB",
  "accountNo": "5847",
  "amount": "100000",
  "addInfo": "BEEPAY HD123"
}
RESPONSE
{
  "url": "https://qr.beepay.vn/pay?app=acb&ba=5847@ACB&am=100000&tn=BEEPAY+HD123",
  "status": "supported",
  "app": "acb"
}

Endpoint GET /v1/deeplinks trả về registry đầy đủ.

App codeBankTrạng tháiGhi chú
Đang tải...
Trạng thái: supported = autofill đã verified · experimental = scheme có nhưng cần test trên app thực tế · unsupported = chưa hỗ trợ, fallback QR.

Danh sách BIN ngân hàng

Endpoint GET /v1/banks trả về đầy đủ. Một số mã thông dụng:

Mã ngắnBINTênSWIFT
Đang tải...