Skip to main content
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.

How it works

1

Generate a deposit address

Call the generate-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.
2

User sends crypto

Display the wallet address in your app. The user sends BTC, ETH, USDT, or any other supported asset from their personal wallet or exchange.
3

Breet confirms the deposit

Breet detects the on-chain transaction and sends a webhook to your server with the deposit amount, asset, and status.
4

Crypto is converted

The deposit is automatically converted to your chosen wallet currency (USD, NGN, or GHS) at the current market rate.
5

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} 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.
  • With business-wide auto-settlement: all deposits across all addresses are automatically withdrawn to a single destination (bank account or stablecoin address). Enable it from your dashboard under Settings > Automatic Settlement.
You can set your preferred holding currency from the dashboard under Settings > Crypto Settings.

Generate a deposit address

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 assets endpoint. The bankId comes from GET /payments/banks. When bank details are included, the wallet is ready for auto-settlement once you enable it.
Pass bank details during address generation so you can enable auto-settlement immediately. See the auto-settlement guide for the full setup.

Withdraw manually (without auto-settlement)

If you prefer to control when payouts happen, skip auto-settlement and initiate withdrawals yourself:
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 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 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

Any asset Breet supports for your integration. See the full list on the supported assets page, or call GET /trades/assets to get the current list for your account.
Breet currently supports bank payouts in Nigeria (NGN) and Ghana (GHS).
That’s up to your app’s design. You can enable 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.
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 settlementRate field shows the exact rate used.
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.
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 for details.