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

> Turn your business balance into outbound crypto payments. Fund your account with crypto or Naira, then send stablecoin payouts to any wallet address worldwide.

Built for businesses moving stablecoins to customers and partners: fintechs whose users withdraw or buy stablecoins, marketplaces settling vendors, platforms paying creators and contractors, betting platforms paying winnings, and businesses paying overseas suppliers.

## How it works

<Steps>
  <Step title="Fund your USD balance">
    Your USD balance funds your crypto payouts. There are two ways to build it up:

    * **Crypto deposits.** Generate a deposit address from your dashboard, or over the API with [`POST /trades/sell/assets/{id}/generate-address`](/api-reference/crypto-wallet/generate-wallet-address).
    * **Naira transfers** to the virtual account on your dashboard, converted with [`POST /payments/fiat-to-usd`](/api-reference/conversion/convert-fiat-to-usd).

    <Note>
      Virtual account funding is currently available in Naira only. Businesses in other countries can fund with crypto.
    </Note>
  </Step>

  <Step title="Add payout details">
    Collect each recipient's wallet address, the token they want (USDT or USDC), and its network (ERC20, TRC20, BASE, BSC, SOL, or TON).

    Store these against the recipient in your own system, the same way you would store a bank account. Breet does not hold your recipient list; you pass the wallet details on each payout call, which means you can pay an unlimited number of recipients without registering any of them in advance.
  </Step>

  <Step title="Initiate the payout">
    Call [`POST /payments/withdraw/address`](/api-reference/withdrawals/withdraw-stable-coins) with the amount in USD, the recipient's wallet address, the token, the network, your transaction PIN, and your own reference in `externalId`.

    Breet debits your USD balance, converts to the stablecoin, and broadcasts the transaction on-chain.
  </Step>

  <Step title="Track payout status via webhooks">
    Every payout moves through a lifecycle, and Breet notifies you at each stage: `withdrawal.pending`, `withdrawal.completed`, `withdrawal.reversed`, or `withdrawal.rejected`.
  </Step>
</Steps>

<Info>
  The network fee is deducted from the amount you request, not added on top. If you request a \$100 payout on a network with a \$1 fee, your balance is debited \$100 and the recipient receives \$99. Check current fees with [`GET /payments/supported-assets-info`](/api-reference/assets/fetch-withdrawal-assets) before you send.
</Info>

## Send a payout to a wallet address

```bash theme={null}
curl -X POST "https://api.breet.io/v1/payments/withdraw/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 '{
    "amount": 250,
    "pin": "YOUR_PIN",
    "walletAddress": "TXn8k2p9Rw4mQvL7yYc3sZ1bH6dJfE5aGx",
    "token": "USDT",
    "network": "TRC20",
    "externalId": "payout-vendor-4471"
  }'
```

A successful call returns the payout ID, which you can use with [`GET /payments/withdrawal/{id}`](/api-reference/withdrawals/fetch-withdrawal-by-id) at any time:

```json theme={null}
{
  "message": "withdrawal initiated successfully",
  "success": true,
  "data": {
    "id": "697251ed397a53d0cb7b228b"
  }
}
```

## What Breet handles

* Converting your crypto or Naira balance into USD
* Converting USD into the stablecoin your recipient asked for
* Broadcasting the transaction on the network you specified
* Debiting your balance, and refunding it in full if a payout is reversed or rejected
* Delivering webhooks at every stage of the payout lifecycle
* Making the transaction hash and explorer link available once the payout confirms

## What you handle

* Keeping your balance funded ahead of a payout run
* Collecting and storing each recipient's wallet address, token, and network
* Validating that the address matches the network before you send
* Deciding when a payout is owed and triggering the withdrawal call
* Listening for webhooks and updating your own records
* Passing a unique `externalId` on every payout so you never send the same one twice
* Telling your recipients when their money is on the way and when it lands

## Example user journey

A Nigerian fintech funds its Breet balance using its Breet wallet address or assigned virtual account number.

1. The fintech converts its NGN balance to USD from the Breet dashboard.
2. Throughout the day, users request stablecoin withdrawals from their wallets on the app.
3. For each request, the backend calls [`POST /payments/withdraw/address`](/api-reference/withdrawals/withdraw-stable-coins) straight away, with the user's wallet address, the amount, the token, the network, and an `externalId` matching the request.
4. Breet debits the USD balance and sends each payout on-chain. Requests that come in at the same time are processed side by side, so no user waits behind another.
5. Breet sends a `withdrawal.pending` webhook for each payout, then `withdrawal.completed` with a transaction hash once it confirms.
6. Each request is marked as paid, and the fintech notifies its user.

## FAQ

<AccordionGroup>
  <Accordion title="Is there a limit on payout volume?">
    Your available balance is the limit. There is no cap on how many payouts you send, or how often, and each request is processed independently so high-volume runs are not queued behind one another.
  </Accordion>

  <Accordion title="How do I fund my balance?">
    Deposit crypto to a Breet address, generated from your dashboard or over the API. You can also fund in Naira through the virtual account on your dashboard, then convert that balance with [`POST /payments/fiat-to-usd`](/api-reference/conversion/convert-fiat-to-usd).
  </Accordion>

  <Accordion title="Which tokens and networks can I pay out in?">
    USDT and USDC across ERC20, TRC20, BSC, SOL, BASE, and TON. Call [`GET /payments/supported-assets-info`](/api-reference/assets/fetch-withdrawal-assets) for the current list along with the fee on each network.
  </Accordion>

  <Accordion title="What happens if a payout fails?">
    You are refunded in full. A payout that fails an internal check before broadcast comes back as `withdrawal.rejected`; one that is broadcast unsuccessfully comes back as `withdrawal.reversed`. In both cases the debited amount, including the fee, returns to your balance.
  </Accordion>

  <Accordion title="Can I cancel a payout after sending it?">
    No. Once a payout is initiated, it cannot be cancelled through the API, because the transaction may already be broadcasting. Validate the address and amount before you call.
  </Accordion>

  <Accordion title="How fast do payouts arrive?">
    Payouts are near-instant in most cases. Speed depends on the network; Solana and Tron confirm almost immediately, while Ethereum can take longer when the network is congested.
  </Accordion>
</AccordionGroup>
