API de pagamentos v2
Crie um pagamento a partir do seu servidor, envie o cliente para a página de pagamento e marque o pedido como pago quando a Coino Live confirmar o pagamento na rede.
Início rápido
1. Crie uma chave de API para o seu gateway no painel, em Desenvolvedores. 2. Crie um pagamento com o valor do pedido. 3. Redirecione o cliente para o checkout_url retornado. 4. Quando o webhook chegar (ou o cliente voltar), consulte o pagamento novamente e envie o pedido quando o status for "paid".
curl https://coino.live/api/v2/payments \
-H "Authorization: Bearer ck_live_..." \
-H "Idempotency-Key: order-1001" \
-H "Content-Type: application/json" \
-d '{"amount": "25.00", "currency": "EUR", "order_id": "1001",
"success_url": "https://shop.example/thanks",
"notify_url": "https://shop.example/coino-webhook"}'
Autenticação
Envie sua chave secreta no cabeçalho Authorization de cada requisição. Cada chave pertence a um gateway e só vê os pagamentos desse gateway. Mantenha-a no seu servidor: nunca coloque uma chave em um navegador, app ou repositório público. Se uma chave vazar, revogue-a no painel e crie outra.
Authorization: Bearer ck_live_...
URL base: https://coino.live/api/v2
Todos os valores são strings decimais (nunca números), todos os horários são ISO 8601 em UTC e toda resposta é JSON com o resultado em "data".
Criar um pagamento
Os preços podem estar em USD ou em qualquer moeda listada por GET /currencies; outras moedas são convertidas para USD pela cotação atual quando o pagamento é criado. O cliente escolhe a criptomoeda e a rede na página de pagamento.
| Campo | Descrição |
|---|---|
amount | Obrigatório. Até 2 casas decimais, por exemplo "25.00". Aplica-se um mínimo de 1 USD (ou equivalente). |
currency | Código de três letras; USD se omitido. |
order_id | O número do seu pedido, até 128 caracteres. Exibido para você e pesquisável com GET /payments. |
description | Exibido ao cliente na página de pagamento, até 500 caracteres. |
customer_email | E-mail do cliente (opcional). |
success_url, cancel_url | Para onde a página de pagamento envia o cliente de volta. Voltar ao success_url não é prova de pagamento. |
notify_url | URL de webhook deste pagamento (somente https). Substitui a URL de webhook das configurações do gateway. |
metadata | Seus próprios dados chave/valor, até 20 chaves e 4 KB. Retornados sem alteração. |
asset | Código de criptomoeda opcional de GET /assets (por exemplo "usdt-tron") para pular a escolha da moeda. |
expires_in | Minutos que o cliente tem para pagar, de 15 a 10080. Padrão 1440 (um dia). |
Envie uma chave única por tentativa de pedido (até 128 letras, dígitos e -_:.). Repetir uma requisição com a mesma chave retorna o mesmo pagamento em vez de criar um segundo, então é seguro repetir após um timeout ou clique duplo. Use uma nova chave quando o valor mudar ou o último pagamento expirar.
A resposta (201 ao criar, 200 para uma chave repetida) é o objeto de pagamento abaixo.
O objeto de pagamento
{
"data": {
"id": "01m62ewd502p9774d6trd7rhr7",
"status": "paid",
"amount": "22.32",
"currency": "USD",
"requested_amount": "20.00",
"requested_currency": "EUR",
"exchange_rate_usd": "1.115926958947",
"received_usd": "22.32",
"remaining_usd": "0.00",
"order_id": "943",
"description": "Order #943",
"customer_email": "[email protected]",
"metadata": {"cart": "abc"},
"checkout_url": "https://coino.live/pay/01m62ewd502p9774d6trd7rhr7",
"success_url": "https://shop.example/thanks",
"cancel_url": "https://shop.example/cart",
"asset": null,
"quote": {
"asset": "usdc-ethereum", "symbol": "USDC", "network": "Ethereum",
"address": "0x8e2e…61bc", "amount": "22.330545",
"network_fee": "0.000001", "rate_usd": "0.9995", "expires_at": "…"
},
"deposits": [{
"asset": "usdc-ethereum", "symbol": "USDC", "network": "Ethereum",
"tx_hash": "0xf13d…1439", "explorer_url": "https://etherscan.io/tx/0xf13d…1439",
"amount": "22.330545", "network_fee": "0.000001",
"platform_fee": "0.223305", "net": "22.107239",
"usd_value": "22.32", "credited_at": "…"
}],
"expires_at": "…", "paid_at": "…", "created_at": "…"
}
}
amount e currency são o que o cliente paga em USD; requested_amount e requested_currency são o que você pediu. quote é a criptomoeda, o endereço e o valor exibidos agora ao cliente; deposits lista cada transação recebida, com a taxa cobrada e o que foi adicionado ao seu saldo (net).
| Status | Significado | O que fazer |
|---|---|---|
open | Aguardando o pagamento do cliente. | Nada ainda. |
confirming | Uma transação foi vista e aguarda confirmações da rede. | Mostre "pagamento recebido, confirmando". Não envie ainda. |
partially_paid | Chegou menos que o valor. A página de pagamento pede o restante (remaining_usd). | Aguarde; o cliente ainda pode enviar o restante. |
paid | Totalmente pago e confirmado. Final. | Marque o pedido como pago e envie. |
expired | O tempo acabou. Se received_usd for maior que zero, essa parte está no seu saldo. | Cancele o pedido ou acerte a parte paga com o cliente. |
cancelled | Cancelado por você antes de qualquer pagamento chegar. Final. | Nada. |
Um pagamento muito próximo do valor conta como pago, para que arredondamentos de carteiras não deixem pedidos em aberto.
Consultar e cancelar pagamentos
Consulte um pagamento novamente sempre que precisar do estado atual: após um webhook, quando o cliente voltar ou em uma tarefa agendada. IDs desconhecidos e pagamentos de outros gateways respondem 404.
GET · /payments?status=paid&order_id=1001&cursor=…Lista seus pagamentos, do mais recente, 50 por página. Os dois filtros são opcionais. meta.next_cursor e meta.prev_cursor navegam pelos resultados.
POST · /payments/{id}/cancelCancela um pagamento em aberto que não recebeu nada, por exemplo quando o cliente esvazia o carrinho. Pagamentos com depósito não podem ser cancelados (422).
Webhooks
A Coino Live envia um POST para notify_url (ou para a URL de webhook do gateway) sempre que um pagamento muda de status. Os webhooks só são enviados quando seu gateway tem um segredo de assinatura: crie-o nas configurações do gateway.
POST /coino-webhook
X-Coino-Event: payment.paid
X-Coino-Delivery: 01m62f23xhkz39ahqv4h64ttfk
X-Coino-Signature: t=1761696953,v1=5f2c…
{"id": "01m62f23xhkz39ahqv4h64ttfk", "event": "payment.paid",
"created_at": "…", "data": { …the payment object… }}
| Evento | Quando |
|---|---|
payment.confirming, payment.partially_paid, payment.paid, payment.expired, payment.cancelled | O pagamento chegou a esse status. |
custody.deposit.detected, custody.deposit.credited | O depósito de um usuário de custódia foi visto e depois creditado. |
withdrawal.<status> | Um saque via API mudou de status. |
Verifique a assinatura: calcule o HMAC-SHA256 de "<t>.<raw body>" com seu segredo de assinatura, compare com v1 em tempo constante e recuse carimbos de tempo com mais de cinco minutos.
// PHP
$header = $_SERVER['HTTP_X_COINO_SIGNATURE'] ?? '';
$body = file_get_contents('php://input');
parse_str(str_replace(',', '&', $header), $sig);
$ok = isset($sig['t'], $sig['v1'])
&& abs(time() - (int) $sig['t']) <= 300
&& hash_equals(hash_hmac('sha256', $sig['t'] . '.' . $body, $secret), $sig['v1']);
// Node.js
const [t, v1] = header.split(',').map(p => p.split('=')[1]);
const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
const ok = Math.abs(Date.now() / 1000 - t) <= 300
&& crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
# Python
t, v1 = (p.split('=', 1)[1] for p in header.split(','))
expected = hmac.new(secret.encode(), f'{t}.{raw_body}'.encode(), 'sha256').hexdigest()
ok = abs(time.time() - int(t)) <= 300 and hmac.compare_digest(expected, v1)
Antes de marcar um pedido como pago, consulte o pagamento com GET /payments/{id} e verifique status, valor e seu order_id. Responda com qualquer status 2xx em até 10 segundos. Entregas com falha são repetidas após 1, 5, 30, 120, 360, 720 e 1440 minutos; redirecionamentos não são seguidos. O mesmo evento pode chegar mais de uma vez, então trate-o de forma idempotente.
Moedas, criptomoedas e saldos
GET · /currenciesMoedas em que um pagamento pode ser precificado, cada uma com seu valor em USD: {"code": "EUR", "usd_per_unit": "1.09"}. Oculte o pagamento em cripto quando a moeda da sua loja não estiver na lista.
GET · /assetsCriptomoedas com que os clientes podem pagar agora: code (por exemplo "usdt-tron"), symbol, name, network, decimals e price_usd.
GET · /balancesO saldo da sua conta por criptomoeda, após as taxas: asset, symbol, network, balance e usd_value (null enquanto não houver cotação).
Contas de custódia
Para apps com contas de usuário: cada usuário recebe endereços de depósito permanentes, e os depósitos são creditados no saldo desse usuário no seu gateway.
| Requisição | Descrição |
|---|---|
POST /custody/users | Cria um usuário (external_id obrigatório; name, email e metadata opcionais). O mesmo external_id retorna o usuário existente. |
GET /custody/users?external_id=… | Lista usuários, 50 por página. |
GET /custody/users/{id} | Endereços (com as criptomoedas que cada um aceita) e saldos. |
GET /custody/users/{id}/deposits | Depósitos creditados, do mais recente, com next_cursor. |
POST /custody/users/{id}/transfers | Move o saldo de um utilizador num ativo para o seu saldo principal (todo, a menos que indique amount). Uma reference opcional torna o pedido seguro para repetir. |
Saques
Paga do seu saldo para um endereço: asset, amount e address são obrigatórios; custody_user debita o saldo de um utilizador de custódia; reference (única por gateway) torna o pedido seguro para repetir. Desativado por padrão: ative os levantamentos pela API nas definições do gateway, onde também define um limite diário em USD e os endereços IP dos servidores autorizados (os dois endpoints só respondem a esses IPs). Uma reference reutilizada para outro levantamento é recusada com 409. Levantamentos grandes podem aguardar revisão.
GET · /withdrawals/{id}Status: pending_review, approved, processing, broadcast, completed, rejected (veja error), cancelled ou failed. tx_hash é preenchido após o envio.
Erros e limites
| HTTP | Significado |
|---|---|
| 401 | Chave ausente, errada ou revogada, ou o gateway está suspenso. |
| 404 | Não encontrado (ou pertence a outro gateway). |
| 422 | A requisição foi recusada: "message" diz o motivo e "errors" indica os campos. |
| 429 | Requisições demais: 120 por minuto por chave. Aguarde e tente de novo. |
| 5xx | Problema temporário do nosso lado. Tente de novo com o mesmo Idempotency-Key. |
{"message": "The minimum payment is 1.00 USD."}
{"message": "amount must be a decimal string with at most 2 decimals, e.g. \"25.00\".",
"errors": {"amount": ["amount must be a decimal string with at most 2 decimals, e.g. \"25.00\"."]}}
Bibliotecas de código
Bibliotecas oficiais para esta API, sem dependências. Verificam as assinaturas dos webhooks, dão um erro claro para cada recusa e repetem erros de rede só quando repetir o pedido é seguro.
| Idioma | Versão | Requisitos | |
|---|---|---|---|
| PHP | 1.0.0 | PHP 8.1+ with cURL | Baixar |
| Node.js | 1.0.0 | Node.js 18+, TypeScript types included | Baixar |
| Python | 1.0.0 | Python 3.8+ | Baixar |
// PHP
$coino = new \CoinoLive\Client('ck_live_...');
$payment = $coino->payments->create(['amount' => '25.00', 'currency' => 'EUR', 'order_id' => '1001']);
// Node.js
const coino = new CoinoLive('ck_live_...');
const payment = await coino.payments.create({ amount: '25.00', currency: 'EUR', order_id: '1001' });
# Python
coino = coinolive.Client("ck_live_...")
payment = coino.payments.create(amount="25.00", currency="EUR", order_id="1001")
Cada download inclui um README com todas as chamadas, o tratamento de webhooks e as classes de erro.
Integrações com plataformas
Plugins prontos construídos sobre esta API. Instale um, cole uma chave de API e ative: os pedidos são atualizados automaticamente e cada plugin mostra seu saldo e seus pagamentos no próprio painel.
| Plataforma | Versão | Requisitos | |
|---|---|---|---|
| WooCommerce | 1.1.0 | WordPress 6.2+, WooCommerce 7.6+, PHP 7.4+ | Baixar |
| WHMCS | 1.0.0 | WHMCS 8.0+, PHP 7.4+ | Baixar |
| OpenCart 4 | 1.0.0 | OpenCart 4.0.2+, PHP 8.0+ | Baixar |
| Shopware 6 | 1.0.0 | Shopware 6.6.5+ or 6.7, PHP 8.2+ | Baixar |
| PrestaShop | 1.0.0 | PrestaShop 8.0+ or 9, PHP 7.2+ | Baixar |
| Easy Digital Downloads | 1.0.0 | Easy Digital Downloads 3, WordPress 6.7+, PHP 8.0+ | Baixar |
| GiveWP | 1.0.0 | GiveWP 3+, WordPress 6.6+, PHP 7.4+ | Baixar |
Outras plataformas: use a API diretamente, como descrito acima.