kokiwa

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.

EndpointMục đích
POST /v1/payment_intentsTạo thanh toán
GET /v1/payment_intents/{id}Lấy thanh toán
POST /v1/deposit_addressesLấy địa chỉ nạp của người dùng
GET /v1/depositsLiệt kê khoản nạp
GET /v1/deposits/{id}Lấy một khoản nạp
GET /v1/chainsXem 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ốchttps://api.kokiwa.com, dùng chung cho mainnet và testnet.
Xác thựcHeader 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ềnChuỗ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 gianISO 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 đẳngYê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" }
  }
}
HTTPcodeÝ nghĩa
400invalid_*Tham số không hợp lệ; message chỉ ra trường.
400chain_not_enabledDự á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.
400chain_not_availableChuỗi này hiện không nhận thanh toán.
400chain_not_supportedChuỗi này không có địa chỉ nạp.
400token_not_enabledDự án chưa chọn token này.
400currency_not_availableDự án không thể nhận loại tiền này trên chuỗi nào.
400deposits_disabledDự án đã tắt địa chỉ nạp.
400amount_below_minimumThấp hơn số tiền tối thiểu, xem details.min_amount.
401unauthorizedAPI key bị thiếu, không hợp lệ hoặc đã thu hồi.
403project_disabledDự án đã bị vô hiệu hóa.
404not_foundTài nguyên không tồn tại hoặc thuộc dự án khác.
409request_in_progressYêu cầu có cùng Idempotency-Key vẫn đang xử lý. Hãy thử lại sau.
422idempotency_key_reusedCùng một Idempotency-Key đã được dùng cho yêu cầu khác.
500internal_errorLỗ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ộcLoại tiền, ví dụ USDT. Xem currencies trong GET /v1/chains.
amount bắt buộcSố lượng token, tối đa 6 chữ số thập phân, ví dụ "25.00".
chainsChỉ 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.
customerID người dùng trong hệ thống của bạn: 1 đến 128 chữ cái, chữ số hoặc _ - . : @.
expires_inThờ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_urlURL https mà trang thanh toán quay về sau khi trả xong.
cancel_urlURL 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ườngMô tả
optionsCá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[].receivedSố 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_optionoptions[].id mà người dùng thực sự đã trả.
depositsMọ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.
livemodetrue 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

statusMô tả
pendingĐang chờ thanh toán.
partially_paidCá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.
expiredHết hạn mà chưa trả.
paid_lateTiề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ộcID 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.
chainHiệ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ườngMô tả
methodwallet: trả bằng ví. deposit_address: chuyển vào địa chỉ.
customerID người dùng bạn đã gửi, hoặc null.
payment_intentThanh toán liên quan; null với địa chỉ nạp.
amount、fee、netSố 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_valueamount quy ra đô la theo giá token do kokiwa đặt.
transactionGiao 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.
settlementGiao 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.
statusMô 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/deposits

Mới nhất trước.

Tham số truy vấnMô tả
customerChỉ người dùng này.
tx_hashTìm theo hash của giao dịch thanh toán hoặc kết toán.
limitKích thước trang, 1 đến 100. Mặc định 20.
starting_afterid 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.

chainBlockchainLoại tiềnPhương thức thanh toán
bscBNB ChainUSDT, USDCwallet, deposit_address
ethereumEthereumUSDT, USDCwallet
arbitrumArbitrumUSDT, USDCwallet
baseBaseUSDT, USDCwallet
polygonPolygonUSDT, USDCwallet
optimismOptimismUSDT, USDCwallet
tonTONUSDTwallet
solanaSolanaUSDT, USDCwallet

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/chains

Trả 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ườngMô tả
currenciesCác loại tiền có thể gửi làm currency lúc này.
data[].chainGiá trị cho chain và options[].chain: bsc, ethereum, arbitrum, base, polygon, optimism, ton, solana.
data[].activeChuỗ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[].assetLoại tiền của token. Các token cùng asset tương đương giữa các chuỗi.
data[].tokens[].acceptedDự á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ả
tagsTố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).

Connect a wallet with WalletConnect