Skip to main content
Cria um novo refund para devolver parte ou todo o valor capturado de uma charge. Envie exatamente um destes campos:
  • payment_intent: a Chargefy localiza a charge capturada correspondente;
  • charge: você escolhe diretamente qual tentativa deve ser reembolsada.
Sem amount, o endpoint devolve todo o valor ainda disponível. Com amount, cria um refund parcial nesse valor, em centavos.
O refund não muda o Payment Intent de succeeded para outro status. Ele cria um objeto com ciclo próprio. Quando a devolução termina em succeeded, o extrato recebe uma nova transaction negativa.

Pré-requisitos

A charge resolvida precisa:
  • ter status: "succeeded";
  • estar paga e capturada;
  • ter amount_captured > 0;
  • ainda ter valor disponível para devolver;
  • não ter outra devolução em andamento.

Uma devolução em andamento por vez

Cada charge aceita apenas um refund não concluído por vez. Enquanto existir um refund em pending ou requires_action para aquela charge, uma nova criação responde 409 com code: "refund_in_progress". Isso garante que a confirmação da devolução seja atribuída à tentativa certa: com duas devoluções parciais abertas ao mesmo tempo, a confirmação que chega depois seria indistinguível entre elas. Assim que a tentativa atual termina em succeeded, failed ou canceled, a charge volta a aceitar um novo refund parcial sobre o saldo restante. Para localizar a devolução em andamento, liste os refunds da charge:
Um Payment Intent em requires_capture só foi autorizado. Cancele-o com POST /v1/payment-intents/{id}/cancel em vez de criar um refund.
integer
Valor a devolver, em centavos. Precisa ser um inteiro positivo e não pode superar o valor disponível da charge.Quando omitido, devolve todo o saldo disponível:
string
ID da charge que será reembolsada (ch_*). Envie charge ou payment_intent, nunca os dois.
object
Pares chave-valor livres para correlacionar o refund com o seu sistema. Padrão: {}.
string
ID do Payment Intent (pi_*). A Chargefy localiza a charge capturada mais recente que ainda pode ser reembolsada.Envie payment_intent ou charge, nunca os dois.
string
Motivo da devolução. Padrão: null.Disputa de cartão é um fluxo separado e não é um motivo de refund.

O que acontece depois da chamada

As taxas da venda original não são devolvidas. Por isso a transaction do refund tem fee_amount: 0, enquanto o custo já registrado na transaction original permanece no extrato.

Formas de criar

Use uma Idempotency-Key única por devolução lógica. Se a resposta não chegar, consulte o refund associado antes de qualquer nova operação. A chave e o limite de uma devolução em andamento resolvem problemas diferentes, e os dois continuam valendo: Nunca use outra chave para contornar um estado pending: isso não acelera a confirmação e a criação será recusada.

(a) Refund total pelo Payment Intent

Use quando o seu sistema acompanha o pagamento pelo pi_*. A Chargefy encontra a charge capturada, e a ausência de amount devolve todo o saldo disponível.

(b) Refund parcial pelo Payment Intent

Envie amount quando apenas parte do valor deve voltar ao comprador.

(c) Refund total por uma charge específica

Use charge quando você precisa escolher a tentativa exata, por exemplo ao conciliar uma cobrança duplicada.

(d) Refund parcial por uma charge específica

Esta forma combina a escolha da tentativa com um valor parcial. metadata pode guardar a referência livre do seu pedido ou atendimento.

Resposta

Retorna 200 OK com o objeto refund completo. Quando o processamento recebeu a tentativa mas ainda precisa confirmar ou repetir internamente o resultado, retorna 202 Accepted com o mesmo objeto em status: "pending". O status pode ser provisório: refund.created confirma que o objeto foi criado, mas somente status: "succeeded" confirma que a devolução terminou. Em status: "succeeded", o campo balance_transaction já vem preenchido com o movimento negativo do extrato. Um refund concluído nunca é retornado sem esse vínculo. Neste exemplo, a devolução ainda está sendo processada:

Erros comuns

Acompanhar a conclusão

Persista o refund.id e trate os eventos:
  • refund.created para registrar o estado inicial;
  • refund.updated para acompanhar mudanças, inclusive pendingsucceeded;
  • refund.failed para tratar uma falha;
  • charge.refunded para reconciliar a charge;
  • transaction.created para registrar o movimento negativo do extrato.
Também é possível consultar GET /v1/refunds/{id}. Para a integração normal, prefira webhooks a polling. Veja Objeto refund para o significado de cada campo e Reembolsos para o modelo conceitual completo.