Disputes
The bank of the payer can dispute a received Pix. The disputed amount is held from your balance while the dispute runs. Without enough balance, the hold starts partial and grows with the next credits up to the disputed amount. If the Pix did not become balance, because it is already going back to the payer, nothing is held. If another dispute on the same Pix already holds its amount, nothing more is held. In these cases semBloqueio says why. You receive med.infracao.criada when it opens and med.infracao.atualizada when it changes.
List #
GET /v2/ex/infracoes
Scope: ex.med.read.
GET /v2/ex/infracoes
→ 200
{
"infracoes": [
{
"idInfracao": "01J1ZK7M9QW3ERT5TY6UI8OPQR",
"endToEndId": "E12345678202609181200000000000001",
"tipo": "FRAUDE",
"valor": "100.00",
"situacao": "ABERTA",
"relato": "pagador alega nao reconhecer o pagamento",
"prazoFinalizacao": "2026-09-25T12:00:00Z",
"bloqueioId": "med:01J1ZK7M9QW3ERT5TY6UI8OPQR",
"criadoEm": "2026-09-18T12:00:00Z"
}
]
}
| Parameter | Type | Description |
|---|---|---|
situacao |
string | Filters by ABERTA, EM_DEFESA, ACATADA or REJEITADA. Accepts several, separated by commas. |
limite, cursor |
integer, string | With either one, the list comes by page, from the most recent to the oldest, with cursor. Without them, it comes whole, the open ones first. |
de, ate |
string | AAAA-MM-DD dates, inclusive, by when the dispute opened, in Brasília time. Either one alone also works. |
origem |
string | PIX or CARTAO. |
busca |
string | The endToEndId, the sale reference or the idInfracao, exact. |
When the same Pix has more than one dispute, the one rejected without holding anything is a repeated notice: it does not appear in the list or in the summary, and it remains available by its idInfracao.
GET /v2/ex/infracoes/{id} returns a dispute.
| Field | Type | Description |
|---|---|---|
situacao |
string | ABERTA, EM_DEFESA, ACATADA when the payer won and the amount goes back to the payer, REJEITADA when you won and the amount goes back to your available balance. |
valor |
string | The disputed amount. |
bloqueioId |
string | The corresponding hold, in GET /v2/ex/bloqueios. Not present when nothing is held. |
semBloqueio |
string | Why the hold did not happen or is partial. Only present in those cases. |
valorADescoberto |
string | Only appears when the hold did not cover the disputed amount: the difference, which you then owe us and which adds to aRecuperar in the balance. |
prazoFinalizacao |
string | Deadline of the dispute. When capacidades.med is false, the outcome may arrive after it, in med.infracao.atualizada. |
The defense depends on the account. Read capacidades.med in GET /v2/ex/config: when it is false, the defense is made by the institution with the provider of the account, and you follow it here. When it is true, see the internal reference.
Summary #
GET /v2/ex/infracoes/resumo
Scope: ex.med.read. Accepts de, ate, origem and busca, like the list.
GET /v2/ex/infracoes/resumo?de=2026-10-01&ate=2026-10-15
→ 200
{
"abertas": { "quantidade": 3, "valor": "45.00" },
"acatadas": { "quantidade": 1, "valor": "20.00" },
"rejeitadas": { "quantidade": 2, "valor": "30.00" },
"total": { "quantidade": 6, "valor": "95.00" },
"retidoAgora": "45.00"
}
| Field | Type | Description |
|---|---|---|
abertas |
object | Disputes in ABERTA or EM_DEFESA: quantidade and the disputed valor. |
acatadas |
object | The ones that went back to the payer. |
rejeitadas |
object | The ones that went back to your available balance. |
total |
object | All in the selection. |
retidoAgora |
string | What is held by disputes right now, regardless of the selection. |
The valor of each group counts each Pix once, up to the amount of the Pix. The quantidade counts the disputes.
Disputes in your balance #
The available balance is debited once, when the amount is held. The outcome only decides where the held amount goes. To avoid debiting twice, track the total held like this:
| Event | What happens | In your records |
|---|---|---|
saldo.bloqueado with tipo MED |
valor leaves available and is held. |
Available minus valor, held plus valor. |
saldo.bloqueio_ampliado |
One more part, valor, leaves available, or the guarantee when daGarantia comes. |
Available minus (valor minus daGarantia), held plus valor. |
saldo.desbloqueado with desfecho LIBERADO |
You won: the held amount goes back to available. | Held minus valor, available plus valor. |
devolucao.concluida with tipo MED and desfecho DEVOLVIDO |
The payer won: valor left the held amount to them, and liberado, when it comes, went back to available. |
Held minus valor minus liberado, available plus liberado. |
med.infracao.criada, med.infracao.atualizada |
No money moves: they describe the dispute and its status. | Nothing. |
The dispute's devolucao.concluida carries id (the hold's, the same as in saldo.bloqueado), tipo, valor, desfecho, endToEndId of the disputed Pix and idInfracao. It does not carry natureza: identify the dispute by tipo MED, by the hold id or by idInfracao.
Track the held amount as a total, not hold by hold: when the same Pix has more than one dispute, the held amount moves from one to the other without touching your available balance. The statement shows each hold as BLOQUEIO and each return to available as DESBLOQUEIO, and GET /v2/ex/bloqueios shows what each one holds now.
If the payer got back more than was held, the difference adds to aRecuperar in the balance and does not leave available on its own.
Dispute one of your payouts #
If one of your payouts went to a fraudster, through a scam, account takeover, coercion or fraudulent access, request its dispute. The institution opens it, at the institution the Pix left from. The request moves no money: what comes back arrives as the return of the payout, in payout.devolucao_recebida.
PUT /v2/ex/pedidos-de-med/{id}
Scope: ex.med.write. The id is yours, 26 to 35 letters or digits.
PUT /v2/ex/pedidos-de-med/MED01J1ZK7M9QW3ERT5TY6UI8O
{
"idEnvio": "SAQ04J1ZK7M9QW3ERT5TY6UI8O",
"motivo": "GOLPE",
"descricao": "Ligaram dizendo ser do banco e pediram a transferência."
}
→ 201
{
"id": "MED01J1ZK7M9QW3ERT5TY6UI8O",
"idEnvio": "SAQ04J1ZK7M9QW3ERT5TY6UI8O",
"endToEndId": "E12345678202609181200000000000004",
"motivo": "GOLPE",
"descricao": "Ligaram dizendo ser do banco e pediram a transferência.",
"situacao": "PEDIDO",
"valor": "30.00",
"valorRecuperado": "0.00",
"prazoEm": "2026-12-07T12:00:00Z",
"criadoEm": "2026-09-18T12:00:00Z"
}
| Field | Type | Required | Description |
|---|---|---|---|
idEnvio |
string | yes | The payout, already completed, that left up to 80 days ago. |
motivo |
string | yes | GOLPE, INVASAO_DE_CONTA, COERCAO, ACESSO_FRAUDULENTO or OUTRA_FRAUDE. |
descricao |
string | yes | What happened, in up to 2000 characters. |
A commercial disagreement, such as a product that did not arrive or did not please, and a mistyped key are not cases for a dispute, and the institution refuses the request. A repeat with the same body answers 200. Each payout has one request in progress at a time.
| Field | Type | Description |
|---|---|---|
situacao |
string | PEDIDO, ABERTO_NA_NOMINAL when the institution opened it, RECUSADO with the reason in resposta, DEVOLVIDO or NAO_DEVOLVIDO. After RECUSADO you can request again, with another id. |
protocolo |
string | The number of the dispute at the institution the Pix left from. Comes after it is opened. |
valorRecuperado |
string | What came back from the payout after the request. |
prazoEm |
string | Until when the dispute can still be opened. |
GET /v2/ex/pedidos-de-med/{id} returns one request, and GET /v2/ex/pedidos-de-med lists from the newest, by page, with idEnvio, situacao, limite and cursor. Scope: ex.med.read. You receive payout.med_pedido, payout.med_aberto, payout.med_recusado and payout.med_encerrado, with the keys of the request.
Errors #
| Status | title |
When |
|---|---|---|
| 400 | situacao_invalida |
Status filter outside the list. |
| 400 | limite_invalido |
limite outside 1 to 200. |
| 400 | cursor_invalido |
Malformed cursor. |
| 400 | periodo_invalido |
de or ate not in AAAA-MM-DD, or de after ate. |
| 400 | filtro_invalido |
origem other than PIX and CARTAO. |
| 400 | motivo_do_med_invalido |
motivo outside the list, in the request on a payout. |
| 400 | descricao_obrigatoria |
Request on a payout without descricao. |
| 400 | campo_desconhecido |
Request on a payout with a field other than idEnvio, motivo and descricao. |
| 404 | nao_encontrado |
The dispute, the request or the payout does not exist in this account. |
| 409 | med_ja_pedido |
The payout already has a request in progress. Its id comes in pedidoDoSaque. |
| 409 | id_duplicado |
The same id with another body. |
| 422 | saque_nao_liquidado |
The payout has not been completed yet. |
| 422 | prazo_do_med_vencido |
The payout left more than 80 days ago. |
| 422 | saque_ja_devolvido |
The amount of the payout has already come back in full. |