Transações (CHARGE)
Webhook do domínio CHARGE: notificações por cobrança no formato v2, hoje cobrindo estornos — eventos, payload, casos de erro, ordem de entrega e ativação.
O domínio CHARGE do Webhook v2 notifica o ciclo de vida de estornos no nível da cobrança (charge), em 3 eventos: charge.refund.processing, charge.refund.succeeded e charge.refund.failed. Diferente do webhook de pedidos, ele cobre também estornos parciais que não zeram o saldo da cobrança.
Como ativar
No Dashboard do AppBarte, em Configurações → Integração → Web Hooks (a mesma tela de Configurando Webhooks):
Cadastre um novo webhook ou edite um existente;
Selecione a versão 2.0. Enquanto a versão for 1.0, a opção fica desabilitada;
Marque a caixa Transação.
Os três eventos vêm juntos, sem seleção individual por evento.
Os eventos
charge.refund.processing
Um pedido de estorno foi aceito e está em processamento. Emitido uma única vez por estorno, no momento da criação.
charge.refund.succeeded
Um estorno foi confirmado. Pode ocorrer de segundos a dias após o processing, dependendo do provedor e do método de pagamento.
charge.refund.failed
Um estorno não pôde ser concluído, por exemplo por rejeição do provedor.
Garantias do contrato:
Exatamente um
charge.refund.processingpor estorno. Reprocessamentos internos não geram novoprocessing;No máximo um evento terminal por estorno:
succeededoufailed, nunca ambos;Um pedido de estorno rejeitado na criação (validação síncrona da API) não gera evento, porque o estorno não chega a existir. Esses casos aparecem como erro na resposta da requisição, descritos em Erros da solicitação;
A mesma notificação pode ser reenviada (entrega at-least-once). Veja Entrega, reenvio e idempotência.
Quanto tempo até o evento terminal
Na maioria dos casos o estorno conclui em poucos segundos. Em cartão, quando a cobrança ainda não liquidou, o estorno é um cancelamento da autorização e não depende do prazo do adquirente. Em PIX, a devolução é enviada ao provedor assim que o pedido é aceito.
Quando o provedor não confirma de primeira, a Barte retenta com espaçamento crescente por até 48 horas. O desfecho depende do que o provedor responde:
Rejeição confirmada pelo provedor
charge.refund.failed, com o motivo em errorReason
Falha incerta, por exemplo indisponibilidade momentânea
Nenhum evento terminal ainda. O estorno permanece em PROCESSING até haver confirmação definitiva
O payload
Exemplo de um charge.refund.processing em uma cobrança de R$ 100,00 com R$ 30,00 e R$ 20,00 já confirmados e um terceiro estorno de R$ 50,00 recém-aceito:
Os três eventos usam a mesma estrutura. O que muda é o eventType e o estado refletido no eventData.
Dois detalhes de formato para acertar no parser:
Valores monetários são decimais em reais (
100.0), não centavos. A quantidade de casas decimais varia entre eventos, então leia o campo como número decimal de escala livre. Em linguagens com ponto flutuante, use um tipo decimal (BigDecimal,decimal.Decimal) para não perder centavos no arredondamento;Timestamps são ISO 8601 UTC com sufixo
Z. Use um parser ISO 8601. JápaidDateé data pura, sem hora.
Campos do envelope
version
string
Versão do formato do webhook. Valor fixo: "2.0".
domain
string
Domínio do evento. Valor fixo: "CHARGE".
eventId
string
Identificador único do evento. String opaca, não interprete o formato. Estável entre reenvios: a mesma notificação reentregue chega com o mesmo eventId.
eventDatetime
string (ISO 8601 UTC, sufixo Z)
Data e hora da transição de estado que originou o evento. É o campo de ordenação. Veja Ordem de entrega.
sellerId
integer
Identificador interno do vendedor.
metadata
array de { "key": string, "value": string }, ou null
Metadata do pedido ao qual a cobrança pertence. null quando a cobrança não tem pedido associado ou o pedido não tem metadata.
eventData
object
Snapshot da cobrança. Veja abaixo.
Campos do eventData
O eventData é a cobrança:
uuid
string (UUID)
Identificador da cobrança.
originalValue
number (decimal em reais)
Valor original da cobrança.
currentValue
number (decimal em reais)
Valor da cobrança que ainda pode ser estornado no momento do envio. Desconta os estornos confirmados e os em processamento. Nunca negativo: o valor tem piso em 0.
createdAt
string (ISO 8601 UTC, sufixo Z)
Data e hora de criação da cobrança.
paidDate
string (YYYY-MM-DD), ou null
Data do pagamento da cobrança, sem hora. null quando a cobrança não foi paga.
order
object
Pedido ao qual a cobrança pertence, no formato { "uuid": string }. O uuid pode ser null: cobranças de assinatura, por exemplo, não têm pedido associado.
refunds
array
Histórico completo de estornos da cobrança, em todos os status, inclusive falhas. Veja abaixo.
buyer
object
Comprador. Veja abaixo.
Status da cobrança
Nos eventos de estorno, os valores esperados de eventData.status são:
PAID
Cobrança paga e não totalmente estornada. Inclui o caso de estorno parcial já confirmado.
REFUND
Cobrança totalmente estornada.
O campo reflete o status real da cobrança, e o conjunto de status da cobrança é maior que esses dois. Trate valores fora dessa lista de forma genérica, sem quebrar o processamento.
Itens de refunds[]
uuid
string (UUID)
Identificador do estorno, o mesmo devolvido na criação. Use-o para reconciliar com o que você já registrou.
amount
number (decimal em reais)
Valor do estorno.
status
string
Status do estorno: PROCESSING, SUCCESS ou FAILED.
createdAt
string (ISO 8601 UTC, sufixo Z)
Data e hora de criação do estorno.
idempotencyKey
string (até 63 caracteres), ou null
Chave que você enviou no header x-idempotency-key ao criar o estorno, devolvida aqui para correlacionar o evento com a sua própria requisição. null em estornos que não foram criados pela API, como os feitos pelo painel.
errorReason
string, ou null
Motivo da falha, como código estável definido pela Barte. null sempre que o estorno não falhou. Veja Motivos de falha.
O array vem ordenado do estorno mais antigo para o mais recente (por createdAt) e contém todos os estornos da cobrança, incluindo os que falharam. Em um evento de estorno há sempre pelo menos um item.
Motivos de falha (errorReason)
Quando um estorno falha, errorReason traz um código estável definido pela Barte, nunca a mensagem crua do provedor de pagamento.
INSUFFICIENT_BALANCE
O saldo restante da cobrança não cobria o estorno solicitado no momento do processamento.
Conferir o saldo em currentValue antes de solicitar. Ocorre também quando dois estornos concorrentes disputam o mesmo saldo.
ISSUER_INSUFFICIENT_FUNDS
A rede ou o emissor recusou o estorno por insuficiência de fundos.
Não é resolvível pela sua integração. Encaminhe ao comprador ou fale com o suporte.
REJECTED_BY_PROVIDER_HTTP_<status>
O provedor rejeitou a solicitação, e o sufixo traz o status HTTP da rejeição (por exemplo REJECTED_BY_PROVIDER_HTTP_422).
Registrar o código recebido e acionar o suporte com o uuid do estorno.
REJECTED_BY_PROVIDER
O provedor reportou a falha sem um motivo mais específico.
Mesmo tratamento do anterior.
REFUND_NOT_DISPATCHED
O estorno não chegou a ser despachado ao provedor dentro da janela de retentativas.
Acionar o suporte com o uuid do estorno; um novo pedido pode ser necessário.
Exemplo de um charge.refund.failed: dois estornos de R$ 60,00 pedidos em concorrência na mesma cobrança de R$ 100,00, e o segundo não tinha saldo.
O estorno que falhou continua no array e deixa de consumir saldo: com um dos R$ 60,00 em processamento e o outro em falha, o currentValue volta a refletir apenas o estorno vivo.
buyer
uuid
string (UUID), ou null
Identificador do comprador.
string, ou null
E-mail do comprador.
Os dados do comprador são resolvidos por consulta ao cadastro do vendedor e são best-effort: se não houver cadastro correspondente, a notificação é enviada com os campos de buyer nulos em vez de ser retida.
Erros da solicitação
Nem toda falha de estorno vira evento. Quando a Barte recusa o pedido na criação, a rejeição volta na própria resposta da requisição e nenhum evento CHARGE é emitido, porque o estorno não chega a existir.
Saber disso muda o desenho da integração: esses casos precisam ser tratados no retorno da chamada, e ficar esperando um charge.refund.failed que nunca vem é um erro comum.
BAR-0500
Parâmetro inválido na requisição, por exemplo amount ausente, zero ou negativo, ou chave de idempotência vazia ou com mais de 63 caracteres.
BAR-0424
A cobrança não existe, ou não pertence à conta autenticada.
BAR-0450
O status atual da cobrança não permite estorno, por exemplo cancelada, em disputa ou em chargeback. Uma cobrança já totalmente estornada pode responder este código ou o BAR-0451.
BAR-0451
O valor solicitado é maior que o saldo restante da cobrança.
BAR-0452
O método de pagamento não suporta estorno, por exemplo boleto.
BAR-0434
Fora do prazo de estorno, ou a cobrança ainda não tem data de pagamento confirmada.
BAR-0460
O saldo da conta é insuficiente para cobrir o estorno.
BAR-0463
Estorno bloqueado por política, por exemplo risco, fraude ou suspensão administrativa.
BAR-0466
A chave de idempotência já está associada a um estorno de valor diferente naquela cobrança.
BAR-0467
Já existe uma requisição em andamento com a mesma chave de idempotência para aquela cobrança.
O formato do corpo de erro e os detalhes de cada resposta estão na Referência de API, em Estorno → Estornar Cobrança.
Entrega, reenvio e idempotência
A notificação é um HTTP POST na URL cadastrada. Seu endpoint deve responder 2xx em até 20 segundos. Fora disso, a entrega é considerada falha e será reenviada com o mesmo eventId.
Headers da requisição
authorization
string
Token de autenticação configurado no cadastro do webhook.
idempotency-key
string
Chave de idempotência. Para eventos CHARGE, é igual ao eventId e estável entre reenvios.
x-webhook-timestamp
integer
Unix epoch em segundos, no momento do envio.
x-webhook-nonce
string (32 caracteres hexadecimais)
Único por requisição.
Idempotência
A entrega é at-least-once: a mesma notificação pode chegar mais de uma vez. Use o eventId (ou o header idempotency-key, que carrega o mesmo valor) para deduplicar. Guarde os identificadores já processados e ignore repetições.
Ordem de entrega não é garantida
Eventos da mesma cobrança podem chegar fora de ordem. Um charge.refund.succeeded pode chegar antes do charge.refund.processing correspondente. Para consumir corretamente, aplique duas regras:
Ordene por
eventDatetime, que registra o instante da transição de estado. Descarte eventos comeventDatetimeanterior ao do último estado que você registrou para aquela cobrança (eventData.uuid);Status terminal vence.
SUCCESSeFAILEDsão estados finais de um estorno. Nunca sobrescreva o estado final de um estorno já registrado comPROCESSING, independentemente do timestamp do evento.
Verificação de autenticidade
Em produção, as notificações partem de um IP de saída fixo: 3.213.198.81. Restringir seu endpoint a esse endereço é a verificação de origem disponível hoje, e vale combinar com as validações abaixo.
Valide também toda notificação recebida antes de processá-la:
authorization: confira que o valor é exatamente o token configurado no cadastro do webhook. Rejeite requisições com token ausente ou diferente;x-webhook-timestamp: rejeite requisições com timestamp fora de uma janela de tolerância de 5 minutos;x-webhook-nonce: verifique a unicidade do nonce para bloquear replay de requisições.
Relação com o webhook de pedidos (ORDER)
O domínio ORDER continua funcionando como hoje: quando um estorno zera o saldo restante da cobrança, o pedido transiciona para REFUND e o evento order.refund dispara com o refunds[] do pedido.
A diferença está na cobertura: um estorno parcial que não zera o saldo não gera evento ORDER. A visibilidade em tempo real de parciais vem do domínio CHARGE.
Se você já consome ORDER, ativar o CHARGE não muda nada no que você recebe hoje. Os dois domínios convivem, e uma cobrança totalmente estornada pode gerar eventos nos dois.
Em caso de dúvidas, entre em contato com o nosso time através do suporte disponibilizado.
Last updated
Was this helpful?

