API 參考
所有接口都從你的服務端調用,請求和返回都是 JSON。Webhook 地址和 API key 在商戶後台管理。
想直接複製可用的程式碼? Node.js、Python、PHP、Go、Java 接入範例
| 接口 | 用途 |
|---|---|
POST /v1/payment_intents | 建立支付單 |
GET /v1/payment_intents/{id} | 查詢支付單 |
POST /v1/deposit_addresses | 獲取用戶的充值地址 |
GET /v1/deposits | 列出入帳記錄 |
GET /v1/deposits/{id} | 查詢一筆入帳 |
GET /v1/chains | 查詢項目可用的鏈和代幣 |
PUT /v1/customers/{external_id} | 給用戶加標籤和備註(可選) |
GET /v1/customers/{external_id} | 查詢用戶(可選) |
基本約定
| 地址 | https://api.kokiwa.com,主網和測試網相同。 |
| 認證 | 請求頭 Authorization: Bearer sk_…。sk_live_ 開頭的 key 訪問主網,sk_test_ 開頭的訪問測試網,兩邊數據完全分開。一個 key 只能訪問它所屬的項目。 |
| 金額 | 代幣數量的字符串,例如 "25.00"。請求最多 6 位小數;返回保留鏈上的完整精度,小數位數不固定。只有 transaction.raw_amount 是鏈上原始值。 |
| 時間 | ISO 8601 UTC,例如 2026-11-02T08:30:00Z。 |
| 地址格式 | EVM 地址以 EIP-55 校驗和格式返回,請原樣展示;比對時忽略大小寫。 |
| 冪等 | POST 請求可帶 Idempotency-Key(最長 255 字符)。同一個 key 重試會返回第一次的結果,響應頭帶 Idempotent-Replayed: true。 |
錯誤
失敗時返回 4xx 或 5xx。請按 code 判斷錯誤類型,message 只用於排查。
{
"error": {
"code": "amount_below_minimum",
"message": "options[0].amount is below the minimum",
"details": { "min_amount": "5.00" }
}
}| HTTP | code | 說明 |
|---|---|---|
| 400 | invalid_* | 參數不合法,message 會指出字段。 |
| 400 | chain_not_enabled | 項目在這條鏈上沒有生效的收款地址,或關閉了收款。 |
| 400 | chain_not_available | 這條鏈目前不收款。 |
| 400 | chain_not_supported | 這條鏈沒有充值地址。 |
| 400 | token_not_enabled | 項目沒有勾選這個代幣。 |
| 400 | currency_not_available | 項目在任何鏈上都收不了這個幣種。 |
| 400 | deposits_disabled | 項目關閉了充值地址。 |
| 400 | amount_below_minimum | 低於最低收款金額,最低金額見 details.min_amount。 |
| 401 | unauthorized | 缺少 API key,或 key 無效、已撤銷。 |
| 403 | project_disabled | 項目已被停用。 |
| 404 | not_found | 資源不存在,或不屬於這個項目。 |
| 409 | request_in_progress | 同一個 Idempotency-Key 的請求還在處理,稍後重試。 |
| 422 | idempotency_key_reused | 同一個 Idempotency-Key 用於了不同的請求內容。 |
| 500 | internal_error | 服務端錯誤,稍後用同一個 Idempotency-Key 重試。 |
支付單
一張支付單是一筆要用戶支付的訂單。用戶在收銀台付款,結果通過 Webhook 通知你。
建立支付單
POST/v1/payment_intents| 參數 | 說明 |
|---|---|
currency 必填 | 幣種,例如 USDT。可用的幣種見 GET /v1/chains 的 currencies。 |
amount 必填 | 代幣數量,最多 6 位小數,例如 "25.00"。 |
chains | 只在這些鏈上收款,例如 ["bsc", "base"]。默認是項目所有能收這個幣種的鏈。 |
customer | 你系統裡的用戶 ID,1 到 128 個字符,可用字母、數字和 _ - . : @。 |
expires_in | 有效期秒數,60 到 604800(7 天),默認 1800(30 分鐘)。 |
metadata | 任意 JSON 對象,最多 50 個鍵、8KB,原樣出現在查詢結果和 Webhook 裡,適合放訂單號。 |
success_url | 付款成功後收銀台跳轉的 https 地址。 |
cancel_url | 用戶點「取消」時跳轉的 https 地址。 |
低於最低收款金額的鏈會被排除;所有鏈都不滿足時返回錯誤。默認最低金額是 5 美元,你的費率見後台項目的「費率」部分。
指定每條鏈的代幣和金額
需要同時收多個幣種,或者每條鏈金額不同時,用 options 代替 currency、amount 和 chains。最多 16 項,token 填符號或合約地址。
"options": [
{ "chain": "bsc", "token": "USDT", "amount": "25.00" },
{ "chain": "bsc", "token": "USDC", "amount": "25.00" }
]返回
返回 201 和支付單對象。把 checkout_url 給用戶打開。
{
"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": []
}| 字段 | 說明 |
|---|---|
options | 用戶可以選擇的付款方式,每項一條鏈的一個代幣。 |
options[].received | 這一項已收到的金額。 |
options[].deposit_address | 這張單專屬的轉帳地址,也可以在你自己的頁面上展示。沒有這個方式時為 null(BNB Chain 以外的鏈,或金額太小)。 |
paid_option | 用戶實際付款的 options[].id。 |
deposits | 這張單收到的每筆入帳,最早的在前,見入帳對象。 |
livemode | 主網為 true,測試網為 false。 |
查詢支付單
GET/v1/payment_intents/{id}返回支付單對象。用於對帳,或在沒有收到 Webhook 時確認狀態。
支付單狀態
| status | 說明 |
|---|---|
pending | 等待付款。 |
partially_paid | 轉帳到專屬地址的金額不足,還差 amount − received。不要發貨,用戶補足後變為 paid。 |
paid | 已全額收到,可以發貨。多付的金額也計入 received,kokiwa 不自動退回。 |
expired | 過期未付款。 |
paid_late | 過期後才有款項轉入專屬地址。錢已經到你這邊,由你決定發貨還是退款。 |
充值地址
獲取用戶的充值地址
POST/v1/deposit_addresses| 參數 | 說明 |
|---|---|
customer 必填 | 你系統裡的用戶 ID,規則同支付單。第一次使用時自動建立用戶。 |
chain | 目前只支持 bsc,也是默認值。 |
{
"object": "deposit_address",
"customer": "user_42",
"chain": "bsc",
"address": "0x3c9A…71d2",
"tokens": [
{ "symbol": "USDT", "address": "0x55d3…7955", "decimals": 18, "min_settle_amount": "5.00" }
]
}同一個用戶永遠返回同一個地址,可以長期展示。只有轉入 tokens 列出的代幣才會入帳。
每筆轉帳都會發 deposit.confirmed。低於 min_settle_amount 的轉帳同樣入帳,狀態為 held;這個地址累積到最低金額後一起歸集到你的收款地址,只收一次固定手續費。
入帳
入帳(deposit)是一筆計入的鏈上付款,來自支付單或充值地址。一張支付單可以有多筆入帳。
{
"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"
}
}| 字段 | 說明 |
|---|---|
method | wallet:錢包付款。deposit_address:轉帳到地址。 |
customer | 你傳入的用戶 ID,沒有時為 null。 |
payment_intent | 所屬支付單;充值地址的入帳為 null。 |
amount、fee、net | 用戶支付的金額、手續費、你實收的金額。held 狀態下 fee 為 0,歸集時才確定。 |
usd_value | amount 按 kokiwa 設定的代幣價格折算的美元值。 |
transaction | 用戶付款的鏈上交易,可以在區塊瀏覽器上核對。同一筆交易有多筆轉帳時,用 hash + log_index 區分。from 不一定是用戶本人的錢包,從交易所提幣時是交易所的地址。 raw_amount 是這筆轉帳的鏈上原始值(代幣最小單位),只用於和區塊瀏覽器核對。 |
settlement | 款項到你收款地址的交易,未結算時為 null。by 為 payment(付款交易本身完成結算)、kokiwa(kokiwa 歸集)或 owner(你用自己的錢包取回,不收手續費)。一起歸集的入帳 tx_hash 相同。 |
| status | 說明 |
|---|---|
confirmed | 已在鏈上確認,等待歸集到你的收款地址。可以給用戶入帳。 |
held | 已在鏈上確認,金額太小,累積中。可以給用戶入帳。 |
settled | 已到你的收款地址。 |
查詢一筆入帳
GET/v1/deposits/{id}列出入帳
GET/v1/deposits按時間從新到舊返回。
| 查詢參數 | 說明 |
|---|---|
customer | 只看某個用戶。 |
tx_hash | 按付款交易或結算交易的哈希查找。 |
limit | 每頁條數,1 到 100,默認 20。 |
starting_after | 上一頁最後一條的 id,用於翻頁。 |
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 }鏈和代幣
kokiwa 支持下面的鏈和幣種。chains、options[].chain 填 chain 列的值,currency 填幣種列的值。
chain | 鏈 | 幣種 | 收款方式 |
|---|---|---|---|
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 |
測試網只有 USDT。代幣是 tUSDT,currency 仍然填 USDT。
這裡是可以填寫的全部範圍,不代表某個項目都能使用。每個商戶的配置不同,實際可用的鏈和幣種請用下面的接口查詢。
查詢項目可用的鏈和代幣
GET/v1/chains返回這個 key 所屬的項目在當前網絡的收款能力。
{
"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 }
]
}
]
}| 字段 | 說明 |
|---|---|
currencies | 現在可以傳給 currency 的幣種。 |
data[].chain | chain 和 options[].chain 使用的值:bsc、ethereum、arbitrum、base、polygon、optimism、ton、solana。 |
data[].active | 這條鏈現在能否收款:已登記收款地址、開了收款方式、勾選了代幣。 |
data[].tokens[].asset | 代幣對應的幣種,asset 相同的代幣在不同鏈上等價。 |
data[].tokens[].accepted | 項目是否勾選了這個代幣。 |
客戶
可選。customer 第一次出現時會自動建立客戶,只有需要在後台按標籤篩選時才用這組接口。
設置標籤和備註
PUT/v1/customers/{external_id}| 參數 | 說明 |
|---|---|
tags | 最多 20 個標籤,每個 1 到 64 個字符(字母、數字和 _ - . :)。 |
metadata | 任意 JSON 對象,最多 50 個鍵、8KB。 |
查詢客戶
GET/v1/customers/{external_id}返回標籤、備註和 deposit_addresses(按鏈列出的充值地址)。