Faturas
Crie, liste, consulte e anule faturas; todos os campos; cotações; e como o hosted checkout lida com a escolha de rede, o status ao vivo e o retorno ao seu site.
Última atualização 27 de out. de 2026
Uma fatura pede a um comprador um valor em USD, pago em USDT ou USDC em uma rede. Cada fatura recebe o seu próprio endereço de depósito, então um pagamento é associado à sua fatura pelo endereço para o qual foi enviado.
Criar uma fatura
POST /api/v1/crypto/invoices — permissão crypto-invoices:create, header Idempotency-Key obrigatório (veja Idempotência).
Há duas formas de criar uma:
- Rede e token fixos. Envie
networketoken. A fatura ficaPENDINGimediatamente e a resposta trazdeposit_address,totalepayment_uri. - O comprador escolhe. Omita os dois. A fatura assume o ambiente da sua API key; com uma key legada, envie
modepara escolhê-lo: Sandbox (mode: "test"na API) ou Live ("live"). A fatura ficaAWAITING_SELECTION; o comprador escolhe uma rede e um token no hosted checkout, que atribui o endereço nesse momento.
As menores requisições válidas:
{ "amount": "49.00", "title": "Pro plan, 1 month", "network": "POLYGON_AMOY", "token": "USDC" }{ "amount": "49.00", "title": "Pro plan, 1 month", "mode": "test" }Uma requisição completa, com um vendedor, a participação de um parceiro e um markup:
curl -X POST https://api.aliquot.cc/api/v1/crypto/invoices \
-H "Authorization: Bearer $ALIQUOT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-77310" \
-d '{
"amount": "100.00",
"network": "POLYGON_AMOY",
"token": "USDC",
"fee_payer": "CUSTOMER",
"markup_percent": 2,
"merchant": "halden_type",
"splits": [{ "account": "kerning_weekly", "percent": 10 }],
"title": "Halden Grotesk — Desktop license",
"merchant_order_id": "order-77310",
"buyer_email": "[email protected]",
"redirect_url": "https://shop.example.com/orders/77310",
"metadata": { "cart_id": "c_5521" }
}'Campos da requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
amount | string | Sim | Preço em USD, no máximo duas casas decimais. Mínimo "1.00". |
title | string | Sim | O que está sendo pago, 1–200 caracteres. Exibido no checkout. |
currency | string | Não | Apenas "USD", o padrão. |
network | string | Com token | Uma de POLYGON_MAINNET, POLYGON_AMOY, BSC_MAINNET, BSC_TESTNET, BASE_MAINNET, BASE_SEPOLIA. Envie junto com token, ou omita os dois. |
token | string | Com network | USDT ou USDC, disponível nessa rede (veja Redes e tokens). |
mode | string | Com uma key legada, quando não há network | "test" (Sandbox) ou "live". Se você também enviar network, os dois precisam coincidir. Uma key do Sandbox ou do Live preenche o próprio modo e responde 403 API_KEY_ENVIRONMENT_MISMATCH para o outro. |
fee_payer | string | Não | CUSTOMER (padrão): o comprador paga a taxa de processamento e o markup além de amount. MERCHANT: o comprador paga amount e os dois saem da parte do vendedor. |
markup_percent | number | Não | A parte da sua plataforma, 0–20, no máximo duas casas decimais. Padrão 0. |
merchant | string | Não | Referência da conta MERCHANT que vende. Se omitido, a sua conta platform é a vendedora. Uma conta PARTNER não pode ser o vendedor. |
splits | array | Não | Até 20 entradas { "account": "<reference>", "percent": <number> }. Cada porcentagem é maior que 0, com no máximo duas casas decimais; somadas, no máximo 100. Nenhuma conta repetida. |
description | string | Não | Até 2000 caracteres. |
merchant_order_id | string | Não | O ID do seu pedido, 1–200 caracteres. Pesquisável com q e incluído nos webhooks invoice.created e refund.claimable. |
redirect_url | string | Não | Para onde o checkout envia o comprador depois do pagamento. Veja Retorno ao seu site. |
metadata | object | Não | Qualquer objeto JSON. Armazenado e devolvido como está. |
buyer_email | string | Não | Se definido, o comprador recebe os links de resgate de reembolso por e-mail. Nunca é exibido no checkout. |
expires_in_minutes | integer | Não | Janela de pagamento, 1–1440. Padrão 30. Contada a partir da criação se você enviar network e token; caso contrário, a partir do momento em que o comprador escolhe um par. Veja Janela de pagamento. |
Como fee_payer, markup_percent e splits se transformam em valores é explicado, com um exemplo calculado, em Ledger e splits. As contas indicadas em merchant e splits precisam existir; uma referência desconhecida resulta em 422 nesse campo.
O objeto fatura
201 Created devolve a fatura. Um replay da mesma Idempotency-Key a devolve com 200.
| Campo | Descrição |
|---|---|
id | inv_…. |
status | Veja Status. |
livemode | false no Sandbox, true no Live. |
currency | "USD". |
fee_payer | CUSTOMER ou MERCHANT. |
network, token, decimals | O par de pagamento e os decimais do token. null enquanto AWAITING_SELECTION. |
base | O preço em unidades do token depois que um par é escolhido; antes disso, o preço em USD. |
platform_fee, markup, merchant_net, total | O detalhamento das taxas em unidades do token. total é o que o comprador precisa enviar. null enquanto AWAITING_SELECTION. |
received | Soma das transferências no token da fatura vistas até agora. |
deposit_address | O endereço para o qual o comprador paga. null enquanto AWAITING_SELECTION. |
payment_uri | Uma URI EIP-681 para wallets e QR codes, que pede exatamente total do token. |
required_confirmations | O limiar de confirmações que se aplica a esta fatura. Veja Confirmações. |
expires_at | Fim da janela de pagamento. |
merchant | { "reference", "name" } do vendedor. |
splits | [{ "account", "name", "percent", "amount" }]; amount é null até que um par seja escolhido. |
title, description, merchant_order_id, redirect_url, metadata, buyer_email | Como enviados. |
payment_link_id | O payment link que criou a fatura (plink_…), ou null para uma fatura criada com este endpoint. |
pay_url | O hosted checkout: https://aliquot.cc/pay/{id}. |
created_at, detected_at, paid_at, cancelled_at | Timestamps; null até que aconteçam. |
Status
| Status | Significado | Webhook ao entrar |
|---|---|---|
AWAITING_SELECTION | Aguardando o comprador escolher uma rede e um token. | invoice.created (na criação) |
PENDING | Endereço atribuído, aguardando uma transferência. | invoice.created (na criação) |
DETECTED | Uma transferência foi vista e está sendo confirmada. Não expira. | invoice.detected |
PAID | Confirmada, e o valor cobre o total. | invoice.paid |
OVERPAID | Confirmada com mais do que o total; o excedente é reembolsável. | invoice.paid e invoice.overpaid |
UNDERPAID | Confirmada, mas abaixo do total. O comprador pode enviar o restante antes de expires_at. | invoice.underpaid |
EXPIRED | A janela terminou sem nada recebido. | invoice.expired |
EXPIRED_UNDERPAID | A janela terminou com um pagamento parcial, retido para o comprador como um reembolso. | invoice.expired (e refund.claimable) |
REFUNDED | O pagamento parcial foi devolvido ao comprador. | refund.completed |
CANCELLED | Você a anulou. | Nenhum |
O diagrama completo do ciclo de vida está na Visão geral.
Consultar uma fatura
GET /api/v1/crypto/invoices/{id} — permissão crypto-invoices:read.
Devolve o objeto fatura, mais:
| Campo | Descrição |
|---|---|
idempotency_key | A Idempotency-Key com que ela foi criada (null para faturas iniciadas a partir de um payment link). |
transfers | [{ "tx_hash", "token", "amount", "confirmations", "required", "status", "block_number" }]. status é SEEN (confirmando), CONFIRMED ou ORPHANED (seu bloco foi substituído por um reorg). token difere do da fatura em um pagamento com o token errado. |
ledger | Uma vez PAID ou OVERPAID: o lançamento de liquidação, { "id", "entries": [{ "side", "account", "amount" }] }. Veja Ledger e splits. |
refunds | Reembolsos retidos para o comprador desta fatura, com claim_url enquanto resgatáveis. Veja Reembolsos. |
Listar faturas
GET /api/v1/crypto/invoices — permissão crypto-invoices:read.
| Parâmetro de query | Descrição |
|---|---|
mode | test ou live. O padrão é o ambiente da sua key (live com uma key legada). |
status | Um status da tabela acima. |
q | Busca por ID da fatura, endereço de depósito, hash da transação ou merchant_order_id. |
cursor, limit | Paginação; limit 1–100, padrão 25. |
curl "https://api.aliquot.cc/api/v1/crypto/invoices?mode=test&q=order-77310" \
-H "Authorization: Bearer $ALIQUOT_API_KEY"A resposta é { "items": [...], "next_cursor": "..." }, das mais recentes para as mais antigas.
Anular uma fatura
POST /api/v1/crypto/invoices/{id}/void — permissão crypto-invoices:update. Sem corpo.
Anular move uma fatura AWAITING_SELECTION ou PENDING para CANCELLED e a devolve. Qualquer outro status responde 409 CONFLICT: depois que um pagamento é detectado, a fatura não pode mais ser anulada. A anulação não envia webhook.
Se o comprador pagar uma fatura cancelada mesmo assim, o dinheiro não é creditado ao vendedor; ele fica retido para o comprador como um reembolso LATE_PAYMENT.
Cotação
POST /api/v1/crypto/quote — permissão crypto-invoices:read. Calcula o mesmo detalhamento que uma fatura teria, sem criar nada.
{
"amount": "100.00",
"network": "POLYGON_AMOY",
"token": "USDC",
"fee_payer": "CUSTOMER",
"markup_percent": 2,
"merchant": "halden_type",
"splits": [{ "account": "kerning_weekly", "percent": 10 }]
}network e token são obrigatórios; fee_payer, markup_percent, merchant e splits são opcionais e têm os mesmos padrões de uma fatura. A resposta:
{
"network": "POLYGON_AMOY",
"token": "USDC",
"decimals": 6,
"fee_payer": "CUSTOMER",
"base": "100.00",
"platform_fee": "0.50",
"markup": "2.00",
"merchant_net": "90.00",
"total": "102.50",
"splits": [{ "account": "kerning_weekly", "percent": 10, "amount": "10.00" }]
}O hosted checkout
Envie o comprador para pay_url (https://aliquot.cc/pay/{id}). A página não precisa de mais nada da sua parte.
- Escolha da rede. Em uma fatura
AWAITING_SELECTION, o comprador primeiro escolhe um dos pares de rede e token disponíveis no ambiente da fatura. A escolha atribui o endereço de depósito, calculatotalpara esse token e reinicia a janela de pagamento: o comprador tem oexpires_in_minutesinteiro a partir desse momento. Um par não pode ser trocado depois de escolhido. - Pagamento. O comprador vê o valor exato, o endereço e um QR code (a
payment_uriEIP-681), e pode pagar com uma wallet do navegador em um único botão, que antes troca a wallet para a rede certa. - Status ao vivo. A página acompanha a fatura enquanto ela passa por
DETECTED, com uma contagem de confirmações, atéPAID, e então mostra um comprovante, com a entrega do payment link quando houver. Se o comprador pagar a menos, a página pede o restante; se a fatura expirar ou um reembolso ficar retido, a página informa isso.
O checkout é construído sobre endpoints públicos que você também pode chamar para montar a sua própria página de pagamento:
| Endpoint | Descrição |
|---|---|
GET /api/v1/public/pay/{id} | A visão da fatura segura para o comprador: valores, endereço, confirmations, allowed_pairs, status do reembolso e fulfillment (null até a fatura ser paga; veja Payment links). Sem dados do ledger, sem IDs internos. |
POST /api/v1/public/pay/{id}/select | Corpo { "network", "token" }. Escolhe o par de uma fatura AWAITING_SELECTION. 409 se um par diferente já foi escolhido ou se a fatura expirou. |
GET /api/v1/public/pay/{id}/stream | Server-sent events. Um evento invoice traz a mesma visão de GET /api/v1/public/pay/{id} a cada mudança. O stream é fechado quando a fatura chega a PAID, OVERPAID, EXPIRED, EXPIRED_UNDERPAID, REFUNDED ou CANCELLED, e, nos demais casos, após 30 minutos; o EventSource se reconecta sozinho. |
const source = new EventSource('https://api.aliquot.cc/api/v1/public/pay/inv_01JB7Q8M3X4K9TPZ2R6WVN5HDC/stream');
source.addEventListener('invoice', (e) => {
const view = JSON.parse(e.data);
console.log(view.status, `${view.confirmations}/${view.required_confirmations}`);
});Qualquer pessoa com o ID da fatura pode abrir o checkout dela, então não trate o ID como um segredo, e nunca entregue um pedido com base no que um navegador informa. Entregue a partir do webhook invoice.paid ou de GET /api/v1/crypto/invoices/{id}.
Retorno ao seu site
Quando o checkout vê a fatura chegar a PAID enquanto o comprador está com ele aberto, ele faz uma contagem regressiva de cinco segundos e navega para redirect_url; o comprador pode optar por ficar. Um comprador que abre a página depois recebe um link de volta, e o mesmo acontece quando o comprovante mostra a entrega de um payment link, para que o comprador não a perca. O Aliquot não acrescenta nada à URL, então coloque em redirect_url tudo o que você precisa para encontrar o pedido, por exemplo https://shop.example.com/orders/77310.
Chegar a redirect_url não prova o pagamento. Verifique o status da fatura no seu servidor.
Janela de pagamento
expires_in_minutes (padrão 30) é a janela de pagamento: quanto tempo o comprador tem para enviar o dinheiro depois que existe um endereço de depósito.
- Rede e token enviados na criação. A janela começa na criação:
expires_até o momento da criação maisexpires_in_minutes. - O comprador escolhe a rede. Primeiro,
expires_atlimita a escolha: o comprador precisa escolher um par dentro deexpires_in_minutesa partir da criação, ou a fatura passa aEXPIRED. Ao escolher,expires_atpassa a ser o momento da escolha mais o mesmoexpires_in_minutes, então o comprador sempre tem a janela inteira para pagar, e o fluxo todo pode levar até o dobro deexpires_in_minutes.
Faturas criadas a partir de um payment link usam da mesma forma a janela padrão da organização (30 minutos). Uma fatura que ainda está PENDING ou AWAITING_SELECTION em expires_at passa a EXPIRED; uma que está UNDERPAID passa a EXPIRED_UNDERPAID. Uma fatura DETECTED nunca expira, porque o comprador pagou a tempo.