Skip to main content

Internal transfers

An internal transfer moves funds between accounts inside LB Pay, without leaving for BACEN. Because it does not touch the external settlement network, it completes faster — but the integration rules are identical to every other write operation.

API: POST /v1/transfer, GET /v1/transfer/{externalId}

curl --request POST \
--url "https://api.sdb.lbpay.com.br/v1/transfer" \
--header "Authorization: Bearer $TOKEN" \
--header 'content-type: application/json' \
--data '{
"externalId": "5f6a7b8c-9d0e-1f2a-3b4c-5d6e7f8a9b0c",
"amount": 2500,
"toAccountNumber": "00098765"
}'

amount is in cents. toAccountNumber cannot be the account paying.

Rules that still apply​

  • One externalId per transfer, persisted before sending and reused on retries. See Idempotency.
  • Timeouts require a GET, not an assumption. See Retries and timeouts.

Statuses​

The terminal success status is COMPLETED — not SUCCESS, which is what Pix-Out uses. Mapping the two flows to the same vocabulary is a common source of transfers that appear stuck forever.

PENDING and CONFIRMED are transitional: take no action until the transfer reaches COMPLETED, REJECTED, EXPIRED or ERROR. The full table and the state diagram are in Status Machine — Internal transfer.