kokiwa

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" }
  }
}
HTTPcode说明
400invalid_*参数不合法,message 会指出字段。
400chain_not_enabled项目在这条链上没有生效的收款地址,或关闭了收款。
400chain_not_available这条链目前不收款。
400chain_not_supported这条链没有充值地址。
400token_not_enabled项目没有勾选这个代币。
400currency_not_available项目在任何链上都收不了这个币种。
400deposits_disabled项目关闭了充值地址。
400amount_below_minimum低于最低收款金额,最低金额见 details.min_amount。
401unauthorized缺少 API key,或 key 无效、已撤销。
403project_disabled项目已被停用。
404not_found资源不存在,或不属于这个项目。
409request_in_progress同一个 Idempotency-Key 的请求还在处理,稍后重试。
422idempotency_key_reused同一个 Idempotency-Key 用于了不同的请求内容。
500internal_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"
  }
}
字段说明
methodwallet:钱包付款。deposit_address:转账到地址。
customer你传入的用户 ID,没有时为 null。
payment_intent所属支付单;充值地址的入账为 null。
amount、fee、net用户支付的金额、手续费、你实收的金额。held 状态下 fee 为 0,归集时才确定。
usd_valueamount 按 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链币种收款方式
bscBNB ChainUSDT, USDCwallet, deposit_address
ethereumEthereumUSDT, USDCwallet
arbitrumArbitrumUSDT, USDCwallet
baseBaseUSDT, USDCwallet
polygonPolygonUSDT, USDCwallet
optimismOptimismUSDT, USDCwallet
tonTONUSDTwallet
solanaSolanaUSDT, USDCwallet

测试网只有 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[].chainchain 和 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(按链列出的充值地址)。

Connect a wallet with WalletConnect