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 network e token. A fatura fica PENDING imediatamente e a resposta traz deposit_address, total e payment_uri.
  • O comprador escolhe. Omita os dois. A fatura assume o ambiente da sua API key; com uma key legada, envie mode para escolhê-lo: Sandbox (mode: "test" na API) ou Live ("live"). A fatura fica AWAITING_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

CampoTipoObrigatórioDescrição
amountstringSimPreço em USD, no máximo duas casas decimais. Mínimo "1.00".
titlestringSimO que está sendo pago, 1–200 caracteres. Exibido no checkout.
currencystringNãoApenas "USD", o padrão.
networkstringCom tokenUma de POLYGON_MAINNET, POLYGON_AMOY, BSC_MAINNET, BSC_TESTNET, BASE_MAINNET, BASE_SEPOLIA. Envie junto com token, ou omita os dois.
tokenstringCom networkUSDT ou USDC, disponível nessa rede (veja Redes e tokens).
modestringCom 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_payerstringNãoCUSTOMER (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_percentnumberNãoA parte da sua plataforma, 0–20, no máximo duas casas decimais. Padrão 0.
merchantstringNãoReferência da conta MERCHANT que vende. Se omitido, a sua conta platform é a vendedora. Uma conta PARTNER não pode ser o vendedor.
splitsarrayNãoAté 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.
descriptionstringNãoAté 2000 caracteres.
merchant_order_idstringNãoO ID do seu pedido, 1–200 caracteres. Pesquisável com q e incluído nos webhooks invoice.created e refund.claimable.
redirect_urlstringNãoPara onde o checkout envia o comprador depois do pagamento. Veja Retorno ao seu site.
metadataobjectNãoQualquer objeto JSON. Armazenado e devolvido como está.
buyer_emailstringNãoSe definido, o comprador recebe os links de resgate de reembolso por e-mail. Nunca é exibido no checkout.
expires_in_minutesintegerNãoJanela 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.

CampoDescrição
idinv_….
statusVeja Status.
livemodefalse no Sandbox, true no Live.
currency"USD".
fee_payerCUSTOMER ou MERCHANT.
network, token, decimalsO par de pagamento e os decimais do token. null enquanto AWAITING_SELECTION.
baseO preço em unidades do token depois que um par é escolhido; antes disso, o preço em USD.
platform_fee, markup, merchant_net, totalO detalhamento das taxas em unidades do token. total é o que o comprador precisa enviar. null enquanto AWAITING_SELECTION.
receivedSoma das transferências no token da fatura vistas até agora.
deposit_addressO endereço para o qual o comprador paga. null enquanto AWAITING_SELECTION.
payment_uriUma URI EIP-681 para wallets e QR codes, que pede exatamente total do token.
required_confirmationsO limiar de confirmações que se aplica a esta fatura. Veja Confirmações.
expires_atFim 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_emailComo enviados.
payment_link_idO payment link que criou a fatura (plink_…), ou null para uma fatura criada com este endpoint.
pay_urlO hosted checkout: https://aliquot.cc/pay/{id}.
created_at, detected_at, paid_at, cancelled_atTimestamps; null até que aconteçam.

Status

StatusSignificadoWebhook ao entrar
AWAITING_SELECTIONAguardando o comprador escolher uma rede e um token.invoice.created (na criação)
PENDINGEndereço atribuído, aguardando uma transferência.invoice.created (na criação)
DETECTEDUma transferência foi vista e está sendo confirmada. Não expira.invoice.detected
PAIDConfirmada, e o valor cobre o total.invoice.paid
OVERPAIDConfirmada com mais do que o total; o excedente é reembolsável.invoice.paid e invoice.overpaid
UNDERPAIDConfirmada, mas abaixo do total. O comprador pode enviar o restante antes de expires_at.invoice.underpaid
EXPIREDA janela terminou sem nada recebido.invoice.expired
EXPIRED_UNDERPAIDA janela terminou com um pagamento parcial, retido para o comprador como um reembolso.invoice.expired (e refund.claimable)
REFUNDEDO pagamento parcial foi devolvido ao comprador.refund.completed
CANCELLEDVocê 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:

CampoDescrição
idempotency_keyA 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.
ledgerUma vez PAID ou OVERPAID: o lançamento de liquidação, { "id", "entries": [{ "side", "account", "amount" }] }. Veja Ledger e splits.
refundsReembolsos 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 queryDescrição
modetest ou live. O padrão é o ambiente da sua key (live com uma key legada).
statusUm status da tabela acima.
qBusca por ID da fatura, endereço de depósito, hash da transação ou merchant_order_id.
cursor, limitPaginaçã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, calcula total para esse token e reinicia a janela de pagamento: o comprador tem o expires_in_minutes inteiro 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_uri EIP-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:

EndpointDescriçã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}/selectCorpo { "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}/streamServer-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 mais expires_in_minutes.
  • O comprador escolhe a rede. Primeiro, expires_at limita a escolha: o comprador precisa escolher um par dentro de expires_in_minutes a partir da criação, ou a fatura passa a EXPIRED. Ao escolher, expires_at passa a ser o momento da escolha mais o mesmo expires_in_minutes, então o comprador sempre tem a janela inteira para pagar, e o fluxo todo pode levar até o dobro de expires_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.