Skip to main content

Visão geral

Cada ciclo de uma assinatura gera uma fatura. A fatura tem os próprios itens, descontos, pagamentos e status, e pode receber mais de uma tentativa de cobrança. Para listar as faturas de uma assinatura, use GET /v2/subscriptions/{id}/invoices.
As rotas de fatura só encontram faturas de assinaturas.

Status da fatura

Enquanto a fatura está em aberto ou recusada, o status reflete a cobrança mais recente. Uma fatura failed pode receber uma nova cobrança com Pagar fatura e passar a processing, requires_action ou paid.

Campos da fatura

A fatura informa o valor cobrado, em real. Cada fatura tem uma única exchange_rate: uma nova tentativa de cobrança reaproveita a cotação da primeira cobrança da fatura, em vez de converter de novo. O preço acordado, na moeda da assinatura, fica na assinatura.Os items e os descontos e acréscimos fixed também saem em real, convertidos pela mesma exchange_rate. O tipo percentage não é convertido, porque percentual não tem moeda. Em faturas em BRL nada é convertido.A soma que fecha ao centavo, em BRL e em moeda estrangeira, é a dos campos conciliados:Σ items[].amount_total − Σ discounts[].amount_applied + Σ increments[].amount_applied = amountSomar items[].amount × quantity (os valores unitários) não tem essa garantia: numa fatura em moeda estrangeira, o resultado pode divergir em centavos.
  • Desconto maior que os itens: o total dos descontos aplicados é limitado ao valor dos itens. Nesse caso, o amount_applied fica menor que o value declarado, e o limite é repartido entre os descontos na proporção do valor declarado de cada um.
  • Acréscimos não têm limite e podem superar o valor dos itens.

Ação pendente (next_action)

Uma fatura em requires_action nem sempre traz um next_action: quando o código de verificação já foi confirmado ou expirou, o campo vem null. Trate o nulo em vez de assumir que o objeto existe. Quando a análise de fraude pede verificação, nada é cobrado até a confirmação do código:
Quando a cobrança é PIX e ainda não foi paga:

Motivo da recusa (failure_reason)

Mostre ao pagador apenas o customer_message. O message é técnico e não deve ser exibido. Veja Pagamento recusado.

Exemplo de fatura paga

Resposta (HTTP 200)

Pagar uma fatura em aberto

Quando uma fatura é recusada, a assinatura fica past_due e recebe novas tentativas automáticas. Você também pode cobrar a fatura na hora, com outro cartão ou PIX:
Request — POST /v2/invoices/ord_7Hk2Pq9Xm4Ln8Rt3/pay
A resposta é 200 com a fatura atualizada (em geral processing para cartão ou requires_action para PIX), ou 402 quando a nova cobrança é recusada.
Só é possível pagar uma fatura pendente ou recusada de uma assinatura active, past_due ou suspended. Nos demais casos, a resposta é 422 (invoice_not_payable).
O PayPal processa apenas cobranças em BRL. Uma fatura de assinatura com currency diferente de BRL cobrada pelo PayPal é recusada, mesmo com a conversão para real: a resposta é 402 com failure_reason, como qualquer recusa de pagamento, e não um erro de requisição.

Código de verificação

  1. A fatura fica requires_action com next_action.type = "otp_confirmation".
  2. O comprador recebe o código.
  3. Você envia o código em POST /v2/invoices/{id}/confirm: { "code": "123456" }.
  4. A cobrança é retomada e a fatura passa a processing (ou 402 se for recusada).
O reenvio do código (POST /v2/invoices/{id}/confirm/resend) aceita 5 requisições por minuto por IP de origem. Se a sua plataforma atende várias contas a partir do mesmo servidor, todas dividem esse limite. O 429 desse limite vem fora do envelope de erro da v2.

Webhooks

Faturas de assinaturas criadas pela v2 enviam eventos no formato v2, com a fatura em data: Veja Eventos de fatura.
Uma fatura paga gera invoice.paid, e não charge.paid. O estorno de uma fatura é notificado por eventos de cobrança (charge.refunded ou charge.partial_refunded).

Erros específicos

Veja o catálogo completo em Erros.