Key rulesDocumentation Index
Fetch the complete documentation index at: https://docs.brale.xyz/llms.txt
Use this file to discover all available pages before exploring further.
- All IDs are KSUIDs (26-char, time-sortable); copy/paste carefully.
address_idis the universal source/destination primitive (covers wallets and fiat endpoints).- Always send
Idempotency-Keyon create POSTs; never on GETs. Do not reuse a key with a different payload/URI.
- Fiat sources (e.g., a bank account for ACH or wire)
- On-chain wallet addresses
value_type: The currency being transferred (USD, USDC, USDT, MXN, etc.)transfer_type: The payment rail used (Wire, ACH, Polygon, Solana, SPEI, etc.)
Required Fields
| Field | Where | Type | Description |
|---|---|---|---|
account_id | Path | string | Account whose funds are being moved |
amount | Body | object | { "value": "10", "currency": "USD" } |
source | Body | object | Origin of funds (fiat rail or on-chain address) |
value_type | In source / destination | string | Currency/token (e.g., USD, USDC, SBC) |
transfer_type | In source / destination | string | Payment rail / chain (wire, ach_credit, polygon, solana) |
address_id | In source / destination | string | Wallet or fiat account sending or receiving value |
Idempotency-Key | Header | string | UUID that guarantees exactly-once execution |
Optional Fields
| Field | Where | Type | Description |
|---|---|---|---|
brand | Body | object | ACH only. { "account_id": "<ACCOUNT_ID>" } to control which Account name appears on ACH bank statement line items (ACH debit + ACH credit). Not supported for wire or rtp. |
wire_memo | In destination | string | Wire only. Memo or payment reference text sent with outbound wire transfers. Only applies when destination.transfer_type is wire. |
Response-only fields
source.payment_details
source.payment_details appears when Brale has underlying payment metadata to expose for the source leg of a transfer. This is primarily relevant for inbound fiat-funded transfers (e.g., wire or ACH on-ramps, automation-triggered mints).
The object is optional and may not be present on every transfer. Wire transfers typically include the fuller set of fields, while ACH transfers may include only a subset — fields may be null or omitted depending on available rail metadata.
| Field | Type | Description |
|---|---|---|
received_at | string (ISO 8601) | When the underlying payment was received or posted |
sender_name | string | null | Name of the originating sender, when available |
sender_bank_name | string | null | Originating bank name, when available |
sender_bank_routing_number | string | null | Originating bank routing number, when available |
payment_reference | string | null | Sender-provided payment reference or memo, when available |
imad | string | null | Wire IMAD / tracking identifier, when available |
trace_number | string | null | ACH trace identifier for the underlying payment, when available. Primarily relevant for inbound ACH-funded transfers. |
source.payment_details is a response-only field. It is not accepted as input when creating a transfer. Do not confuse it with destination.wire_memo, which is a request field for outbound wire transfers.destination.payment_details
destination.payment_details appears when Brale has underlying payment metadata to expose for the destination leg of a transfer. This is primarily relevant for outbound wire transfers (stablecoin-to-fiat offramps and wire payouts).
The object is optional and may be absent immediately after a transfer is created. For outbound wires, the IMAD is assigned by the sending bank and may not be available until after the wire has been submitted — Brale populates destination.payment_details later when the underlying bank metadata arrives.
| Field | Type | Description |
|---|---|---|
imad | string | null | Wire IMAD / tracking identifier for the outbound wire, when available |
destination.payment_details is a response-only field. It is not accepted as input when creating a transfer. Do not confuse it with destination.wire_memo, which remains a request field for outbound wire transfers.Transfer scenarios: understanding value_type and transfer_type
| Flow | Source | Destination | Description |
|---|---|---|---|
| Onramp (Fiat → Stablecoin) | USD / wire | SBC / base | Mint SBC on Base funded by wire deposit |
| Offramp (Stablecoin → Fiat) | SBC / solana | USD / ACH | Redeem SBC on Solana to USD via ACH |
| Swap (Stablecoin ↔ Stablecoin) | USDC / solana | SBC / solana | 1:1 swap from USDC to SBC with no slippage |
| On-chain Payout | USDC / polygon | USDC / polygon (external address) | Pay a recipient wallet |
| USDC off-ramp (wire) | USDC / polygon | USD / wire | Offramp USDC to wire |
| SBC branded ACH payout (ACH only) | SBC / base | USD / ach_credit + brand (ACH only) | ACH payout with brand on statement |
https://api.brale.xyz/accounts/{account_id}/transfers // The ID of your or your customer's account
USD to Stablecoin (Wire Transfer)
Accept a USD deposit to mint stablecoins. POSThttps://api.brale.xyz/accounts/account_id/transfers
wire_instructions so you can provide them to your customer.
Response
USD to Stablecoin (ACH Debit)
Onramp to your stablecoin by debiting a Plaid connected address. POSThttps://api.brale.xyz/accounts/account_id/transfers
Request
brand object
You can specify which Account’s name appears on the receiver’s bank statement line items for ACH only. It is not supported for wire or RTP.
Stablecoin to USD (Wire Offramp or Payout)
Offramp your stablecoin to USD via wire transfer. POSThttps://api.brale.xyz/accounts/account_id/transfers
Request
destination.wire_memo to include a memo or payment reference for the receiving bank or recipient.
Stablecoin to USD (ACH)
Offramp your stablecoin to USD via ACH Credit. POSThttps://api.brale.xyz/accounts/account_id/transfers
Request
Stablecoin Swaps
Swap USDC to your own stablecoin (YSBC). All stablecoin swaps are 1:1 with no slippage. POSThttps://api.brale.xyz/accounts/account_id/transfers
Request
Stablecoin Payout
Process stablecoin payouts to one or many external addresses (EOAs). POSThttps://api.brale.xyz/accounts/account_id/transfers
Request
Retrieving a single transfer
GEThttps://api.brale.xyz/accounts/{account_id}/transfers/{transfer_id}
On-chain transfer response
Response
Wire-funded transfer response (with payment_details)
For inbound wire-funded transfers, the response includes source.payment_details with metadata about the underlying payment. This helps you identify the sender and reconcile inbound fiat payments.
Response
Outbound wire transfer response (with destination.payment_details)
For outbound wire transfers (e.g., stablecoin-to-fiat offramps via wire), the response may include destination.payment_details with the wire IMAD once Brale has received the underlying bank metadata. The object may be absent immediately after the transfer is created and appear later when the wire is submitted.
Response
ACH-funded transfer response (with payment_details)
ACH transfers may include only a subset of payment_details fields. Fields may be null or omitted depending on available rail metadata.
Response (source excerpt)
transaction_id is a response-only field on source and destination. It contains the on-chain transaction hash or off-chain payment reference once the leg has been submitted to the network. It is not present in create requests. You can use transaction_id as a query-parameter filter on the list transfers endpoint.Listing transfers
GEThttps://api.brale.xyz/accounts/{account_id}/transfers
Returns a paginated list of transfers for the account. You can narrow results with query-parameter filters.
Filters
All filters are exact match and case-sensitive. When you combine multiple filters they apply with AND semantics.| Parameter | Filters by | Format | Example |
|---|---|---|---|
automation_id | Automation that created the transfer | KSUID | 2MhCCIHuK4TGVgT9a4loQzJx1rj |
value_type | Currency / token on source or destination | Canonical API id | USDC, SBC, usd |
transfer_type | Payment rail / chain on source or destination | Canonical API id | polygon, wire, solana |
transaction_id | On-chain transaction hash or off-chain payment reference | String (exact match) | 0xdd5646ea… |
value_type and transfer_type use canonical identifiers listed on the Value types and Transfer types coverage pages.200 with an empty transfers array.
Filtering by transaction_id
transaction_id is an exact-match filter. Pass the full on-chain transaction hash or off-chain payment reference as the value. The filter matches against the transaction_id field on either the source or destination leg of each transfer.
- The value must match exactly (case-sensitive, no partial matches).
- If no transfer matches, the API returns
200with an emptytransfersarray. - You can combine
transaction_idwith other filters (transfer_type,value_type,automation_id). Multiple filters use AND semantics — only transfers matching every filter are returned.
Example: filter by automation
Example: combined filters
Pagination
| Parameter | Description | Default |
|---|---|---|
page[size] | Results per page (1–100) | 25 |
page[after] | Cursor for forward pagination | — |
page[prev] | Cursor from pagination.prev | — |
page[after] or page[prev] may be present per request. Filters persist across pages — you do not need to resend them when paging.
Use the pagination.next value from the previous response as the page[after] query parameter in the next request.
Reconciliation best practices
- Store transfer
id,Idempotency-Key, timestamps, status, and any provider references. - For inbound fiat-funded transfers, check
source.payment_detailsto identify the sender and match payments. Wire transfers typically includesender_name,sender_bank_name, andimad; ACH transfers may include only a subset of these fields. - For outbound wire transfers, check
destination.payment_details.imadto record the wire’s IMAD for reconciliation and tracing. It may be absent immediately after the transfer is created and populated later once Brale has the underlying bank metadata. - Poll with backoff; avoid tight loops. Reuse the same
Idempotency-Keywhen retrying the same logical transfer. - On 401, refresh the token and retry idempotently.
Transfer Statuses
| Value | Description |
|---|---|
pending | The transfer has been submitted but is not yet in progress. This may be due to Brale waiting for funds (e.g., fiat-to-stablecoin wire transfer) or an ongoing review. |
processing | The transfer is in progress. |
complete | The transfer is finalized and funds have arrived at the destination. |
canceled | The transfer has been canceled. |
failed | An issue prevented Brale from completing the transfer. Manual intervention may be required. |
Transfer Flow
A transfer will progress frompending → processing → complete. Transfers include an updated_at field denoting the last time the status updated.
Transfer Limits
- Inbound ACH transactions are limited to $50,000 per transaction.
- There are no limits for wire or stablecoin transactions.