> ## Documentation Index
> Fetch the complete documentation index at: https://docs.brale.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Stablecoin to Fiat (Offramp)

> Convert stablecoins to USD and withdraw to bank accounts via wire, ACH, or RTP payment rails.

In order to submit a stablecoin-to-fiat transaction, first you need to:

* Create an [Account](/key-concepts/accounts) representing your customer
* Create an [Address](/key-concepts/addresses) which is your customer's bank account where Brale will deposit USD
* Deposit stablecoins to a Brale custodial address (address with type `internal`)

<Warning>
  **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.
</Warning>

## Link an Address to your customer's Account

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`.

| Capability   | Plaid-linked bank account | Direct bank entry |
| ------------ | ------------------------- | ----------------- |
| `ach_debit`  | Supported                 | Not supported     |
| `ach_credit` | Supported                 | Supported         |
| `rtp`        | Supported                 | Supported         |
| `wire`       | Not supported             | Supported         |

**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](/key-concepts/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](/api-reference/brale/create-address).

**POST** `https://api.brale.xyz/accounts/account_id/addresses/external`

```json title="Request" theme={null}
{
  "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"
}
```

```json title="Response" theme={null}
{
  "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"
}
```

<Note>
  Need `ach_debit`? Use the [Plaid-linked bank account flow](/api-reference/brale/create-plaid-link-token) instead. See [External bank addresses](/key-concepts/external-bank-addresses) for details.
</Note>

### 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`

```json title="Request" theme={null}
{
  "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.

### Tracking the outbound wire with `destination.payment_details.imad`

When you retrieve the transfer, the response may include a `destination.payment_details` object containing the wire IMAD for tracing and reconciliation.

```json title="Response" theme={null}
{
  "id": "3D1RcbwVywOGyU2HBSenljm5dhV",
  "status": "complete",
  "source": {
    "address_id": "2VcUIonJeVQzFoBuC7LdFT0dRe4",
    "value_type": "SBC",
    "transfer_type": "solana",
    "transaction_id": "5K8…"
  },
  "destination": {
    "address_id": "2AbCdEfGHiJkLmN0pQrStUvWxYz",
    "value_type": "USD",
    "transfer_type": "wire",
    "wire_memo": "Invoice 1048",
    "payment_details": {
      "imad": "20260406XOIZJDPP953495"
    }
  },
  "updated_at": "2026-04-07T00:05:12.102000Z",
  "created_at": "2026-04-07T00:01:27.756775Z",
  "amount": {
    "value": "100",
    "currency": "USD"
  },
  "note": null
}
```

<Note>
  `destination.payment_details` is response-only and is not accepted in create requests. The IMAD is assigned by the sending bank and may not be available immediately after the transfer is created — the field may be absent until Brale has the underlying bank metadata, at which point it appears on the transfer. Do not confuse this with `destination.wire_memo`, which remains a request field for outbound wires. See [Transfers — `destination.payment_details`](/key-concepts/transfers#destinationpayment_details) for the full field reference.
</Note>

## 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.

```mermaid theme={null}
sequenceDiagram
    participant C as Customer
    participant W as External Wallet
    participant B as Brale
    participant BA as Bank Account
    C->>W: Initiate redemption
    W->>B: Transfer stablecoins to Brale internal address
    B->>B: Receive stablecoins in internal address
    B->>B: Burn / convert stablecoins
    B->>BA: Send USD payout
    B->>C: Redemption complete
```

Once the stablecoins have arrived in the Brale internal address, submit the off-ramp transfer:

**POST** `https://api.brale.xyz/accounts/account_id/transfers`

```json title="Request" theme={null}
{
  "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"
  }
}
```

<Note>
  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.
</Note>
