Validate a receiving account synchronously
Pre-checks a receiving account before a payment is sent, and answers the section 9.3.1 envelope . JDPI calls it BEFORE settlement, on behalf of the payer’s PSP, so that a payment that would fail is not sent.
EVERY VALIDATION OUTCOME IS HTTP 200, including a rejection: resultado carries the verdict and motivo the reason. Do not branch on the HTTP status here — a 200 with resultado inválido is a refusal, and treating it as success is the mistake this shape invites. No money moves; the one thing recorded is step 7’s hold. Asking again for the same order does not change its verdict, but each re-ask that holds the charge records the hold again, so a late re-ask extends that order’s hold.
The checks run in a fixed order and the FIRST one that decides, decides:
- When the payment carries a conciliation id, a blank recebedor.cpfCnpj is refused with motivo CH11 and a blank recebedor.ispb with motivo DS04; a QR charge already paid to the same recebedor within the last 24 hours is refused as a duplicate (motivo DUPL); a charge another payment order to the same recebedor at the receiving PSP, by CPF/CNPJ or by account, holds (step 7) is refused with motivo DUPL too, until that order’s credit lands, up to 24 hours; and a payer whose document differs from the one the charge was issued for is refused BE17 — but only when that charge was created demanding the payer be validated.
- A pagador.ispb identifying Bacen (99999) passes unconditionally.
- The account to check is the one on the participant block naming an ISPB the client’s catalog serves — recebedor first, the pagador only when the recebedor is not served. If neither block does, the answer is motivo AC03 (account not found).
- That account is then looked up by its branch and account number and its holder document compared: no such account is AC03; a lookup that could NOT BE COMPLETED is a 500, never a verdict — an unreadable record establishes nothing about the account, and AC03 would tell the payer’s PSP that a live account is absent; a document that does not match the account’s holder is motivo BE01 (inconsistent data).
- When step 3 chose the recebedor block, that account, by branch and number as the credit resolves it, is then read in the ledger: closed is motivo AC07, blocked or a default balance refusing credits is motivo AC06, and an account the ledger does not hold is AC03; a ledger that could NOT BE READ is a 500, never a verdict. Coordinates naming no account or several, and every other account status, leave the account valid.
- A devolução (creditoDevolucao) that account would accept is refused with motivo AM09 when its valor exceeds what is left to return of the payment endToEndIdOriginal names: that payment’s amount less every devolução already settled against it, booked or still awaiting its payment’s settlement here. A payment this participant never made is not measured, and a balance that could NOT BE READ is a 500, never a verdict.
- A payment with a conciliation id that passes every check holds that charge for that recebedor’s CPF/CNPJ and for that receiving account, at the receiving PSP. Of two orders validated at once, on this route or the asynchronous one, exactly one holds it and the other is answered DUPL.
⚠️ THIS CHECK READS ONLY THE CUSTOMER RECORDS OF THE PARTICIPANTS THE CLIENT’S CATALOG SERVES. Step 3 is the reason: an INDIRECT participant served by one of them (registered with POST /v1/indirects) has an ISPB of its own, which the catalog never names. A payment addressed to an indirect participant therefore matches neither block and is answered AC03 here, even though POST /v1/webhooks/cash-ins would register that same credit against that institution’s @pi_{ispb} settlement position. Do NOT read an AC03 from this operation as evidence that a credit to an indirect participant would be refused, and do not use this operation to pre-check indirect destinations.
Refusals, as opposed to verdicts, are only transport-level: 400 PIX-0061 when the body fails schema validation at the edge, and 500 when a record this check has to read or write is unavailable — in which case nothing was validated and the call can be retried.
Authorizations
JWT bearer token issued by the identity provider.
Body
Operation timestamp (ISO-8601).
"2026-06-20T10:00:00Z"
The payer participant block (ISPB drives Bacen detection).
The receiver participant block.
Amount in reais (a JSON number).
10.5
Optional return-credit block.
Optional payment-order credit block.
Finality (eFinality).
0
Recipient conciliation id.
"CONC-V"
Free-text inter-client info.
"note"
Saque/troco PSS participant ISPB (a v5.5.0 string).
"12345678"
Agent modality (eModalityAgent).
0
Payment priority.
0
Initiation type (eStartupType).
0
Payment priority type.
0
Optional value-detail entries.
Response
OK
Validation timestamp (aaaa-mm-ddTHH:mm:ss.sssZ, UTC).
"2026-06-20T10:00:00.000Z"
Validation result (0=Inválido, 1=Válido).
1
Reason code on an invalid result (DUPL/CH11/DS04/BE17/AC03/AC06/AC07/BE01/AM09).
"AC03"
Human-readable reason complement on an invalid result.
"Conta recebedora não encontrada"

