Menu da documentação
Guias
PIX com pagamento de conta
Referência: referência da API.
Quando o PIX é confirmado, o Pagaki paga um boleto ou uma guia com o saldo da mesma conta do gateway (no MVP, o Asaas). Serve, por exemplo, para o contribuinte pagar a guia do IPTU por PIX. Você não calcula tarifa de gateway: manda a conta e a sua taxa, e o Pagaki calcula quanto cobrar.
Como funciona
- Você informa a conta (
pay_bill) e, se quiser, a sua taxa (service_fee). Para mostrar o valor antes, chamePOST /v1/payments/quote. - O Pagaki confere a linha digitável, escolhe o gateway, simula a conta nele e calcula o valor. O pagamento de conta nasce em
waiting_payment. - O pagador paga o PIX (
payment.paid). - O Pagaki confere o saldo, simula de novo, confere o valor e só então paga (
bill_payment.processing). Sem saldo disponível, espera emwaiting_funds. - Sai
bill_payment.paid, oubill_payment.failedcom o motivo. Falha fica esperando a sua decisão.
A composição do valor
O Pagaki calcula o valor e devolve a composição em amount_breakdown, que você só lê.
type |
O que é | De onde vem |
|---|---|---|
bill |
O valor que vai pagar a conta | Simulação no gateway |
pix_in_fee |
A tarifa do gateway para receber | Tarifa da conta no gateway; se ele não informar, a cadastrada na instalação |
bill_payment_fee |
A tarifa do gateway para pagar a conta | Simulação no gateway |
service_fee |
A sua taxa | O service_fee enviado, mais o que amount trouxer a mais |
Exemplo: guia de R$ 120,00, tarifa fixa de R$ 1,99 para receber o PIX, sem tarifa para pagar a conta, e taxa de R$ 2,00. O PIX sai por R$ 123,99.
| Item | Centavos |
|---|---|
bill |
12000 |
pix_in_fee |
199 |
service_fee |
200 |
amount |
12399 |
Tarifa percentual incide sobre o total, então o Pagaki calcula "por dentro": o total é o menor valor que, tirada a tarifa, deixa a conta e a sua taxa inteiras. Item zerado não aparece.
Criar
curl -s https://api.sandbox.pagaki.com.br/v1/payments \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-H "Idempotency-Key: 0b7e5c1a-3d2f-4a6b-9c8d-7e6f5a4b3c2d" \
-d '{
"method": "pix",
"description": "IPTU 2026, parcela 1",
"external_id": "guia-778899",
"payer": { "name": "Fulano de Tal", "document": "12345678909" },
"service_fee": 200,
"pay_bill": {
"identification_field": "818000000012200001232021611280000000000007789009",
"due_date": "2026-11-28",
"description": "IPTU 2026, parcela 1"
}
}'
$response = $http->post('/v1/payments', [
'headers' => ['Authorization' => "Bearer {$token}", 'Idempotency-Key' => $idempotencyKey],
'json' => [
'method' => 'pix',
'external_id' => 'guia-778899',
'payer' => ['name' => 'Fulano de Tal', 'document' => '12345678909'],
'service_fee' => 200,
'pay_bill' => [
'identification_field' => '818000000012200001232021611280000000000007789009',
'due_date' => '2026-11-28',
],
],
'http_errors' => false,
]);
const response = await fetch(`${BASE}/v1/payments`, {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json', 'Idempotency-Key': idempotencyKey },
body: JSON.stringify({
method: 'pix',
external_id: 'guia-778899',
payer: { name: 'Fulano de Tal', document: '12345678909' },
service_fee: 200,
pay_bill: { identification_field: '818000000012200001232021611280000000000007789009', due_date: '2026-11-28' },
}),
});
Quer mostrar o valor antes? Mande o mesmo corpo para POST /v1/payments/quote: nada é criado, e a resposta traz amount, gateway e amount_breakdown. Para criar com o mesmo valor, envie gateway e amount da cotação.
Prefere fixar o valor? Envie amount: o Pagaki confere que cobre tudo, e o que sobrar entra como service_fee. pay_bill.amount é opcional, só para conferir o valor da conta.
| Recusa na criação | Por quê |
|---|---|
422 amount_mismatch |
pay_bill.amount diferente do valor lido no gateway |
422 amount_insufficient |
amount não cobre a conta, as tarifas e a taxa |
422 fees_not_configured |
Tarifa desconhecida: o gateway não informou e a instalação não tem cadastro |
422 invalid_identification_field |
Linha digitável com formato ou dígito verificador errado |
422 bill_overdue |
due_date no passado |
422 bill_payment_not_supported |
Nenhuma instalação ativa paga contas, ou o gateway forçado não paga |
O objeto payment volta com amount_breakdown e bill_payment (em waiting_payment).
Situações do pagamento de conta
| Situação | O que significa | O que você faz |
|---|---|---|
waiting_payment |
O PIX ainda não foi pago | Nada. Se o PIX expirar, for cancelado ou falhar, vira canceled |
waiting_funds |
O PIX foi pago, mas o saldo ainda não está disponível na conta do gateway | Nada. O Pagaki consulta a cada 15 min e envia assim que houver. Sem saldo na janela (padrão 24 h), vira failed com failure.code = insufficient_balance |
processing |
Enviado ao gateway | Espere paid ou failed |
unconfirmed |
O envio ficou sem resposta conclusiva | Não reenvie. O Pagaki descobre sozinho se foi pago. Sem prova em 30 min, vira failed com failure.code = unconfirmed |
paid |
Conta paga | Dê baixa na guia |
failed |
O gateway não pagou | Decida: tentar de novo ou cancelar (abaixo) |
canceled |
Você desistiu, ou o PIX não foi pago | Nada |
O bill_payment.processing traz o objeto completo; cada mudança sai como evento bill_payment.<situação>.
Decidir em failed
Nada é tentado de novo nem devolvido sozinho. O PIX continua paid, e o dinheiro fica na sua conta no gateway até você decidir.
failure.code |
Causa | Decisão típica |
|---|---|---|
amount_mismatch |
A simulação do gateway deu um valor diferente de pay_bill.amount (juros, multa, desconto) |
Confira a guia; reemita ou chame retry com o valor certo (até o valor da conta que o PIX cobriu) |
insufficient_balance |
O saldo não ficou disponível dentro da janela de espera | Regularize o saldo e chame retry |
bill_rejected |
O gateway recusou a simulação ou a criação; failure.message traz o texto dele (conta já paga, fora do horário limite, Pague Contas não habilitado…) |
Leia a mensagem. Conta já paga não é tratada como paga: confira antes de decidir |
bill_failed |
O gateway criou o pagamento e não pagou; failure.message traz os motivos dele |
Leia a mensagem; se a guia venceu, reemita e chame retry com a linha nova |
bill_canceled |
Alguém cancelou o pagamento direto no gateway | retry ou cancel |
bill_refunded |
O gateway estornou depois de pago; o valor voltou ao saldo | Fale com o suporte do gateway antes do retry |
unconfirmed |
O Pagaki não conseguiu provar se o envio chegou | retry procura a tentativa anterior no gateway antes de enviar: se ela pagou ou está em curso, não reenvia |
Tentar de novo (pode trocar o boleto):
curl -s https://api.sandbox.pagaki.com.br/v1/bill_payments/bpay_01jbz4a1b2c3d4e5f6g7h8j9k0/retry \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-H "Idempotency-Key: 4c3b2a19-0f8e-4d7c-b6a5-948372615f0e" \
-d '{ "identification_field": "818300000018200001232021611280000000000007788991", "amount": 12000, "due_date": "2026-12-05" }'
$http->post('/v1/bill_payments/bpay_01jbz4a1b2c3d4e5f6g7h8j9k0/retry', [
'headers' => ['Authorization' => "Bearer {$token}", 'Idempotency-Key' => $retryKey],
'json' => ['identification_field' => '818300000018200001232021611280000000000007788991', 'amount' => 12000, 'due_date' => '2026-12-05'],
]);
await fetch(`${BASE}/v1/bill_payments/bpay_01jbz4a1b2c3d4e5f6g7h8j9k0/retry`, {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json', 'Idempotency-Key': retryKey },
body: JSON.stringify({ identification_field: '818300000018200001232021611280000000000007788991', amount: 12000, due_date: '2026-12-05' }),
});
Sem corpo, tenta o mesmo boleto. O novo amount não pode passar do valor da conta que o PIX cobriu. Cada tentativa é um pagamento novo no gateway e aparece em attempts[].
Cancelar (o dinheiro fica na sua conta no gateway; o PIX não é devolvido):
curl -s -X POST https://api.sandbox.pagaki.com.br/v1/bill_payments/bpay_01jbz4a1b2c3d4e5f6g7h8j9k0/cancel \
-H "Authorization: Bearer $TOKEN" -H "Idempotency-Key: 9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d"
retry só em failed; cancel em waiting_payment ou failed. Fora disso: 409 invalid_state. Os dois exigem Idempotency-Key, uma por decisão.
Regras que não mudam
- Mesma conta, sem fallback. O boleto sai da mesma instalação que recebeu o PIX.
- Nunca paga duas vezes. Resposta inconclusiva nunca é reenviada sozinha.
- O que sobra fica com você. Depois de pagar a conta, as tarifas e a sua taxa ficam na sua conta no gateway.
- No sandbox do Asaas nada compensa: todo pagamento de conta termina em
failed. Ver ambientes. - Em aberto com o Asaas: se a mesma linha digitável pode ser paga de novo depois de uma falha (asaas.md §10). O
retrytenta; se o Asaas recusar, virafailedcombill_rejected.