Skip to main content
POST

Authorizations

Authorization
string
header
required

JWT token that the Lerian Access Manager issues for your institution. Send it in Authorization: Bearer <token> on every call (except the public health probes). The tenant never comes from the body, the query, or the path. Each operation requires a role with the matching permission (see the API overview). Without it, 403 TED-0071. Missing, invalid, or expired token: 401 TED-0070.

Headers

X-Account-Id
string<uuid>
required

Identifier (UUID) of the customer account in your own institution that starts the operation: the debited account in a send request or a quote. It goes in the header, never in the body. The account must belong to the organization that the token resolves. A missing or malformed value returns 400 TED-0008; an account from another organization returns 403 TED-0009.

X-Idempotency
string
required

Idempotency key that the integrator creates (1 to 128 printable ASCII characters, no spaces; we recommend a UUID). Required on every operation with an effect. Send the SAME key again when you retry a call that failed because of a timeout or network error. Same key + same body returns the original response with X-Idempotency-Replayed: true and no new effect. Same key + different body responds 422 TED-0012. Same key still in processing responds 409 TED-0013 (retry after Retry-After). Missing or in the wrong format: 400 TED-0011.

X-Request-Id
string<uuid>

Correlation identifier of this request (UUID). Optional: when you omit it, or when the value is not a well-formed UUID, the platform creates a UUID and returns it in the X-Request-Id header of the response. The resolved identifier goes to the logs, spans, and audit events of this request. Keep it to open a support ticket.

Body

application/json

Request to send a TED or an internal transfer. The debited account does NOT go in the body: the X-Account-Id header identifies it. The recipient's bank decides the path (TED or INTERNAL): another institution → TED through the STR; your own institution → internal transfer settled in the ledger.

amount
string
required

Amount in BRL as a decimal string, not a JSON number: digits only, with a dot as the decimal separator, up to 16 significant integer digits and at most 2 significant decimal places, with no sign or exponent. Leading and trailing spaces are ignored (e.g., "1500.00"; "1500.000" is equal to 1500.00).

Example:

"1500.00"

purposeCode
string
required

Purpose code of the TED (FinlddCli Domain Dictionary, 5 digits).

Pattern: ^[0-9]{5}$
Example:

"00001"

recipient
object
required

Recipient: bank (ISPB or COMPE), branch, account, account type, name, and document.

clientReference
string

Requester reference (up to 64 characters). Queries and events return it, and you can use it as a filter in GET /v1/transfers?client_reference=.

Maximum string length: 64
Example:

"PED-2026-000123"

description
string

Transfer description (up to 140 characters). Required when purposeCode=99999 (other).

Maximum string length: 140
Example:

"Supplier payment"

metadata
object

Free key-value pairs from the requester, returned verbatim in queries and events. Never sent to the STR or to other external systems.

Response

Transfer recorded. Read status: SUBMITTED (TED accepted by the rail; settlement through the STR is asynchronous), SETTLED (internal transfer settled), REJECTED (synchronous refusal from the ledger or the rail; see rejection), AWAITING_RECONCILIATION (TED) or CREATED (internal transfer): undetermined outcome; automatic reconciliation resolves it. If X-Idempotency-Replayed: true, this is the replay of an earlier transfer creation.

Representation of an outgoing (TED) or internal transfer. The create, query, and list operations return it, and so do the cancel and unblock actions. Track the lifecycle through the status field and the instants reservedAt/submittedAt/settledAt. When status=REJECTED, rejection tells you who refused it and why.

amount
string
required

Amount in BRL as a decimal string with two decimal places.

Pattern: ^(0\.(0[1-9]|[1-9][0-9])|[1-9][0-9]{0,11}\.[0-9]{2})$
Example:

"1500.00"

createdAt
string<date-time>
required

Time (UTC) of creation.

feeAmount
string
required

Fee charged at sending, in BRL (0.00 when exempt).

Pattern: ^(0|[1-9][0-9]{0,11})\.[0-9]{2}$
Example:

"0.00"

purposeCode
string
required

Purpose code given in the send request (FinlddCli, 5 digits).

Pattern: ^[0-9]{5}$
Example:

"00001"

recipient
object
required

Recipient sent when the transfer was created. In an internal transfer it includes accountId.

sender
object
required

Source account, always in your own institution (includes accountId).

status
string
required

Current state (published as a free string: handle unknown values with tolerance). Current values: CREATED, RESERVED, SUBMITTED, PENDING_STR, SETTLED, REJECTED, CANCELLED, AWAITING_RECONCILIATION, EXHAUSTED. TED: CREATED → RESERVED (amount + fee on hold) → SUBMITTED (sent to the STR) → SETTLED | REJECTED; PENDING_STR when the STR keeps the entry pending; AWAITING_RECONCILIATION and EXHAUSTED when the outcome could not be confirmed automatically; CANCELLED on a cancellation before submission or of a confirmed pending entry. INTERNAL: CREATED → SETTLED | REJECTED in the same call. Terminal: SETTLED, REJECTED, CANCELLED.

totalAmount
string
required

Amount + fee: the total debited (on hold) from the source account, in BRL.

Pattern: ^(0|[1-9][0-9]{0,11})\.[0-9]{2}$
Example:

"1500.00"

transferId
string<uuid>
required

Transfer identifier. Use it in queries and actions.

type
enum<string>
required

TED (another institution, through the STR) or INTERNAL (same institution, settled in the ledger).

Available options:
TED,
INTERNAL
updatedAt
string<date-time>
required

Time (UTC) of the last write to the record. This is not always a status change. ⚠️ An INTERNAL transfer can stay in CREATED because the ledger response was undetermined. In that case, the reprocessor uses updatedAt as the queue position on each new attempt, and it moves a transfer whose resend window expired one hour ahead: updatedAt CAN BE IN THE FUTURE (up to 1 h after the current time). Do not use it as a transition time.

clientReference
string

Requester reference sent with the transfer request.

Maximum string length: 64
description
string

Description given in the send request.

Maximum string length: 140
metadata
object

Free-form key-value pairs from the requester, kept verbatim. Never sent to external systems.

numCtrlStr
string

Identifier of the entry assigned by the STR (20 characters, XXXAAAAMMDDnnnnnnnnn).

Pattern: ^[A-Za-z0-9]{20}$
nuop
string

SPB identifier of the operation, 23 digits. It can be absent even in status=SUBMITTED. In that case, correlate by railOperationId.

Pattern: ^[0-9]{23}$
railOperationId
string<uuid>

Identifier of the operation in the rail (after acceptance).

rejection
object

Present only when status=REJECTED.

reservedAt
string<date-time>

Instant (UTC) when the amount and fee were put on hold in the source account. Start of the 30-min regulatory deadline for submission.

returned
object

Return received for this outgoing TED (credit back to the sender). Requires status=SETTLED and a LATER return from the recipient institution. For this reason it never appears in the creation response or in the list items, only in GET /v1/transfers/{transferId}.

settledAt
string<date-time>

Instant of settlement. Exists only from status=SETTLED.

submittedAt
string<date-time>

Timestamp (UTC) when the rail accepted the TED for sending to the STR.