Referencia de la API
Llama a todos los endpoints desde tu servidor. Las solicitudes y respuestas son JSON. Las URL de webhook y las claves API se gestionan en el panel de comercio.
¿Quieres código listo para copiar? Ejemplos de integración en Node.js, Python, PHP, Go y Java
| Endpoint | Uso |
|---|---|
POST /v1/payment_intents | Crear un pago |
GET /v1/payment_intents/{id} | Consultar un pago |
POST /v1/deposit_addresses | Obtener la dirección de depósito de un usuario |
GET /v1/deposits | Listar depósitos |
GET /v1/deposits/{id} | Consultar un depósito |
GET /v1/chains | Ver las cadenas y tokens del proyecto |
PUT /v1/customers/{external_id} | Añadir etiquetas y notas a un usuario (opcional) |
GET /v1/customers/{external_id} | Consultar un usuario (opcional) |
Convenciones
| URL base | https://api.kokiwa.com, tanto para mainnet como para testnet. |
| Autenticación | Cabecera Authorization: Bearer sk_…. Las claves que empiezan por sk_live_ acceden a mainnet y las que empiezan por sk_test_ a testnet; sus datos están totalmente separados. Una clave solo accede a su propio proyecto. |
| Importes | Cadenas en unidades del token, como "25.00". Las solicitudes admiten hasta 6 decimales; las respuestas conservan la precisión de la cadena, así que el número de decimales varía. Solo transaction.raw_amount es el valor bruto en la cadena. |
| Fechas | ISO 8601 UTC, como 2026-11-02T08:30:00Z. |
| Direcciones | Las direcciones EVM se devuelven en formato de suma de comprobación EIP-55. Muéstralas sin cambios e ignora mayúsculas al compararlas. |
| Idempotencia | Las solicitudes POST pueden enviar Idempotency-Key (hasta 255 caracteres). Un reintento con la misma clave devuelve el primer resultado con la cabecera Idempotent-Replayed: true. |
Errores
Los fallos devuelven 4xx o 5xx. Decide según code; message es solo para depurar.
{
"error": {
"code": "amount_below_minimum",
"message": "options[0].amount is below the minimum",
"details": { "min_amount": "5.00" }
}
}| HTTP | code | Significado |
|---|---|---|
| 400 | invalid_* | Parámetro no válido; message indica el campo. |
| 400 | chain_not_enabled | El proyecto no tiene dirección de cobro activa en esta cadena o tiene los cobros desactivados. |
| 400 | chain_not_available | Esta cadena no acepta cobros por ahora. |
| 400 | chain_not_supported | Esta cadena no tiene direcciones de depósito. |
| 400 | token_not_enabled | El proyecto no ha seleccionado este token. |
| 400 | currency_not_available | El proyecto no puede aceptar esta moneda en ninguna cadena. |
| 400 | deposits_disabled | El proyecto ha desactivado las direcciones de depósito. |
| 400 | amount_below_minimum | Por debajo del importe mínimo, indicado en details.min_amount. |
| 401 | unauthorized | Falta la clave API, o no es válida o está revocada. |
| 403 | project_disabled | El proyecto está desactivado. |
| 404 | not_found | El recurso no existe o pertenece a otro proyecto. |
| 409 | request_in_progress | Una solicitud con la misma Idempotency-Key sigue en curso. Reintenta en breve. |
| 422 | idempotency_key_reused | La misma Idempotency-Key se usó con otra solicitud. |
| 500 | internal_error | Error del servidor. Reintenta más tarde con la misma Idempotency-Key. |
Pagos
Un pago es un pedido que debe pagar el usuario. El usuario paga en el checkout y recibes el resultado por webhook.
Crear un pago
POST/v1/payment_intents| Parámetro | Descripción |
|---|---|
currency obligatorio | Moneda, como USDT. Consulta currencies en GET /v1/chains. |
amount obligatorio | Importe en unidades del token, con hasta 6 decimales, como "25.00". |
chains | Acepta el pago solo en estas cadenas, como ["bsc", "base"]. Por defecto, todas las cadenas en las que el proyecto acepta esta moneda. |
customer | El ID del usuario en tu sistema: de 1 a 128 letras, dígitos o _ - . : @. |
expires_in | Duración en segundos, de 60 a 604800 (7 días). Por defecto 1800 (30 minutos). |
metadata | Cualquier objeto JSON, hasta 50 claves y 8KB, devuelto sin cambios por la API y los webhooks. Buen lugar para tu número de pedido. |
success_url | URL https a la que vuelve el checkout tras el pago. |
cancel_url | URL https a la que vuelve el checkout cuando el usuario pulsa Cancelar. |
Las cadenas donde el importe no llega al mínimo se excluyen; si no queda ninguna, la solicitud falla. El mínimo predeterminado es 5 USD; tus comisiones están en la sección Comisiones del proyecto en el panel.
Indica el token y el importe por cadena
Para aceptar varias monedas, o un importe distinto por cadena, envía options en lugar de currency, amount y chains. Hasta 16 elementos; token es un símbolo o una dirección de contrato.
"options": [
{ "chain": "bsc", "token": "USDT", "amount": "25.00" },
{ "chain": "bsc", "token": "USDC", "amount": "25.00" }
]Respuesta
Devuelve 201 y el pago. Abre checkout_url para el usuario.
{
"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": []
}| Campo | Descripción |
|---|---|
options | Lo que el usuario puede elegir: un token en una cadena por elemento. |
options[].received | Importe recibido hasta ahora en este elemento. |
options[].deposit_address | La dirección de transferencia exclusiva de este pago, que también puedes mostrar en tu página. null si ese método no está disponible (cadenas distintas de BNB Chain o importe muy pequeño). |
paid_option | La options[].id que el usuario pagó realmente. |
deposits | Cada depósito abonado a este pago, del más antiguo al más reciente. Consulta el objeto depósito. |
livemode | true en mainnet, false en testnet. |
Consultar un pago
GET/v1/payment_intents/{id}Devuelve el pago. Úsalo para conciliar o para comprobar el estado si no llega un webhook.
Estado del pago
| status | Descripción |
|---|---|
pending | Esperando el pago. |
partially_paid | Las transferencias a la dirección exclusiva no llegan al total: faltan amount − received. No envíes; pasa a paid cuando el usuario pague el resto. |
paid | Pagado por completo, listo para enviar. Cualquier exceso también cuenta en received; kokiwa no lo devuelve. |
expired | Caducado sin pago. |
paid_late | Llegaron fondos a la dirección exclusiva tras caducar. El dinero es tuyo: decide si envías o reembolsas. |
Direcciones de depósito
Obtener la dirección de depósito de un cliente
POST/v1/deposit_addresses| Parámetro | Descripción |
|---|---|
customer obligatorio | El ID del usuario en tu sistema, con las mismas reglas que en los pagos. Se crea en el primer uso. |
chain | Por ahora solo bsc, que también es el valor predeterminado. |
{
"object": "deposit_address",
"customer": "user_42",
"chain": "bsc",
"address": "0x3c9A…71d2",
"tokens": [
{ "symbol": "USDT", "address": "0x55d3…7955", "decimals": 18, "min_settle_amount": "5.00" }
]
}El mismo usuario siempre recibe la misma dirección, así que puedes mostrarla a largo plazo. Solo se abonan los tokens de tokens.
Cada transferencia envía deposit.confirmed. Las transferencias por debajo de min_settle_amount también se abonan, con estado held; cuando la dirección acumula el mínimo, se barren juntas a tu dirección de cobro con una sola comisión fija.
Depósitos
Un depósito es un pago en la cadena ya abonado, de un pago o de una dirección de depósito. Un pago puede tener varios.
{
"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"
}
}| Campo | Descripción |
|---|---|
method | wallet: pagado con billetera. deposit_address: transferido a una dirección. |
customer | El ID de usuario que enviaste, o null. |
payment_intent | El pago al que pertenece; null para direcciones de depósito. |
amount、fee、net | Lo que pagó el usuario, la comisión y lo que recibes. Mientras está held, fee es 0 y se fija en el barrido. |
usd_value | amount en dólares al precio del token fijado por kokiwa. |
transaction | El pago del usuario en la cadena, que puedes comprobar en un explorador de bloques. Si una transacción tiene varias transferencias, hash + log_index identifican una. from no siempre es la billetera del usuario: tras un retiro de exchange es la dirección del exchange. raw_amount es el valor bruto de la transferencia en la unidad mínima del token, solo para comprobarla en un explorador de bloques. |
settlement | La transacción que llegó a tu dirección de cobro, o null hasta liquidarse. by es payment (liquidado por el propio pago), kokiwa (barrido por kokiwa) u owner (recuperado con tu billetera, sin comisión). Los depósitos barridos juntos comparten tx_hash. |
| status | Descripción |
|---|---|
confirmed | Confirmado en la cadena, esperando el barrido a tu dirección de cobro. Puedes abonar al usuario. |
held | Confirmado en la cadena, aún muy pequeño para barrer. Puedes abonar al usuario. |
settled | Llegó a tu dirección de cobro. |
Consultar un depósito
GET/v1/deposits/{id}Listar depósitos
GET/v1/depositsDel más reciente al más antiguo.
| Parámetro de consulta | Descripción |
|---|---|
customer | Solo este usuario. |
tx_hash | Busca por el hash de la transacción de pago o de liquidación. |
limit | Tamaño de página, de 1 a 100. Por defecto 20. |
starting_after | El id del último elemento de la página anterior. |
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 }Cadenas y tokens
kokiwa admite las cadenas y monedas siguientes. Usa la columna chain para chains y options[].chain, y la columna de monedas para currency.
chain | Blockchain | Monedas | Métodos de pago |
|---|---|---|---|
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 |
La testnet solo admite USDT. El token es tUSDT, pero currency sigue siendo USDT.
Este es el rango completo de valores, no lo que puede aceptar cada proyecto. La configuración varía según el comercio, así que consulta lo disponible con el endpoint de abajo.
Consultar las cadenas y tokens del proyecto
GET/v1/chainsDevuelve lo que puede aceptar el proyecto de la clave en la red actual.
{
"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 }
]
}
]
}| Campo | Descripción |
|---|---|
currencies | Monedas que puedes enviar ahora como currency. |
data[].chain | El valor para chain y options[].chain: bsc, ethereum, arbitrum, base, polygon, optimism, ton, solana. |
data[].active | Si la cadena puede cobrar ahora: dirección de cobro registrada, un método activo y un token seleccionado. |
data[].tokens[].asset | La moneda del token. Los tokens con el mismo asset son equivalentes entre cadenas. |
data[].tokens[].accepted | Si el proyecto seleccionó este token. |
Clientes
Opcional. Un cliente se crea la primera vez que aparece un valor de customer; solo necesitas estos endpoints para filtrar por etiqueta en el panel.
Definir etiqueta y nota
PUT/v1/customers/{external_id}| Parámetro | Descripción |
|---|---|
tags | Hasta 20 etiquetas de 1 a 64 letras, dígitos o _ - . :. |
metadata | Cualquier objeto JSON, hasta 50 claves y 8KB. |
Consultar un cliente
GET/v1/customers/{external_id}Devuelve las etiquetas, las notas y deposit_addresses (direcciones de depósito por cadena).