How it works for your customer
Step 1: Enter details and review fee The customer provides the recipient’s bank details and the amount. The system calculates the fee and returns the total cost before it debits anything. The customer sees exactly what they will pay. Step 2: Confirm and send After the customer confirms, the system places a hold on the funds (amount + fee) in their account. It submits the transfer through JD’s SPB gateway to the BACEN network and issues a confirmation number at once.
Prerequisites
Before you initiate a transfer:
- The sender must have a registered account in CRM.
- The sender’s balance must cover the transfer amount plus the applicable fee.
- You must request the transfer on a business day, inside the operating window (06:30 to 17:00 Brasília time by default).
Step 1: Initiate the transfer
The customer submits the recipient’s details and the amount. The system validates the request, calculates the fee, and creates a transfer intent that is valid until the close of that day’s operating window. The system moves no funds at this stage. See the full request specification in the Initiate Transfer reference. Endpoint: POST /v1/transfers/initiate Response (key fields):
Fee direction (cash-out): For TED OUT transfers, the plugin adds the fee on top of the transfer amount, so
totalAmount = amount + feeAmount. The plugin holds, then debits, the full total from the sender’s account. TED IN works the other way and deducts the fee from the received amount.Step 2: Confirm the transfer
After the customer reviews the fee and confirms, submit the
initiationId to process the transfer. The system provisions the funds and sends the payment to the BACEN network.
Most integrations process the transfer with only the initiationId. Some tenants sign TED OUT payloads outside the plugin. These tenants first call POST /v1/transfers/signing/prepare. They then send signingArtifactId, payloadHash, and signature with the same initiationId.
See the full request specification in the Process Transfer reference.
Endpoint: POST /v1/transfers/process
Response (key fields):
Settlement timeline
1
Submitted
The system provisions the funds and sends the transfer to the BACEN network. Status:
PROCESSING.2
Settled
The STR confirms settlement, and the plugin debits the held funds. Status:
COMPLETED.3
Status available
The plugin exposes the
COMPLETED status through the transfer and reconciliation APIs. It does not emit transfer.completed for TED OUT.Operating hours
Error handling
Transfer rejected by JD or the STR
Transfer rejected by JD or the STR
JD or the STR rejects the transfer. The plugin releases the hold, so the full amount, including the fee, returns to the sender’s available balance. Status:
REJECTED. When JD rejects the transfer at submission, the plugin sends a transfer.rejected webhook.Temporary network issue
Temporary network issue
The plugin retries the JD call (
jdspb.max_retries, default 3). If the outcome stays unknown after retries (a 5xx or a timeout from JD SPB), the plugin does not auto-revert the transfer. It keeps the hold and the PROCESSING status, and hands the transfer to the reconciliation worker, which asks JD for the outcome. If reconciliation runs out of attempts, the transfer becomes FAILED with the hold still in place, and waits for an operator (MANUAL_REVIEW). A clear 4xx rejection differs: it reverts the hold at once (see the rejected case above).Return from the destination bank
Return from the destination bank
The destination bank can return the funds after settlement, for example on account closure or a regulatory hold. The original transfer stays
COMPLETED. The plugin creates a new TED_IN refund transfer that credits the returned amount to the original sender, with originalTransferId and devolutionCode. The plugin keeps the fee. It also sends a transfer_outgoing.devolution_notified webhook.Every mutating transfer request must include an
X-Idempotency header (max 255 characters). Reuse the same key to repeat a request whose response you did not receive. After a 5xx, read the transfer before you send it again. See the developer guide for details.Check transfer status
Track the progress of a transfer at any time. Endpoint: GET /v1/transfers/ Response (key fields):
Cancel a transfer
You can cancel a transfer while it is in
CREATED or PENDING status, before the plugin submits it to the network.
Endpoint: POST /v1/transfers//cancel
Common ISPB codes
Last verified: 2026-02-06. Values are subject to change.
For a complete list, consult the ISPB directory on the Central Bank website.

