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

# Crypto off-ramping

> Convert crypto and stablecoins to local currency and pay out to bank accounts in Nigeria and Ghana using the Breet API.

Let your users convert crypto holdings to local currency and withdraw to their bank accounts. Breet accepts crypto deposits, converts them at market rates, and settles directly to bank accounts in NGN or GHS. You provide the user experience, Breet handles the conversion and payout.

<Frame>
  <img src="https://mintcdn.com/breet/iXvJ_saOvuHUW89O/images/SIX.webp?fit=max&auto=format&n=iXvJ_saOvuHUW89O&q=85&s=d053c19b0cf678abee9429d3f4635d60" alt="SIX" width="2048" height="1069" data-path="images/SIX.webp" />
</Frame>

## How it works

<Steps>
  <Step title="Generate a deposit address">
    Call the [generate-address](/api-reference/crypto-wallet/generate-wallet-address) endpoint for the asset the user wants to sell. Use the `label` field to tag the address with the user's ID. Each address is permanent, so you only need to generate it once per user per asset. Store it and reuse it for future off-ramps.
  </Step>

  <Step title="User sends crypto">
    Display the wallet address in your app. The user sends BTC, ETH, USDT, or any other [supported asset](/supported-assets) from their personal wallet or exchange.
  </Step>

  <Step title="Breet confirms the deposit">
    Breet detects the on-chain transaction and sends a [webhook](/webhooks) to your server with the deposit amount, asset, and status.
  </Step>

  <Step title="Crypto is converted">
    The deposit is automatically converted to your chosen wallet currency (USD, NGN, or GHS) at the current market rate.
  </Step>

  <Step title="Settle funds">
    How funds are handled after conversion depends on your setup:

    * **Without auto-settlement**: the converted amount is held in your wallet in your chosen currency (USD, NGN, or GHS). You can view the balance on your dashboard and withdraw manually via [`POST /payments/withdraw/bank/{id}`](/api-reference/withdrawals/withdrawal-ngn-|-ghs) when ready.
    * **With per-address auto-settlement**: each deposit is automatically paid out to the bank account linked to that specific address. Enable it via the API. See the [auto-settlement guide](/auto-settlement).
    * **With business-wide auto-settlement**: all deposits across all addresses are automatically withdrawn to a single destination (bank account). Enable it from your dashboard under **Settings > Automatic Settlement**.

    You can set your preferred holding currency from the dashboard under **Settings > Crypto Settings**.
  </Step>
</Steps>

## Generate a deposit address

```bash theme={null}
curl -X POST "https://api.breet.io/v1/trades/sell/assets/ASSET_ID/generate-address" \
  -H "x-app-id: YOUR_APP_ID" \
  -H "x-app-secret: YOUR_APP_SECRET" \
  -H "X-Breet-Env: production" \
  -H "Content-Type: application/json" \
  -d '{
    "label": "user-9201",
    "bankId": "BANK_ID",
    "accountNumber": "0123456789",
    "narration": "Crypto off-ramp"
  }'
```

Replace `ASSET_ID` with a valid asset ID from the [Fetch Deposit Assets](/api-reference/assets/fetch-deposit-assets) endpoint. The `bankId` comes from [`GET /payments/banks`](/api-reference/banks/fetch-bank-list). When bank details are included, the wallet is ready for [auto-settlement](/auto-settlement) once you enable it.

<Tip>
  Pass bank details during address generation so you can enable auto-settlement immediately. See the [auto-settlement guide](/auto-settlement) for the full setup.
</Tip>

## Withdraw manually (without auto-settlement)

If you prefer to control when payouts happen, skip auto-settlement and initiate withdrawals yourself:

```bash theme={null}
curl -X POST "https://api.breet.io/v1/payments/withdraw/bank/BANK_ACCOUNT_ID" \
  -H "x-app-id: YOUR_APP_ID" \
  -H "x-app-secret: YOUR_APP_SECRET" \
  -H "X-Breet-Env: production" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 100,
    "narration": "Off-ramp payout"
  }'
```

The `amount` is in USD. Breet converts it to the local currency (NGN or GHS) based on the destination account's country.

## What Breet handles

* Generating deposit wallet addresses per user
* Monitoring blockchains for incoming transactions
* Converting crypto to fiat at current market rates
* Settling to bank accounts in NGN or GHS (via auto-settlement or manual withdrawal)
* Sending [webhook](/webhooks) notifications for every deposit and withdrawal status change

## What you handle

* Collecting the user's bank account details
* Displaying the deposit address and instructions in your app
* Listening for and processing webhook events
* Mapping deposits to users using the `label` or `destinationAddress`
* Communicating conversion status and payout confirmations to users
* Deciding whether to use auto-settlement or trigger withdrawals manually

## Example user journey

1. Emeka opens your app and selects **Cash out crypto**.
2. He chooses to sell USDT and enters the amount.
3. If this is Emeka's first off-ramp, your app calls Breet's [generate-address](/api-reference/crypto-wallet/generate-wallet-address) endpoint with his user ID as the label and his linked bank details, then stores the returned address. For future off-ramps, the app reuses the same address since it is permanent.
4. The app displays the USDT deposit address.
5. Emeka sends 200 USDT from his exchange account.
6. Breet detects the deposit and sends a `trade.completed` webhook to your server.
7. With auto-settlement enabled, Breet converts the USDT to NGN and pays out to Emeka's bank account.
8. Emeka receives the NGN in his bank and your app shows a confirmation.

## FAQ

<AccordionGroup>
  <Accordion title="Which cryptocurrencies can users off-ramp?">
    Any asset Breet supports for your integration. See the full list on the [supported assets](/supported-assets) page, or call [`GET /trades/assets`](/api-reference/assets/fetch-deposit-assets) to get the current list for your account.
  </Accordion>

  <Accordion title="Which countries are supported for bank payouts?">
    Breet currently supports bank payouts in **Nigeria (NGN)** and **Ghana (GHS)**.
  </Accordion>

  <Accordion title="Can users choose between auto-settlement and manual withdrawal?">
    That's up to your app's design. You can enable [auto-settlement](/auto-settlement) per address so payouts happen automatically, or hold funds in the wallet and let users trigger a withdrawal when they're ready. You can also offer both options.
  </Accordion>

  <Accordion title="What exchange rate is used for conversion?">
    Breet uses the current market rate at the time the deposit is confirmed. The converted amount appears in the webhook payload. If auto-settlement is enabled, the `rate` field shows the exact rate used.
  </Accordion>

  <Accordion title="How fast are bank payouts?">
    With auto-settlement, bank payouts typically complete the same business day after the blockchain transaction is confirmed. Confirmation times depend on the network: stablecoins on Solana or Tron confirm in seconds, while Bitcoin may take longer.
  </Accordion>

  <Accordion title="Can I add a markup on the conversion?">
    Yes. You can set a markup percentage (0-10%) via the API or from your dashboard. The markup is deducted from each settlement as your revenue margin. See the [auto-settlement guide](/auto-settlement) for details.
  </Accordion>
</AccordionGroup>
