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(按链列出的充值地址)。