Transações - Reembolsar
Visão Geral
Reembolsa uma transação previamente aprovada, com suporte a reembolso total ou parcial. É a ferramenta para devoluções, cancelamentos e correções de cobrança.
O reembolso é assíncrono: o endpoint aceita a solicitação (HTTP 202) e o estorno é processado em background. Acompanhe o resultado pelos webhooks (transaction.refunded, receivable.refunded) ou consultando a transação.
Precauções
- Só pode reembolsar transações no status
approvedoupre-authorized. - O valor do reembolso não pode exceder o valor da cobrança.
- Cada venda aceita um reembolso: depois dele, mesmo parcial, a transação passa a
refunded, e um novo pedido de reembolso responde422 transactionNotRefundable. - Há uma trava contra reembolsos concorrentes para a mesma transação.
- Plataformas de marketplace: o reembolso de uma venda feita com
onBehalfOfé pedido como a sub-conta, comX-Selectwin-Account: bus_…— veja Operar como a sub-conta. O estorno sai do saldo da sub-conta. - O reembolso afeta o saldo financeiro da conta.
- O ID da transação é sensível a maiúsculas e minúsculas (
tra_...outrx_...).
Casos de uso
- Cancelamento de compra após a aprovação.
- Produto indisponível/defeituoso — devolução.
- Cobrança incorreta — estorno por valor errado.
- Acordo comercial — reembolso parcial.
Requisição
POST /v1/transactions/{transactionId}/refundParâmetros de URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
transactionId | string | Sim | Identificador da transação a reembolsar |
Parâmetros do Corpo da Requisição
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
amount | integer | Não | Valor a reembolsar em centavos. Se omitido, reembolsa o valor total |
reason | string | Não | Motivo do reembolso (máx. 255 caracteres) |
Exemplo — Reembolso Total
{ "reason": "Cliente desistiu da compra e solicitou reembolso" }Exemplo — Reembolso Parcial
{
"amount": 5000,
"reason": "Cliente devolveu apenas um dos itens do pedido"
}Resposta
Aceito (HTTP 202 Accepted)
O reembolso foi aceito para processamento assíncrono.
{
"transactionId": "tra_987654321",
"status": "approved",
"accepted": true
}| Atributo | Tipo | Descrição |
|---|---|---|
transactionId | string | Identificador da transação |
status | string | Status no momento do aceite (a transição para refunded chega por webhook) |
accepted | boolean | Sempre true |
Erros
error.code | HTTP | Quando |
|---|---|---|
transactionNotRefundable | 422 | A transação não pode ser reembolsada no status atual |
refundAmountInvalid | 422 | Valor zero/negativo, ou acima do valor da cobrança |
refundInProgress | 409 | Já existe um reembolso em andamento para esta transação |
refundInsufficientBalance | 422 | O saldo disponível não cobre o estorno: o valor desta venda já foi liberado (e sacado). Só se aplica quando algum recebível da transação já está liberado; venda ainda em pending estorna normalmente |
transactionInPaymentGroup | 409 | A transação é uma parte de um pagamento combinado (2 cartões ou cartão + Pix) que ainda não terminou: enquanto o pagamento combinado está em andamento, ele mesmo cancela ou estorna as partes. Depois de pago, cada parte se estorna como qualquer transação. params[0] traz o paymentGroupId e o status |
refundSplitRecipientInsufficientBalance | 422 | Um recebedor da divisão (split) desta venda não tem saldo disponível para a parte dele neste estorno: a fatia dele já foi liberada e sacada. O estorno reserva o valor de cada recebedor no aceite, como faz com o do vendedor |
transactionNotFound | 404 | Transação inexistente |
Exemplo de erro (HTTP 409)
{
"error": {
"status": "Conflict",
"statusCode": 409,
"category": "client",
"code": "refundInProgress",
"message": "A refund for this transaction is already in progress.",
"resource": "transaction"
}
}Melhores Práticas
- Verifique o status antes de reembolsar.
- Reaja aos webhooks
transaction.refunded/receivable.refundedpara confirmar o estorno. - Registre o motivo (
reason) para auditoria. - Para cartão de crédito, lembre que o estorno pode levar de 7 a 30 dias para aparecer na fatura.
Atualizado em 17 de outubro de 2026