{
"id": "evt_01k2p7q9s1u3w5y7a9c1e3g5j7",
"type": "med.approved",
"created_at": "2026-09-19T10:41:08+00:00",
"data": {
"med": {
"object": "med",
"id": "med_01k2m4n5r3t7v9x1z3b5d7f9h1",
"status": "approved",
"reason": "Não reconheço esta compra no meu extrato.",
"held_amount": 10000,
"currency": "BRL",
"end_to_end_id": "E12345678202608041200",
"purchase_date": "2026-08-04",
"opened_by": "customer",
"claimant": {
"name": "Maria Souza"
},
"evidence": [
{
"id": 41,
"side": "claimant",
"filename": "extrato-do-banco.pdf",
"mime": "application/pdf",
"size": 184320,
"sent_at": "2026-09-16T13:22:40+00:00"
},
{
"id": 42,
"side": "seller",
"filename": "comprovante-de-entrega.png",
"mime": "image/png",
"size": 96144,
"sent_at": "2026-09-17T09:10:02+00:00"
}
],
"events": [
{
"type": "opened",
"at": "2026-09-16T13:22:40+00:00",
"held_cents": 10000,
"charge_code": "ch_01k1y6r6m6q2x0p3d9v4t7c8n2",
"evidence_count": 1
},
{
"type": "seller_defence",
"at": "2026-09-17T09:10:02+00:00",
"files": 1
},
{
"type": "approved",
"at": "2026-09-19T10:41:07+00:00",
"released_cents": 10000
}
],
"opened_at": "2026-09-16T13:22:40+00:00",
"defence_deadline": "2026-09-23T13:22:40+00:00",
"responded_at": "2026-09-17T09:10:02+00:00",
"decided_at": "2026-09-19T10:41:07+00:00",
"decision_note": "Evidências não comprovam a entrega ao titular do Pix.",
"resolved_by": "platform",
"refund": {
"object": "refund",
"id": "re_01k2p7q8r0t2v4x6z8b0d2f4h6",
"status": "refunded"
}
},
"charge": {
"object": "charge",
"id": "ch_01k1y6r6m6q2x0p3d9v4t7c8n2",
"status": "refunded",
"payment_method": "pix",
"amount": 10000,
"currency": "BRL",
"platform_fee": 798,
"net_amount": 9103,
"refunded_amount": 10000,
"description": "Curso de Vue 3",
"reference": "pedido-1042",
"metadata": {
"carrinho": "cart_88f21"
},
"customer": {
"name": "João Comprador",
"email": "joao@exemplo.com.br",
"document": "111.***.***-35"
},
"pix": {
"qr_code": "00020101021226840014br.gov.bcb.pix2562qrcodepix.example.com/v2/abcd1234",
"expires_at": "2026-08-05T14:00:00+00:00",
"end_to_end_id": "E12345678202608041200"
},
"created_at": "2026-08-04T14:00:00+00:00",
"paid_at": "2026-08-04T14:03:11+00:00",
"expired_at": null,
"refunded_at": "2026-09-19T10:41:07+00:00"
}
}
}Eventos de contestação (MED)
med.approved
Enviado quando a contestação de Pix é deferida. O comprador foi estornado e a venda está devolvida.
WEBHOOK
med.approved
{
"id": "evt_01k2p7q9s1u3w5y7a9c1e3g5j7",
"type": "med.approved",
"created_at": "2026-09-19T10:41:08+00:00",
"data": {
"med": {
"object": "med",
"id": "med_01k2m4n5r3t7v9x1z3b5d7f9h1",
"status": "approved",
"reason": "Não reconheço esta compra no meu extrato.",
"held_amount": 10000,
"currency": "BRL",
"end_to_end_id": "E12345678202608041200",
"purchase_date": "2026-08-04",
"opened_by": "customer",
"claimant": {
"name": "Maria Souza"
},
"evidence": [
{
"id": 41,
"side": "claimant",
"filename": "extrato-do-banco.pdf",
"mime": "application/pdf",
"size": 184320,
"sent_at": "2026-09-16T13:22:40+00:00"
},
{
"id": 42,
"side": "seller",
"filename": "comprovante-de-entrega.png",
"mime": "image/png",
"size": 96144,
"sent_at": "2026-09-17T09:10:02+00:00"
}
],
"events": [
{
"type": "opened",
"at": "2026-09-16T13:22:40+00:00",
"held_cents": 10000,
"charge_code": "ch_01k1y6r6m6q2x0p3d9v4t7c8n2",
"evidence_count": 1
},
{
"type": "seller_defence",
"at": "2026-09-17T09:10:02+00:00",
"files": 1
},
{
"type": "approved",
"at": "2026-09-19T10:41:07+00:00",
"released_cents": 10000
}
],
"opened_at": "2026-09-16T13:22:40+00:00",
"defence_deadline": "2026-09-23T13:22:40+00:00",
"responded_at": "2026-09-17T09:10:02+00:00",
"decided_at": "2026-09-19T10:41:07+00:00",
"decision_note": "Evidências não comprovam a entrega ao titular do Pix.",
"resolved_by": "platform",
"refund": {
"object": "refund",
"id": "re_01k2p7q8r0t2v4x6z8b0d2f4h6",
"status": "refunded"
}
},
"charge": {
"object": "charge",
"id": "ch_01k1y6r6m6q2x0p3d9v4t7c8n2",
"status": "refunded",
"payment_method": "pix",
"amount": 10000,
"currency": "BRL",
"platform_fee": 798,
"net_amount": 9103,
"refunded_amount": 10000,
"description": "Curso de Vue 3",
"reference": "pedido-1042",
"metadata": {
"carrinho": "cart_88f21"
},
"customer": {
"name": "João Comprador",
"email": "joao@exemplo.com.br",
"document": "111.***.***-35"
},
"pix": {
"qr_code": "00020101021226840014br.gov.bcb.pix2562qrcodepix.example.com/v2/abcd1234",
"expires_at": "2026-08-05T14:00:00+00:00",
"end_to_end_id": "E12345678202608041200"
},
"created_at": "2026-08-04T14:00:00+00:00",
"paid_at": "2026-08-04T14:03:11+00:00",
"expired_at": null,
"refunded_at": "2026-09-19T10:41:07+00:00"
}
}
}approved é a contestação deferida — ou seja, você perdeu. O adjetivo descreve a decisão sobre
a contestação, não sobre a sua loja. Um sistema que leia este evento como “aprovado para mim”
libera acesso numa venda que acabou de ser devolvida.med.opened mandou segurar:
cancele o acesso, o envio ou a assinatura. A retenção virou débito definitivo e o dinheiro já foi
para o comprador.
O nome espelha o status interno (status: approved) para que evento, painel e API falem uma língua
só. Quem quiser o placar tem status e resolved_by; o painel mostra “Perdida”.
Confira a assinatura antes de agir. Ver Verificar a assinatura.
O que vem atualizado
data.charge chega com status e refunded_amount já atualizados, e data.med.refund descreve o
estorno feito ao comprador — do mesmo jeito que em
charge.refunded, para o seu código ler os dois pelo
mesmo caminho.
resolved_by diz de onde veio o desfecho: platform é a Vext decidindo, seller é você tendo
assumido a contestação pelo painel.
refund vem null numa contestação deferida cuja venda já havia sido devolvida por outro
caminho. Leia data.charge.refunded_amount para saber quanto voltou, e não a presença do objeto.Headers
Assinatura da entrega, no formato t=<timestamp>,v1=<hmac>, onde
hmac é HMAC-SHA256("<timestamp>.<corpo bruto>", <segredo>).
Duas regras ao conferir:
- Calcule sobre o corpo bruto, antes de desserializar. Reserializar muda espaçamento e ordem, e o HMAC deixa de bater.
- Recuse timestamps com mais de 5 minutos. É isso que impede
alguém que interceptou uma entrega de
charge.paidde reenviá-la quantas vezes quiser, com assinatura perfeitamente válida.
Pattern:
^t=[0-9]+,v1=[0-9a-f]{64}$Tipo do evento, repetido fora do corpo. Redundante com o payload e útil mesmo assim: permite filtrar no seu log sem desserializar nada.
Identificador da entrega. Cite-o ao abrir um chamado - é por ele que localizamos a tentativa, a resposta do seu servidor e o horário.
Body
application/json
Identificador do evento. Estável entre as retentativas da mesma entrega - use-o para deduplicar do seu lado.
Example:
"evt_01k1y6r7z2m4n6p8q0r2s4t6u8"
Available options:
charge.paid, charge.failed, charge.in_analysis, charge.refunded, charge.chargedback, withdrawal.paid, med.opened, med.approved, med.rejected Show child attributes
Show child attributes
Response
Recebido.