v2.41.1 — A refused internal transfer no longer comes back as pending
v2.41.1 — A refused internal transfer no longer comes back as pending
- Provider refusals now answer
422.POST /v1/accounts/{accountId}/transfers/internal(and the/by-documentand/by-bank-accountvariants) used to answer202withstatus: "PENDING"when the banking provider refused the operation — the transfer was definitively over, yet the response asked you to wait. Refusals now come back as422withstatus: "FAILED",errorCodeanderrorReason, as the contract already documented.202 PENDINGis now reserved for the indeterminate case (operation still running when the synchronous window ends). insufficient_fundsinstead ofpartner_rejectedwhen balance is the reason. The provider refuses internal transfers for lack of balance with a generic message (“the provider refused the operation”). We now read the available balance at refusal time: when it does not cover the requested amount, the response isinsufficient_funds. Without that evidence the refusal stayspartner_rejected, with the provider’s reason in thepartnerblock.- Correct
workflowIdfor internal transfers. Repeating the POST with the sameIdempotency-Keyreturned aworkflowIdcarrying the PIX out prefix. It now carries the operation’s real id (internal-out-…). - TED no longer stays in
PROCESSINGforever. The settlement bank’s outcome did arrive, but it was delivered to the wrong process and lost — and the TED record was never updated. As a result,GET /transfers/ted/{tedId}and the statement showed “processing” even for TEDs already settled or rejected, and a rejection only surfaced asted.out.failed48h later, with a generic timeout reason instead of the real rejection. The outcome is now applied as soon as it arrives, and the TEDs that were stuck have been reconciled with their real state. - TED:
bankCodeonly accepts the 3-digit Compe code. Sending the 8-digit ISPB in that field is now rejected upfront with400 invalid_bank_code. Before, the request was accepted with202, reached the settlement bank with no destination bank, and the TED stayed stuck inPROCESSING— never settling, never failing. ISPB remains valid for PIX by bank account (bankIspb).
Internal transfers have no failure webhook
The transfer.internal.out webhook is only delivered when the transfer settles.
For a refusal the outcome lives in the response to the call itself — which is
why the 422 above matters. Do not wait for a webhook to close a refused
internal transfer.
v2.42.0 — Temporary access suspension for open pendencies
v2.42.0 — Temporary access suspension for open pendencies
- Two new codes:
tenant_suspendedandtenant_disabled. When there is an open pendency, a tenant’s access can be suspended temporarily. With the tenant suspended, reads (GET) keep working — balance, statement, operation status — and writes answer403 tenant_suspended. With the tenant disabled, every route answers403 tenant_disabled. - The credential is not revoked. The same
client_id/client_secretkeeps issuing tokens normally; the refusal happens on the API call. Once the pendency is cleared, access returns on the next call — no new credential, no new token. - Incoming money keeps flowing. Received PIX is still credited and the webhooks for those events are still delivered. Suspension blocks starting new operations, not receiving.
Details in the Authentication Guide.