Addresses are represented by an address_id, which uniquely identifies a wallet or account for a specific transfer_type.
IDs are KSUIDs (26-char, time-sortable); copy/paste carefully.An
address_id can represent either an onchain wallet or offchain account (ACH, Wire, or RTP account), depending on the transfer_type. Use address_id wherever a source/destination is required in Transfers.
Brale distinguishes between internal and external addresses using the type field:
type:internal- Anaddress_idassociated with wallets managed by Brale on behalf of you or your customers.type:external- Anaddress_idmanaged outside of Brale’s infrastructure (e.g., user-owned wallet or external account).
name: A human redable labeltransfer_types: Thetransfer_typesthe address supports.
Supported Transfer Types
- Off-chain rails:
wire,ach_credit,same_day_ach_credit,ach_debit,rtp_credit. - On-chain (examples):
canton,base,polygon,solana,stellar,xrp_ledger, … (use the API identifiers from Coverage → Stablecoins & Blockchains).
Custodial (Internal) Addresses
Brale provides custodial wallets that allow businesses to securely hold and transfer stablecoins on behalf of themselves or their customers. Custodial addresses support all supported blockchains. When your customer’s Account is onboarded, Brale automatically generates internal custodial addresses on all supported blockchains. You do not need to create them manually. If an address is visible under an account-scoped endpoint but not globally, use the account-scoped endpoint.Non-Custodial (External) Addresses
Create external addresses to link on-chain wallets or off-chain bank endpoints. Addresses can be created in two ways:- Addresses API
- Plaid
/accounts/{account_id}/addresses/external
Offchain addresses supporting ach and rtp related transfer_types can also be registered via Plaid. See the full guide below.
Create onchain external address
The blockchains the address supports. See Supported Chains for the full list. Each address is associated with only one blockchain environment (e.g., Solana, EVM).Request
Response
Create Non-Custodial (External) Address for ACH Credits
These support the followingtransfer_types and enable USD to be sent to a destination in a transfer.
ach_creditsame_day_ach_credit
Request
Response
Create External Address for RTP
Real-time payments (rtp_credit) work slightly differently from other transfer types.
RTP eligibility is determined asynchronously by our banking partner after the bank account is registered. When you create an off-chain external address and include rtp_credit in transfer_types, the initial Address may only list ACH rails, for example:
Response
rtp_credit to transfer_types. This typically happens shortly after creation.
Update Address transfer types
Sometimes you’ll want an address to gain new capabilities over time. For example:- You want an EVM onchain address to start supporting an additional chain (e.g.,
ethereumin addition tobase). - A bank account that initially only supports
wireis upgraded to also supportach_credit.
transfer_types to an existing Address (and optionally update its name):
Onchain Address Example - add a new EVM chain
Suppose you have a non-custodial EVM wallet Address that currently only supports base and want to add ethereum:
PATCH /accounts/{account_id}/addresses/{{address_id}}
Request
Response
/accounts/{account_id}/addresses/{{address_id}}
Request
Response
Updating Address Name
You can also use this endpoint to update the human-readable name (alias) of an Address. You can send name on its own, or together with additional_transfer_types:Request
Behavior
additional_transfer_types is a list of transfer types to add to this Address. These are merged into the existing transfer_types.
- The values in
additional_transfer_typesare added to the Address’s existingtransfer_types. - Existing
transfer_typesare preserved even if you don’t include them in the request. - Sending a transfer type that is already enabled is idempotent and has no effect.
- This endpoint can also be used to update the
nameof the address, a human readable alias.
Create Addresses through Plaid
This guide walks you through how to enable your customers to securely link their bank accounts via Plaid. After linking, the new Addresses can be used for ACH debits, ACH credits and RTP.Overview of the Flow
- Request a Plaid Link Token from Brale.
- Initialize Plaid Link in your front-end using the
link_token. - Plaid returns a
public_tokenonce the user has successfully linked their account. - Exchange the
public_tokenwith Brale to finalize the linking process. - Fetch the newly created Address for the end user, then proceed with transfers, etc.
Request a Plaid Link Token
POSThttps://api.brale.xyz/accounts/{account_id}/plaid/link_token
Request
Response
| Parameters | Description |
|---|---|
link_token | The token you will use to launch Plaid Link in your front-end or mobile app. |
expiration | Time at which the link_token will no longer be valid. |
callback_url | The endpoint to which you should send the public_token to finalize the exchange. |
Render the Plaid Link SDK
In your front-end, initialize Plaid Link using the link_token you received. For production apps, it’s recommended you send the public_token to your own backend (over HTTPS), and then have your backend call our exchange endpoint. That way, you avoid exposing your own platform API keys in the browser.Register Address (exchange the public token)
Send us the public_token you received from Plaid Link. Brale securely exchanges it for a Plaid access_token server-side and creates an Address on the specified Account. POSThttps://api.brale.xyz/accounts/{account_id}/plaid/register-account
Request
Response
Check for newly created Addresses
Shortly after exchanging the public token, the user’s bank accounts are idempotently created as an Address which you can query. GEThttps://api.brale.xyz/accounts/account_id/addresses/{id}
Response
Handling Re-Authentication
When Plaid signals that an Item requires user action (e.g., credentials changed), Brale can notify you via webhook and you can present a Plaid update Link flow to the user.Receive Brale webhook
Brale willPOST a JSON payload when re-auth is required to the customer_webhook you provide during the exchange step.
Example payload
Check status
GEThttps://api.brale.xyz/accounts/{account_id}/addresses/{address_id}
Response
Request an updated link token
POSThttps://api.brale.xyz/accounts/{account_id}/addresses/{address_id}/update-link-token
Response
link_token. Plaid will streamline the flow and only ask the user to re-authenticate. Run Step 3 again with the new public_token (same endpoint). The existing Address is updated in place and retains the same address_id.
Fetching Addresses
Retrieve all addresses associated with the authenticated Account. This endpoint returns all addresses (whether internal or external) linked to the Account. GET/accounts/{account_id}/addresses
Response
Fetching an Internal Balance
You can query the stablecoin balance of an internal address. GET/accounts/{account_id}/addresses/address_id/balance?transfer_type=chain&value_type=token
Response
Filtering Addresses
You can narrow results onGET /accounts/{account_id}/addresses with optional query parameters.
Query Parameters
| Param | Type | Description |
|---|---|---|
address | string | Exact on-chain address (e.g., EVM, Solana). |
type | enum | Filter by address type: internal | external. |
transfer_type | enum (repeatable) | Filter by one or more transfer types (e.g., ethereum, base, solana, stellar). |
Examples
External addresses usable on Solana OR Base GET/accounts/{account_id}/addresses?type=external&transfer_type=solana&transfer_type=base
Exact EVM address (case-insensitive)
GET /accounts/{account_id}/addresses?address=0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
Internal EVM addresses that support Ethereum
GET /accounts/{account_id}/addresses?type=internal&transfer_type=ethereum