kokiwa

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.

EndpointUso
POST /v1/payment_intentsCrear un pago
GET /v1/payment_intents/{id}Consultar un pago
POST /v1/deposit_addressesObtener la dirección de depósito de un usuario
GET /v1/depositsListar depósitos
GET /v1/deposits/{id}Consultar un depósito
GET /v1/chainsVer 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 basehttps://api.kokiwa.com, tanto para mainnet como para testnet.
AutenticaciónCabecera 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.
ImportesCadenas 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.
FechasISO 8601 UTC, como 2026-11-02T08:30:00Z.
DireccionesLas direcciones EVM se devuelven en formato de suma de comprobación EIP-55. Muéstralas sin cambios e ignora mayúsculas al compararlas.
IdempotenciaLas 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" }
  }
}
HTTPcodeSignificado
400invalid_*Parámetro no válido; message indica el campo.
400chain_not_enabledEl proyecto no tiene dirección de cobro activa en esta cadena o tiene los cobros desactivados.
400chain_not_availableEsta cadena no acepta cobros por ahora.
400chain_not_supportedEsta cadena no tiene direcciones de depósito.
400token_not_enabledEl proyecto no ha seleccionado este token.
400currency_not_availableEl proyecto no puede aceptar esta moneda en ninguna cadena.
400deposits_disabledEl proyecto ha desactivado las direcciones de depósito.
400amount_below_minimumPor debajo del importe mínimo, indicado en details.min_amount.
401unauthorizedFalta la clave API, o no es válida o está revocada.
403project_disabledEl proyecto está desactivado.
404not_foundEl recurso no existe o pertenece a otro proyecto.
409request_in_progressUna solicitud con la misma Idempotency-Key sigue en curso. Reintenta en breve.
422idempotency_key_reusedLa misma Idempotency-Key se usó con otra solicitud.
500internal_errorError 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ámetroDescripción
currency obligatorioMoneda, como USDT. Consulta currencies en GET /v1/chains.
amount obligatorioImporte en unidades del token, con hasta 6 decimales, como "25.00".
chainsAcepta el pago solo en estas cadenas, como ["bsc", "base"]. Por defecto, todas las cadenas en las que el proyecto acepta esta moneda.
customerEl ID del usuario en tu sistema: de 1 a 128 letras, dígitos o _ - . : @.
expires_inDuración en segundos, de 60 a 604800 (7 días). Por defecto 1800 (30 minutos).
metadataCualquier 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_urlURL https a la que vuelve el checkout tras el pago.
cancel_urlURL 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": []
}
CampoDescripción
optionsLo que el usuario puede elegir: un token en una cadena por elemento.
options[].receivedImporte recibido hasta ahora en este elemento.
options[].deposit_addressLa 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_optionLa options[].id que el usuario pagó realmente.
depositsCada depósito abonado a este pago, del más antiguo al más reciente. Consulta el objeto depósito.
livemodetrue 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

statusDescripción
pendingEsperando el pago.
partially_paidLas 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.
paidPagado por completo, listo para enviar. Cualquier exceso también cuenta en received; kokiwa no lo devuelve.
expiredCaducado sin pago.
paid_lateLlegaron 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ámetroDescripción
customer obligatorioEl ID del usuario en tu sistema, con las mismas reglas que en los pagos. Se crea en el primer uso.
chainPor 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"
  }
}
CampoDescripción
methodwallet: pagado con billetera. deposit_address: transferido a una dirección.
customerEl ID de usuario que enviaste, o null.
payment_intentEl pago al que pertenece; null para direcciones de depósito.
amount、fee、netLo que pagó el usuario, la comisión y lo que recibes. Mientras está held, fee es 0 y se fija en el barrido.
usd_valueamount en dólares al precio del token fijado por kokiwa.
transactionEl 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.
settlementLa 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.
statusDescripción
confirmedConfirmado en la cadena, esperando el barrido a tu dirección de cobro. Puedes abonar al usuario.
heldConfirmado en la cadena, aún muy pequeño para barrer. Puedes abonar al usuario.
settledLlegó a tu dirección de cobro.

Consultar un depósito

GET/v1/deposits/{id}

Listar depósitos

GET/v1/deposits

Del más reciente al más antiguo.

Parámetro de consultaDescripción
customerSolo este usuario.
tx_hashBusca por el hash de la transacción de pago o de liquidación.
limitTamaño de página, de 1 a 100. Por defecto 20.
starting_afterEl 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.

chainBlockchainMonedasMétodos de pago
bscBNB ChainUSDT, USDCwallet, deposit_address
ethereumEthereumUSDT, USDCwallet
arbitrumArbitrumUSDT, USDCwallet
baseBaseUSDT, USDCwallet
polygonPolygonUSDT, USDCwallet
optimismOptimismUSDT, USDCwallet
tonTONUSDTwallet
solanaSolanaUSDT, USDCwallet

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

Devuelve 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 }
      ]
    }
  ]
}
CampoDescripción
currenciesMonedas que puedes enviar ahora como currency.
data[].chainEl valor para chain y options[].chain: bsc, ethereum, arbitrum, base, polygon, optimism, ton, solana.
data[].activeSi la cadena puede cobrar ahora: dirección de cobro registrada, un método activo y un token seleccionado.
data[].tokens[].assetLa moneda del token. Los tokens con el mismo asset son equivalentes entre cadenas.
data[].tokens[].acceptedSi 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ámetroDescripción
tagsHasta 20 etiquetas de 1 a 64 letras, dígitos o _ - . :.
metadataCualquier 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).

Connect a wallet with WalletConnect