Referência da API
Chame todos os endpoints do seu servidor. Requisições e respostas são JSON. URLs de webhook e chaves de API são gerenciadas no painel do comerciante.
Quer código pronto para copiar? Exemplos de integração em Node.js, Python, PHP, Go e Java
| Endpoint | Uso |
|---|---|
POST /v1/payment_intents | Criar um pagamento |
GET /v1/payment_intents/{id} | Consultar um pagamento |
POST /v1/deposit_addresses | Obter o endereço de depósito de um usuário |
GET /v1/deposits | Listar depósitos |
GET /v1/deposits/{id} | Consultar um depósito |
GET /v1/chains | Ver as redes e tokens do projeto |
PUT /v1/customers/{external_id} | Adicionar tags e notas a um usuário (opcional) |
GET /v1/customers/{external_id} | Consultar um usuário (opcional) |
Convenções
| URL base | https://api.kokiwa.com, tanto para mainnet quanto para testnet. |
| Autenticação | Cabeçalho Authorization: Bearer sk_…. Chaves que começam com sk_live_ acessam a mainnet e as que começam com sk_test_ acessam a testnet; os dados são totalmente separados. Uma chave só acessa o próprio projeto. |
| Valores | Strings em unidades do token, como "25.00". Requisições aceitam até 6 casas decimais; respostas mantêm a precisão da blockchain, então o número de casas varia. Só transaction.raw_amount é o valor bruto on-chain. |
| Horários | ISO 8601 UTC, como 2026-11-02T08:30:00Z. |
| Endereços | Endereços EVM são retornados no formato de checksum EIP-55. Mostre-os sem alteração e ignore maiúsculas ao comparar. |
| Idempotência | Requisições POST podem enviar Idempotency-Key (até 255 caracteres). Uma nova tentativa com a mesma chave retorna o primeiro resultado com o cabeçalho Idempotent-Replayed: true. |
Erros
Falhas retornam 4xx ou 5xx. Decida por code; message serve só para depuração.
{
"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 inválido; message indica o campo. |
| 400 | chain_not_enabled | O projeto não tem endereço de recebimento ativo nesta rede ou desligou o recebimento. |
| 400 | chain_not_available | Esta rede não recebe pagamentos no momento. |
| 400 | chain_not_supported | Esta rede não tem endereços de depósito. |
| 400 | token_not_enabled | O projeto não selecionou este token. |
| 400 | currency_not_available | O projeto não pode aceitar esta moeda em nenhuma rede. |
| 400 | deposits_disabled | O projeto desligou os endereços de depósito. |
| 400 | amount_below_minimum | Abaixo do valor mínimo, informado em details.min_amount. |
| 401 | unauthorized | A chave de API está ausente, é inválida ou foi revogada. |
| 403 | project_disabled | O projeto está desativado. |
| 404 | not_found | O recurso não existe ou pertence a outro projeto. |
| 409 | request_in_progress | Uma requisição com a mesma Idempotency-Key ainda está em andamento. Tente de novo em instantes. |
| 422 | idempotency_key_reused | A mesma Idempotency-Key foi usada em outra requisição. |
| 500 | internal_error | Erro do servidor. Tente mais tarde com a mesma Idempotency-Key. |
Pagamentos
Um pagamento é um pedido a ser pago pelo usuário. O usuário paga no checkout e você recebe o resultado por webhook.
Criar um pagamento
POST/v1/payment_intents| Parâmetro | Descrição |
|---|---|
currency obrigatório | Moeda, como USDT. Veja currencies em GET /v1/chains. |
amount obrigatório | Valor em unidades do token, com até 6 casas decimais, como "25.00". |
chains | Aceita pagamento só nestas redes, como ["bsc", "base"]. Por padrão, todas as redes em que o projeto aceita esta moeda. |
customer | O ID do usuário no seu sistema: de 1 a 128 letras, dígitos ou _ - . : @. |
expires_in | Validade em segundos, de 60 a 604800 (7 dias). Padrão 1800 (30 minutos). |
metadata | Qualquer objeto JSON, até 50 chaves e 8KB, retornado sem alteração pela API e pelos webhooks. Bom lugar para o número do pedido. |
success_url | URL https para onde o checkout volta após o pagamento. |
cancel_url | URL https para onde o checkout volta quando o usuário clica em Cancelar. |
Redes em que o valor fica abaixo do mínimo são excluídas; se não sobrar nenhuma, a requisição falha. O mínimo padrão é 5 USD; suas taxas estão na seção Taxas do projeto no painel.
Definir token e valor por rede
Para aceitar várias moedas, ou um valor diferente por rede, envie options em vez de currency, amount e chains. Até 16 itens; token é um símbolo ou endereço de contrato.
"options": [
{ "chain": "bsc", "token": "USDT", "amount": "25.00" },
{ "chain": "bsc", "token": "USDC", "amount": "25.00" }
]Resposta
Retorna 201 e o pagamento. Abra checkout_url para o usuário.
{
"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 | Descrição |
|---|---|
options | O que o usuário pode escolher: um token em uma rede por item. |
options[].received | Valor recebido até agora neste item. |
options[].deposit_address | O endereço de transferência exclusivo deste pagamento, que você também pode mostrar na sua página. null quando esse método não está disponível (redes que não sejam a BNB Chain ou valor muito baixo). |
paid_option | O options[].id que o usuário realmente pagou. |
deposits | Cada depósito creditado a este pagamento, do mais antigo ao mais novo. Veja o objeto de depósito. |
livemode | true na mainnet, false na testnet. |
Consultar um pagamento
GET/v1/payment_intents/{id}Retorna o pagamento. Use para conciliação ou para verificar o status quando um webhook não chegar.
Status do pagamento
| status | Descrição |
|---|---|
pending | Aguardando pagamento. |
partially_paid | As transferências ao endereço exclusivo não atingiram o total: faltam amount − received. Não envie; passa para paid quando o usuário pagar o restante. |
paid | Pago por completo, pronto para enviar. Qualquer excedente também conta em received; o kokiwa não o devolve. |
expired | Expirou sem pagamento. |
paid_late | Chegaram fundos ao endereço exclusivo após a expiração. O dinheiro é seu: decida se envia ou reembolsa. |
Endereços de depósito
Obter o endereço de depósito de um cliente
POST/v1/deposit_addresses| Parâmetro | Descrição |
|---|---|
customer obrigatório | O ID do usuário no seu sistema, com as mesmas regras dos pagamentos. É criado no primeiro uso. |
chain | Por enquanto só bsc, que também é o padrão. |
{
"object": "deposit_address",
"customer": "user_42",
"chain": "bsc",
"address": "0x3c9A…71d2",
"tokens": [
{ "symbol": "USDT", "address": "0x55d3…7955", "decimals": 18, "min_settle_amount": "5.00" }
]
}O mesmo usuário sempre recebe o mesmo endereço, então você pode mostrá-lo a longo prazo. Só os tokens em tokens são creditados.
Cada transferência envia deposit.confirmed. Transferências abaixo de min_settle_amount também são creditadas, com status held; quando o endereço acumula o mínimo, são varridas juntas para seu endereço de recebimento com uma única taxa fixa.
Depósitos
Um depósito é um pagamento on-chain creditado, vindo de um pagamento ou de um endereço de depósito. Um pagamento pode ter vários.
{
"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 | Descrição |
|---|---|
method | wallet: pago com carteira. deposit_address: transferido para um endereço. |
customer | O ID de usuário enviado, ou null. |
payment_intent | O pagamento a que pertence; null para endereços de depósito. |
amount、fee、net | O que o usuário pagou, a taxa e o que você recebe. Enquanto held, fee é 0 e é definido na varredura. |
usd_value | amount em dólares ao preço do token definido pelo kokiwa. |
transaction | O pagamento do usuário na blockchain, que você pode conferir em um explorador de blocos. Quando uma transação tem várias transferências, hash + log_index identificam uma. from nem sempre é a carteira do usuário: após um saque de corretora, é o endereço da corretora. raw_amount é o valor bruto da transferência na menor unidade do token, só para conferir em um explorador de blocos. |
settlement | A transação que chegou ao seu endereço de recebimento, ou null até a liquidação. by é payment (liquidado pelo próprio pagamento), kokiwa (varrido pelo kokiwa) ou owner (recuperado com sua carteira, sem taxa). Depósitos varridos juntos compartilham o tx_hash. |
| status | Descrição |
|---|---|
confirmed | Confirmado na blockchain, aguardando varredura para seu endereço de recebimento. Você pode creditar o usuário. |
held | Confirmado na blockchain, ainda pequeno demais para varrer. Você pode creditar o usuário. |
settled | Chegou ao seu endereço de recebimento. |
Consultar um depósito
GET/v1/deposits/{id}Listar depósitos
GET/v1/depositsDo mais novo ao mais antigo.
| Parâmetro de consulta | Descrição |
|---|---|
customer | Apenas este usuário. |
tx_hash | Busca pelo hash da transação de pagamento ou de liquidação. |
limit | Tamanho da página, de 1 a 100. Padrão 20. |
starting_after | O id do último item da 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 }Redes e tokens
A kokiwa aceita as redes e moedas abaixo. Use a coluna chain em chains e options[].chain, e a coluna de moedas em currency.
chain | Blockchain | Moedas | Métodos de pagamento |
|---|---|---|---|
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 |
A testnet aceita apenas USDT. O token é tUSDT, mas currency continua sendo USDT.
Esta é a faixa completa de valores, não o que cada projeto pode aceitar. A configuração varia por lojista, então consulte o que está disponível no endpoint abaixo.
Consultar as redes e tokens do projeto
GET/v1/chainsRetorna o que o projeto da chave pode aceitar na rede atual.
{
"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 | Descrição |
|---|---|
currencies | Moedas que você pode enviar agora como currency. |
data[].chain | O valor para chain e options[].chain: bsc, ethereum, arbitrum, base, polygon, optimism, ton, solana. |
data[].active | Se a rede pode receber agora: endereço registrado, uma forma de recebimento ligada e um token selecionado. |
data[].tokens[].asset | A moeda do token. Tokens com o mesmo asset são equivalentes entre redes. |
data[].tokens[].accepted | Se o projeto selecionou este token. |
Clientes
Opcional. Um cliente é criado na primeira vez que um valor de customer aparece; você só precisa destes endpoints para filtrar por tag no painel.
Definir etiqueta e nota
PUT/v1/customers/{external_id}| Parâmetro | Descrição |
|---|---|
tags | Até 20 tags de 1 a 64 letras, dígitos ou _ - . :. |
metadata | Qualquer objeto JSON, até 50 chaves e 8KB. |
Consultar um cliente
GET/v1/customers/{external_id}Retorna as tags, as notas e deposit_addresses (endereços de depósito por rede).