Comece por aqui

Infrações e MED

Saiba quando um Pix recebido é contestado, quanto fica bloqueado e como enviar a sua defesa.

Quando o pagador contesta um Pix que você recebeu (Mecanismo Especial de Devolução, MED), o liquidante abre uma infração sobre a transação. A MonkeyPay avisa pelo webhook, bloqueia o valor contestado na carteira e aceita a sua defesa pela API.

1. Receba o aviso

Cadastre a URL infraction na configuração de webhooks (veja o guia Webhooks). Cada abertura ou mudança de estado da infração gera um POST com o corpo da transação e o objeto infraction:

1{
2 "transactionId": "3f1c9a52-6d0e-4b8e-9d7a-2c4b5e6f7a81",
3 "externalId": "pedido-1234",
4 "type": "pix_in",
5 "status": "completed",
6 "amount": 150,
7 "endToEnd": "E12345678202609241200abcdef012345",
8 "infraction": {
9 "id": "8b6f2d1e-4c3a-4f5b-9e8d-7a6b5c4d3e2f",
10 "type": "refund_request",
11 "status": "open",
12 "amount": 150,
13 "reason": "Pagador não reconhece a transação",
14 "reportedBy": null,
15 "analysisResult": null,
16 "analysisDetails": null,
17 "createdAt": "2026-09-24T12:00:00.000Z",
18 "updatedAt": "2026-09-24T12:00:00.000Z"
19 }
20}
  • O corpo não traz o nome do evento. Se a URL infraction for a mesma dos outros estados, identifique a infração pela presença do objeto infraction.
  • status no nível raiz é o estado da transação; o da infração está em infraction.status.
  • Guarde infraction.id: ele é usado na consulta e na defesa.
  • reportedBy, analysisResult e analysisDetails repetem o que o liquidante informou e podem vir null.

2. Entenda o bloqueio

1Pix recebido (completed)
2 │ pagador contesta no banco dele
3 ▼
4Infração aberta
5 │ valor bloqueado no saldo
6 │ você envia a defesa (passo 4)
7 ▼
8Decisão sobre o valor
9 ├─ approved → debitado
10 ├─ rejected → liberado
11 ├─ cancelled → liberado
12 └─ closed → sem movimentação

Ao abrir a infração, infraction.amount fica bloqueado no saldo da carteira. Esse valor pode ser menor que o da transação (contestação parcial). O desfecho decide o que acontece com ele:

infraction.statusSaldoTransação
approvedValor bloqueado é debitado e devolvido ao pagadorPassa a infraction
rejected, cancelledValor é liberadoMantém o estado
closedNão há movimentação automáticaMantém o estado

Estados intermediários (waiting_psp, open, acknowledged, analysing, defended, answered, waiting_adjustments) mantêm o bloqueio.

Se a infração chegar a closed e o valor seguir bloqueado, fale com o suporte informando o infraction.id.

Tipos (infraction.type): refund_request (pedido de devolução), fraud (suspeita de fraude) e refund_cancelled (pedido de devolução cancelado).

3. Consulte a infração

GET /resource/infractions lista as infrações da organização do token e das suborganizações vinculadas, com paginação. A empresa-mãe pode consultar os casos das suas subempresas; a credencial de uma subempresa não alcança os casos da mãe ou de uma empresa irmã. Use organizationId para filtrar uma organização dentro do seu alcance.

1GET /resource/infractions/{infractionId}
2Authorization: Bearer <seu-token>

Devolve a infração com transactionId, externalId, walletId, accountId, status, type, amount, reason, createdAt e updatedAt. account traz id, bankCode, bankIspb, bankName, agency, accountNumber, holder, type e status, ou vem null; pixTransaction traz só endToEnd, ou vem null. O detalhe não devolve o documento do titular da conta nem os dados de pagador e recebedor do Pix. Infração fora do alcance da credencial responde 404.

4. Envie a defesa

A defesa é enviada uma única vez por infração, em multipart/form-data:

1curl -X POST "https://api.monkeypay.app/api/v2/resource/mediations" \
2 -H "Authorization: Bearer <seu-token>" \
3 -F "infractionId=8b6f2d1e-4c3a-4f5b-9e8d-7a6b5c4d3e2f" \
4 -F "defense=Produto entregue em 20/09; comprovante e conversa anexos." \
CampoObrigatórioRegra
infractionIdsiminfraction.id recebido no webhook
defensenãoTexto da defesa
attachmentssimDe 1 a 10 arquivos, até 10 MiB (10.485.760 bytes) cada

A resposta 201 confirma o registro da defesa e traz a mediação em data, com id, status (pending) e os links temporários dos anexos. Ela não confirma recebimento ou decisão do liquidante.

StatusMotivo
400Anexo ausente, fora dos limites ou com tipo não aceito; campo de arquivo diferente de attachments; ou o liquidante da transação não aceita defesa pela API
404Infração inexistente ou de outra organização
409Já existe defesa para essa infração

Consulte o estado registrado por GET /resource/mediations/{mediationId}. GET /resource/mediations lista as mediações da organização do token e das suborganizações vinculadas. Mudanças em infraction.status também podem chegar pelo webhook, mas não devem ser interpretadas como confirmação de envio ou decisão sobre a defesa. Uma atualização da mediação depende do processamento das informações do liquidante.

Permissões

A consulta da infração exige o escopo monkeypay:infractions:read; enviar a defesa exige monkeypay:mediations:write, e acompanhá-la, monkeypay:mediations:read. Resposta 403 indica que a sua credencial não tem esses escopos: peça a habilitação ao suporte.