Skip to content
I InopinoPay API PixVersion 3.40 · updated on Pages

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.