Chuẩn hoá sao kê ngân hàng API
Đọc file sao kê XLSX / CSV của các ngân hàng Việt Nam về một cấu trúc chung, kiểm tra số dư luỹ kế và đối soát tiền về với danh sách cần thu.
Tải lên file sao kê xuất từ internet banking dạng XLSX hoặc CSV, hoặc gửi các dòng dạng JSON. API tìm dòng tiêu đề nằm dưới phần đầu trang của ngân hàng, nhận diện cột tiếng Việt hoặc tiếng Anh (ngày giao dịch, số tham chiếu, ghi nợ / ghi có hoặc một cột số tiền có dấu, số dư, nội dung / diễn giải, đối ứng…), nhận biết ngân hàng và số tài khoản từ phần đầu, rồi trả mọi giao dịch theo một cấu trúc chung: ngày, nợ, có, số tiền có dấu, số dư, nội dung, số tham chiếu, đối ứng và mã đơn tìm được theo prefix / pattern. Dòng tổng cộng, số dư đầu kỳ, cuối kỳ được nhận diện và bỏ qua.
Số dư luỹ kế được kiểm tra theo cả hai chiều xuất file (cũ trước hoặc mới trước): mỗi số dư phải bằng số dư trước cộng tiền có trừ tiền nợ; các dòng lệch được liệt kê cùng số dư đầu kỳ, cuối kỳ. Gửi expected ([{"code", "amount"}], tối đa 5.000 khoản) để đối soát: mỗi khoản tiền về được khớp theo mã, sau đó theo số tiền duy nhất; kết quả gồm các khoản đã khớp, thiếu / thừa tiền, chưa nhận, và các khoản tiền về không khớp khoản nào.
Không đọc file .xls nhị phân cũ và sao kê PDF (hãy lưu thành .xlsx hoặc CSV; /v1/pdf-text lấy chữ từ PDF). File chỉ xử lý trong bộ nhớ, không lưu lại.
Tham số
| Tên | Vị trí | Kiểu | Bắt buộc | Mặc định | |
|---|---|---|---|---|---|
file | body | file | không | File sao kê .xlsx hoặc .csv (multipart file, body thô hoặc file_base64). Hoặc csv dạng chữ, hoặc rows (mảng object / mảng). | |
expected | body | array | không | Các khoản cần đối soát [{"code", "amount", "id"?}] (tối đa 5.000). | |
prefix | body | string | không | Tiền tố mã đơn cần lấy từ nội dung (vd. DH), hoặc pattern (biểu thức chính quy). | |
sheet | body | string | không | Tên sheet trong file Excel (mặc định: sheet hiển thị đầu tiên). | |
bank | body | string | không | Mã hoặc tên ngân hàng khi file không ghi. | |
limit | body | number | không | 10000 | Số giao dịch tối đa trả về (tổng và kiểm tra vẫn dùng mọi dòng). |
Ví dụ
curl -X POST "https://apibox.io.vn/v1/vn-bank-statement" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"csv":"Ngày giao dịch,Số tham chiếu,Nội dung,Ghi nợ,Ghi có,Số dư\n10/11/2026,FT001,CT DEN DH1001 NGUYEN VAN A,,\"500,000\",\"10,500,000\"\n10/11/2026,FT002,Phi SMS,\"11,000\",,\"10,489,000\"\n11/11/2026,FT003,DH1002 TRAN THI B,,\"1,200,000\",\"11,689,000\"","prefix":"DH","expected":[{"code":"DH1001","amount":500000},{"code":"DH1002","amount":1250000},{"code":"DH1003","amount":99000}]}'const res = await fetch('https://apibox.io.vn/v1/vn-bank-statement', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"csv": "Ngày giao dịch,Số tham chiếu,Nội dung,Ghi nợ,Ghi có,Số dư\n10/11/2026,FT001,CT DEN DH1001 NGUYEN VAN A,,\"500,000\",\"10,500,000\"\n10/11/2026,FT002,Phi SMS,\"11,000\",,\"10,489,000\"\n11/11/2026,FT003,DH1002 TRAN THI B,,\"1,200,000\",\"11,689,000\"",
"prefix": "DH",
"expected": [
{
"code": "DH1001",
"amount": 500000
},
{
"code": "DH1002",
"amount": 1250000
},
{
"code": "DH1003",
"amount": 99000
}
]
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://apibox.io.vn/v1/vn-bank-statement",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"csv": "Ngày giao dịch,Số tham chiếu,Nội dung,Ghi nợ,Ghi có,Số dư\n10/11/2026,FT001,CT DEN DH1001 NGUYEN VAN A,,\"500,000\",\"10,500,000\"\n10/11/2026,FT002,Phi SMS,\"11,000\",,\"10,489,000\"\n11/11/2026,FT003,DH1002 TRAN THI B,,\"1,200,000\",\"11,689,000\"", "prefix": "DH", "expected": [{"code": "DH1001", "amount": 500000}, {"code": "DH1002", "amount": 1250000}, {"code": "DH1003", "amount": 99000}]},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/vn-bank-statement');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"csv":"Ngày giao dịch,Số tham chiếu,Nội dung,Ghi nợ,Ghi có,Số dư\\n10/11/2026,FT001,CT DEN DH1001 NGUYEN VAN A,,\\"500,000\\",\\"10,500,000\\"\\n10/11/2026,FT002,Phi SMS,\\"11,000\\",,\\"10,489,000\\"\\n11/11/2026,FT003,DH1002 TRAN THI B,,\\"1,200,000\\",\\"11,689,000\\"","prefix":"DH","expected":[{"code":"DH1001","amount":500000},{"code":"DH1002","amount":1250000},{"code":"DH1003","amount":99000}]}',
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));Kết quả trả về
{
"source": "csv",
"sheet": null,
"bank": null,
"account": null,
"header_row": 1,
"columns": {
"date": "Ngày giao dịch",
"reference": "Số tham chiếu",
"description": "Nội dung",
"debit": "Ghi nợ",
"credit": "Ghi có",
"balance": "Số dư"
},
"count": 3,
"period": {
"from": "2026-11-10",
"to": "2026-11-11"
},
"totals": {
"debit": 11000,
"credit": 1700000,
"net": 1689000
},
"balance_check": {
"order": "ascending",
"ok": true,
"rows_with_balance": 3,
"opening_balance": 10000000,
"closing_balance": 11689000,
"errors": []
},
"reconciliation": {
"matched": 1,
"amount_mismatch": 1,
"missing": 1,
"matches": [
{
"row": 2,
"date": "2026-11-10",
"amount": 500000,
"description": "CT DEN DH1001 NGUYEN VAN A",
"id": "DH1001",
"code": "DH1001",
"expected_amount": 500000,
"matched_by": "code",
"status": "matched",
"difference": 0
},
{
"row": 4,
"date": "2026-11-11",
"amount": 1200000,
"description": "DH1002 TRAN THI B",
"id": "DH1002",
"code": "DH1002",
"expected_amount": 1250000,
"matched_by": "code",
"status": "underpaid",
"difference": -50000
}
],
"missing_payments": [
{
"id": "DH1003",
"code": "DH1003",
"amount": 99000
}
],
"unexpected_credits": []
},
"transactions": [
{
"row": 2,
"date": "2026-11-10",
"datetime": null,
"value_date": null,
"debit": 0,
"credit": 500000,
"amount": 500000,
"balance": 10500000,
"description": "CT DEN DH1001 NGUYEN VAN A",
"reference": "FT001",
"counterparty": null,
"counterparty_account": null,
"counterparty_bank": null,
"order_code": "DH1001"
},
"…"
],
"truncated": false,
"skipped_rows": [],
"privacy": "Processed in memory, not stored or logged."
}
Ứng dụng
- Đưa sao kê của nhiều ngân hàng vào kế toán theo một cấu trúc
- Đối soát tiền khách chuyển với hoá đơn chưa thu
- Phát hiện dòng bị thiếu, bị sửa nhờ kiểm tra số dư luỹ kế
- Chuẩn bị dữ liệu ngân hàng để nhập vào ERP
Hỏi đáp
Hỗ trợ ngân hàng nào?
Mọi file có dòng tiêu đề gồm cột ngày và cột nợ / có hoặc số tiền, bằng tiếng Việt hay tiếng Anh: bao gồm các mẫu xuất thông dụng của Vietcombank, BIDV, VietinBank, Techcombank, MB, ACB, VPBank. Ngân hàng được nhận diện từ phần đầu file hoặc truyền qua bank.
Kiểm tra số dư làm gì?
Tính lại từng số dư từ số dư trước và số tiền phát sinh, theo thứ tự trong file hoặc đảo ngược, rồi liệt kê các dòng không khớp.
File có bị lưu không?
Không. File chỉ được đọc trong bộ nhớ cho đúng yêu cầu đó.
API liên quan
Metadata ảnh & EXIF
Đọc kích thước, định dạng, thông tin EXIF máy ảnh, thông số chụp và vị trí GPS của ảnh JPEG, PNG, WebP, HEIC, AVIF, GIF… – upload file hoặc qua URL.
PDFMetadata PDF
Đọc metadata file PDF: số trang, tiêu đề, tác giả, phần mềm tạo, ngày tạo, phiên bản PDF, mã hoá, số trường form và khổ giấy từng trang (A4, Letter…).
PDF₫Tạo PDF báo giá, phiếu thu
Tạo PDF báo giá, phiếu thu, đơn đặt hàng, hoá đơn bán hàng gọn đẹp từ JSON: tiếng Việt chuẩn, thuế GTGT, số tiền bằng chữ và mã VietQR để thanh toán.