Tài liệu API
Gọi mọi endpoint từ máy chủ của bạn. Yêu cầu và phản hồi đều là JSON. URL webhook và API key được quản lý trong trang quản trị người bán.
Cần mã dùng được ngay? Ví dụ tích hợp bằng Node.js, Python, PHP, Go và Java
| Endpoint | Mục đích |
|---|---|
POST /v1/payment_intents | Tạo thanh toán |
GET /v1/payment_intents/{id} | Lấy thanh toán |
POST /v1/deposit_addresses | Lấy địa chỉ nạp của người dùng |
GET /v1/deposits | Liệt kê khoản nạp |
GET /v1/deposits/{id} | Lấy một khoản nạp |
GET /v1/chains | Xem chuỗi và token của dự án |
PUT /v1/customers/{external_id} | Thêm thẻ và ghi chú cho người dùng (tùy chọn) |
GET /v1/customers/{external_id} | Lấy người dùng (tùy chọn) |
Quy ước cơ bản
| URL gốc | https://api.kokiwa.com, dùng chung cho mainnet và testnet. |
| Xác thực | Header Authorization: Bearer sk_…. Key bắt đầu bằng sk_live_ truy cập mainnet, key bắt đầu bằng sk_test_ truy cập testnet; dữ liệu tách biệt hoàn toàn. Mỗi key chỉ truy cập dự án của nó. |
| Số tiền | Chuỗi theo đơn vị token, ví dụ "25.00". Yêu cầu cho phép tối đa 6 chữ số thập phân; phản hồi giữ độ chính xác trên chuỗi nên số chữ số có thể khác nhau. Chỉ transaction.raw_amount là giá trị gốc trên chuỗi. |
| Thời gian | ISO 8601 UTC, ví dụ 2026-11-02T08:30:00Z. |
| Địa chỉ | Địa chỉ EVM được trả về theo định dạng checksum EIP-55. Hãy hiển thị nguyên dạng và bỏ qua hoa thường khi so sánh. |
| Tính lũy đẳng | Yêu cầu POST có thể gửi Idempotency-Key (tối đa 255 ký tự). Thử lại với cùng key sẽ trả về kết quả đầu tiên kèm header Idempotent-Replayed: true. |
Lỗi
Lỗi trả về 4xx hoặc 5xx. Hãy phân nhánh theo code; message chỉ để gỡ lỗi.
{
"error": {
"code": "amount_below_minimum",
"message": "options[0].amount is below the minimum",
"details": { "min_amount": "5.00" }
}
}| HTTP | code | Ý nghĩa |
|---|---|---|
| 400 | invalid_* | Tham số không hợp lệ; message chỉ ra trường. |
| 400 | chain_not_enabled | Dự án chưa có địa chỉ nhận tiền hiệu lực trên chuỗi này, hoặc đã tắt nhận tiền. |
| 400 | chain_not_available | Chuỗi này hiện không nhận thanh toán. |
| 400 | chain_not_supported | Chuỗi này không có địa chỉ nạp. |
| 400 | token_not_enabled | Dự án chưa chọn token này. |
| 400 | currency_not_available | Dự án không thể nhận loại tiền này trên chuỗi nào. |
| 400 | deposits_disabled | Dự án đã tắt địa chỉ nạp. |
| 400 | amount_below_minimum | Thấp hơn số tiền tối thiểu, xem details.min_amount. |
| 401 | unauthorized | API key bị thiếu, không hợp lệ hoặc đã thu hồi. |
| 403 | project_disabled | Dự án đã bị vô hiệu hóa. |
| 404 | not_found | Tài nguyên không tồn tại hoặc thuộc dự án khác. |
| 409 | request_in_progress | Yêu cầu có cùng Idempotency-Key vẫn đang xử lý. Hãy thử lại sau. |
| 422 | idempotency_key_reused | Cùng một Idempotency-Key đã được dùng cho yêu cầu khác. |
| 500 | internal_error | Lỗi máy chủ. Hãy thử lại sau với cùng Idempotency-Key. |
Thanh toán
Một thanh toán là một đơn hàng người dùng cần trả. Người dùng trả trên trang thanh toán và bạn nhận kết quả qua webhook.
Tạo thanh toán
POST/v1/payment_intents| Tham số | Mô tả |
|---|---|
currency bắt buộc | Loại tiền, ví dụ USDT. Xem currencies trong GET /v1/chains. |
amount bắt buộc | Số lượng token, tối đa 6 chữ số thập phân, ví dụ "25.00". |
chains | Chỉ nhận trên các chuỗi này, ví dụ ["bsc", "base"]. Mặc định là mọi chuỗi mà dự án nhận loại tiền này. |
customer | ID người dùng trong hệ thống của bạn: 1 đến 128 chữ cái, chữ số hoặc _ - . : @. |
expires_in | Thời hạn tính bằng giây, 60 đến 604800 (7 ngày). Mặc định 1800 (30 phút). |
metadata | Đối tượng JSON bất kỳ, tối đa 50 khóa và 8KB, trả về nguyên dạng trong API và webhook. Phù hợp để lưu mã đơn hàng. |
success_url | URL https mà trang thanh toán quay về sau khi trả xong. |
cancel_url | URL https quay về khi người dùng bấm Hủy. |
Các chuỗi có số tiền dưới mức tối thiểu sẽ bị loại; nếu không còn chuỗi nào, yêu cầu thất bại. Mức tối thiểu mặc định là 5 USD; phí của bạn nằm ở mục Phí của dự án trong trang quản trị.
Chỉ định token và số tiền cho từng chuỗi
Để nhận nhiều loại tiền hoặc số tiền khác nhau theo chuỗi, hãy gửi options thay cho currency, amount và chains. Tối đa 16 mục; token là ký hiệu hoặc địa chỉ hợp đồng.
"options": [
{ "chain": "bsc", "token": "USDT", "amount": "25.00" },
{ "chain": "bsc", "token": "USDC", "amount": "25.00" }
]Phản hồi
Trả về 201 và đối tượng thanh toán. Mở checkout_url cho người dùng.
{
"id": "pi_7Gm4Rk2Wp9Ls1Qv8Bd3Zt6",
"object": "payment_intent",
"status": "pending",
"livemode": true,
"customer": "user_42",
"checkout_url": "https://pay.kokiwa.com/p/pi_7Gm4Rk2Wp9Ls1Qv8Bd3Zt6",
"metadata": { "order_id": "10086" },
"success_url": "https://your-shop.com/orders/10086",
"cancel_url": null,
"created_at": "2026-11-02T08:30:00Z",
"expires_at": "2026-11-02T09:00:00Z",
"paid_at": null,
"paid_option": null,
"options": [
{
"id": "pio_5Hq2Tz8rLw0aVb3Kc9XyN1",
"chain": "bsc",
"token": { "symbol": "USDT", "address": "0x55d3…7955", "decimals": 18 },
"amount": "25.00",
"received": "0.00",
"deposit_address": "0x8b1F…c04E"
},
{
"id": "pio_2Mn7Xc4bQe6uJs1Ga8RvK3",
"chain": "base",
"token": { "symbol": "USDT", "address": "0xfde4…9bb2", "decimals": 6 },
"amount": "25.00",
"received": "0.00",
"deposit_address": null
}
],
"deposits": []
}| Trường | Mô tả |
|---|---|
options | Các lựa chọn của người dùng: mỗi mục là một token trên một chuỗi. |
options[].received | Số tiền đã nhận cho mục này. |
options[].deposit_address | Địa chỉ chuyển riêng của thanh toán này, bạn cũng có thể hiển thị trên trang của mình. Là null khi không có phương thức này (chuỗi khác BNB Chain hoặc số tiền quá nhỏ). |
paid_option | options[].id mà người dùng thực sự đã trả. |
deposits | Mọi khoản nạp ghi vào thanh toán này, cũ nhất trước. Xem đối tượng khoản nạp. |
livemode | true trên mainnet, false trên testnet. |
Tra cứu thanh toán
GET/v1/payment_intents/{id}Trả về đối tượng thanh toán. Dùng để đối soát hoặc kiểm tra trạng thái khi không nhận được webhook.
Trạng thái thanh toán
| status | Mô tả |
|---|---|
pending | Đang chờ thanh toán. |
partially_paid | Các khoản chuyển vào địa chỉ riêng còn thiếu amount − received. Đừng giao hàng; trạng thái thành paid khi người dùng trả đủ. |
paid | Đã trả đủ, có thể giao hàng. Phần trả dư cũng tính vào received, kokiwa không tự hoàn lại. |
expired | Hết hạn mà chưa trả. |
paid_late | Tiền đến địa chỉ riêng sau khi hết hạn. Tiền đã thuộc về bạn: hãy quyết định giao hàng hay hoàn tiền. |
Địa chỉ nạp
Lấy địa chỉ nạp của khách hàng
POST/v1/deposit_addresses| Tham số | Mô tả |
|---|---|
customer bắt buộc | ID người dùng trong hệ thống của bạn, quy tắc như thanh toán. Được tạo ở lần dùng đầu tiên. |
chain | Hiện chỉ có bsc, cũng là giá trị mặc định. |
{
"object": "deposit_address",
"customer": "user_42",
"chain": "bsc",
"address": "0x3c9A…71d2",
"tokens": [
{ "symbol": "USDT", "address": "0x55d3…7955", "decimals": 18, "min_settle_amount": "5.00" }
]
}Cùng một người dùng luôn nhận cùng địa chỉ, nên có thể hiển thị lâu dài. Chỉ các token trong tokens mới được ghi có.
Mỗi khoản chuyển gửi deposit.confirmed. Khoản dưới min_settle_amount vẫn được ghi có với trạng thái held; khi địa chỉ tích đủ mức tối thiểu, chúng được gom cùng lúc về địa chỉ nhận tiền của bạn với một lần phí cố định.
Khoản nạp
Khoản nạp (deposit) là một khoản thanh toán trên chuỗi đã ghi có, từ một thanh toán hoặc địa chỉ nạp. Một thanh toán có thể có nhiều khoản.
{
"id": "dep_9Kx2Pa6Wn3Ty8Lq5Rb1Ms4",
"object": "deposit",
"status": "settled",
"method": "wallet",
"chain": "bsc",
"customer": "user_42",
"payment_intent": "pi_7Gm4Rk2Wp9Ls1Qv8Bd3Zt6",
"token": { "symbol": "USDT", "address": "0x55d3…7955", "decimals": 18 },
"amount": "25.00",
"fee": "0.0875",
"net": "24.9125",
"usd_value": "25.00",
"confirmed_at": "2026-11-02T08:41:07Z",
"transaction": {
"hash": "0x4e7a…91c3",
"log_index": 212,
"block_number": 44718235,
"block_time": "2026-11-02T08:40:58Z",
"from": "0x1f9C…a2B0",
"to": "0x7d3E…09f1",
"raw_amount": "25000000000000000000"
},
"settlement": {
"tx_hash": "0x4e7a…91c3",
"by": "payment",
"settled_at": "2026-11-02T08:40:58Z"
}
}| Trường | Mô tả |
|---|---|
method | wallet: trả bằng ví. deposit_address: chuyển vào địa chỉ. |
customer | ID người dùng bạn đã gửi, hoặc null. |
payment_intent | Thanh toán liên quan; null với địa chỉ nạp. |
amount、fee、net | Số người dùng trả, phí và số bạn nhận. Khi held, fee là 0 và được xác định lúc gom. |
usd_value | amount quy ra đô la theo giá token do kokiwa đặt. |
transaction | Giao dịch trả tiền của người dùng trên chuỗi, có thể đối chiếu trên trình khám phá khối. Khi một giao dịch có nhiều khoản chuyển, hash + log_index xác định một khoản. from không phải lúc nào cũng là ví của người dùng: khi rút từ sàn đó là địa chỉ của sàn. raw_amount là giá trị gốc của khoản chuyển trên chuỗi theo đơn vị nhỏ nhất của token, chỉ để đối chiếu trên trình khám phá khối. |
settlement | Giao dịch đến địa chỉ nhận tiền của bạn, hoặc null khi chưa kết toán. by là payment (chính thanh toán kết toán), kokiwa (kokiwa gom) hoặc owner (bạn tự lấy về bằng ví, không phí). Các khoản gom cùng nhau có chung tx_hash. |
| status | Mô tả |
|---|---|
confirmed | Đã xác nhận trên chuỗi, chờ gom về địa chỉ nhận tiền. Có thể ghi có cho người dùng. |
held | Đã xác nhận trên chuỗi, còn quá nhỏ để gom. Có thể ghi có cho người dùng. |
settled | Đã đến địa chỉ nhận tiền của bạn. |
Tra cứu một khoản nạp
GET/v1/deposits/{id}Liệt kê khoản nạp
GET/v1/depositsMới nhất trước.
| Tham số truy vấn | Mô tả |
|---|---|
customer | Chỉ người dùng này. |
tx_hash | Tìm theo hash của giao dịch thanh toán hoặc kết toán. |
limit | Kích thước trang, 1 đến 100. Mặc định 20. |
starting_after | id của mục cuối trang trước. |
curl "https://api.kokiwa.com/v1/deposits?tx_hash=0x4e7a…91c3" \
-H "Authorization: Bearer $KOKIWA_KEY"
{ "object": "list", "data": [ { "id": "dep_9Kx2…", "object": "deposit", ... } ], "has_more": false }Chuỗi và token
kokiwa hỗ trợ các mạng và loại tiền dưới đây. Dùng cột chain cho chains và options[].chain, dùng cột loại tiền cho currency.
chain | Blockchain | Loại tiền | Phương thức thanh toán |
|---|---|---|---|
bsc | BNB Chain | USDT, USDC | wallet, deposit_address |
ethereum | Ethereum | USDT, USDC | wallet |
arbitrum | Arbitrum | USDT, USDC | wallet |
base | Base | USDT, USDC | wallet |
polygon | Polygon | USDT, USDC | wallet |
optimism | Optimism | USDT, USDC | wallet |
ton | TON | USDT | wallet |
solana | Solana | USDT, USDC | wallet |
Testnet chỉ có USDT. Token là tUSDT, nhưng currency vẫn là USDT.
Đây là toàn bộ giá trị có thể dùng, không phải dự án nào cũng dùng được hết. Cấu hình của mỗi doanh nghiệp khác nhau, nên hãy tra cứu những gì thực sự khả dụng bằng API bên dưới.
Tra cứu mạng và token của dự án
GET/v1/chainsTrả về những gì dự án của key có thể nhận trên mạng hiện tại.
{
"object": "list",
"livemode": true,
"currencies": ["USDT"],
"data": [
{
"object": "chain", "chain": "bsc", "name": "BNB Smart Chain", "chain_id": 56, "testnet": false, "native": "BNB",
"payout_registered": true, "active": true,
"methods": { "wallet": true, "deposit_address": true },
"tokens": [
{ "symbol": "USDT", "asset": "USDT", "address": "0x55d398326f99059fF775485246999027B3197955", "decimals": 18, "accepted": true },
{ "symbol": "USDC", "asset": "USDC", "address": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", "decimals": 18, "accepted": false }
]
}
]
}| Trường | Mô tả |
|---|---|
currencies | Các loại tiền có thể gửi làm currency lúc này. |
data[].chain | Giá trị cho chain và options[].chain: bsc, ethereum, arbitrum, base, polygon, optimism, ton, solana. |
data[].active | Chuỗi này có nhận tiền được ngay không: đã đăng ký địa chỉ, đã bật phương thức và đã chọn token. |
data[].tokens[].asset | Loại tiền của token. Các token cùng asset tương đương giữa các chuỗi. |
data[].tokens[].accepted | Dự án đã chọn token này hay chưa. |
Khách hàng
Tùy chọn. Khách hàng được tạo khi giá trị customer xuất hiện lần đầu; bạn chỉ cần các endpoint này để lọc theo thẻ trong trang quản trị.
Đặt nhãn và ghi chú
PUT/v1/customers/{external_id}| Tham số | Mô tả |
|---|---|
tags | Tối đa 20 thẻ, mỗi thẻ 1 đến 64 chữ cái, chữ số hoặc _ - . :. |
metadata | Đối tượng JSON bất kỳ, tối đa 50 khóa và 8KB. |
Tra cứu khách hàng
GET/v1/customers/{external_id}Trả về thẻ, ghi chú và deposit_addresses (địa chỉ nạp theo chuỗi).