Skip to main content
In order to submit a stablecoin-to-fiat transaction, first you need to:
  • Create an Account representing your customer
  • Create an Address which is your customer’s bank account where Brale will deposit USD
  • Deposit stablecoins to a Brale custodial address (address with type internal)
Important — Brale can only off-ramp stablecoins that are already held in a Brale internal address. If stablecoins are currently in an external or self-custody wallet, they must first be transferred to a Brale internal address before you submit the fiat payout request.
Destination bank addresses can be created in two ways:
  • Plaid-linked bank account — Securely connect a bank account via the Plaid Link SDK. Supports ach_debit, ach_credit, and rtp.
  • Direct bank entry — Submit bank details directly via the Addresses API. Supports wire, ach_credit, and rtp.
CapabilityPlaid-linked bank accountDirect bank entry
ach_debitSupportedNot supported
ach_creditSupportedSupported
rtpSupportedSupported
wireNot supportedSupported
Direct bank entry is the right path when you already have bank account details or need wire transfers. For the full comparison and guidance, see External bank addresses.

Direct bank entry

Here is an example of adding an offchain address via Direct bank entry using Create a new external address. POST https://api.brale.xyz/accounts/account_id/addresses/external
Request
{
  "owner": "Jane Doe",
  "account_number": "1234567890",
  "routing_number": "987654321",
  "name": "Example Bank",
  "transfer_types": ["ach_credit", "same_day_ach_credit", "rtp_credit"]
  "beneficiary_address": {
    "street_line_1": "100 Example St",
    "street_line_2": "Suite 500",
    "city": "Springfield",
    "state": "CA",
    "zip": "90001"
  },
  "bank_address": {
    "street_line_1": "100 Example St",
    "street_line_2": "Suite 500",
    "city": "Springfield",
    "state": "CA",
    "zip": "90001"
  },
  "account_type": "checking"
}
Response
{
  "id": "34yxvqP90NfeeYkQGriO6bSfn1K",
  "name": "THE BANK OF TAMPA",
  "owner": "Jane Doe",
  "status": "active",
  "transfer_types": ["ach_credit", "same_day_ach_credit", "rtp_credit"],
  "created": "2025-11-03T19:57:25.965990Z",
  "bank_address": {
    "state": "CA",
    "zip": "90001",
    "city": "Springfield",
    "country": "US",
    "street_line_1": "100 Example St",
    "street_line_2": "Suite 500"
  },
  "beneficiary_address": {
    "state": "CA",
    "zip": "90001",
    "city": "Springfield",
    "country": "US",
    "street_line_1": "100 Example St",
    "street_line_2": "Suite 500"
  },
  "account_number": "****7890",
  "needs_update": false,
  "last_updated": "2025-11-03T19:57:26.801044Z",
  "routingNumber": "063108680",
  "account_type": "checking"
}
Need ach_debit? Use the Plaid-linked bank account flow instead. See External bank addresses for details.

RTP Enablement

Offramps via RTP use the rtp_credit transfer_type on the destination Address. RTP capability is enabled asynchronously by our banking partner, so a newly created bank Address may initially not show rtp_credit even though it is eligible for real-time payments. Only treat an Address as RTP-capable once "rtp_credit" appears in its transfer_types. See Key Concepts → Addresses → Create External Address for RTP for details.

Stablecoin to USD via Wire

Once your customer has an address and stablecoins are held in a Brale controlled address, you can submit a Transfer request with the destination of the address. For outbound wire transfers, you can optionally pass destination.wire_memo to include a memo or payment reference with the wire. POST https://api.brale.xyz/accounts/account_id/transfers
Request
{
  "amount": {
    "value": "100",
    "currency": "USD"
  },
  "source": {
    "address_id": "2VcUIonJeVQzFoBuC7LdFT0dRe4",
    "value_type": "YSBC",
    "transfer_type": "Solana"
  },
  "destination": {
    "address_id": "2AbCdEfGHiJkLmN0pQrStUvWxYz",
    "value_type": "USD",
    "transfer_type": "wire",
    "wire_memo": "Invoice 1048"
  }
}
Brale will burn the stablecoins from the Source Address immediately, and then transfer USD to the destination bank account.

Self-custody redemption

If your customer holds stablecoins in a self-custody or external wallet (for example, Crossmint), the redemption is a two-step process:
  1. Transfer the stablecoins from the external wallet to a Brale internal address.
  2. Submit the off-ramp transfer from that internal address to the customer’s bank account.

Step-by-step example

  1. Your customer holds USDC in an external wallet.
  2. You retrieve or display the appropriate Brale internal deposit address for the supported chain.
  3. Your customer sends the stablecoins from their external wallet to that Brale internal address.
  4. Wait until the on-chain deposit is confirmed and the funds are held in the Brale internal address.
  5. Submit the stablecoin-to-fiat transfer using that internal address as the source and the customer’s bank address as the destination.
  6. Brale burns or converts the stablecoins and sends USD to the destination bank account.
Once the stablecoins have arrived in the Brale internal address, submit the off-ramp transfer: POST https://api.brale.xyz/accounts/account_id/transfers
Request
{
  "amount": {
    "value": "250",
    "currency": "USD"
  },
  "source": {
    "address_id": "2VcUIonJeVQzFoBuC7LdFT0dRe4",
    "value_type": "YSBC",
    "transfer_type": "Solana"
  },
  "destination": {
    "address_id": "2AbCdEfGHiJkLmN0pQrStUvWxYz",
    "value_type": "USD",
    "transfer_type": "ach_credit"
  }
}
Brale cannot redeem directly from an external wallet it does not control. The stablecoins must first be received into a Brale internal address so Brale can complete the redemption and fiat payout flow.