Deposit states
trade.pending, trade.completed, trade.flagged, or trade.deleted.
Happy path
You generate a deposit address
POST /trades/sell/assets/{id}/generate-address once per asset per user. Addresses are permanent and reusable — no need to generate a fresh one per deposit.Your customer sends crypto
Breet detects the transaction
trade.pending with confirmations: 0, the txHash, and the amount.Breet waits for confirmations
trade.completed or trade.flagged as your source of truth. trade.pending may fire multiple times as confirmations increments.Breet checks the amount
GET /trades/assets).Meets the minimum → completed. Below the minimum → flagged.Breet credits your wallet
completed, Breet converts the USD value to your receive currency (USD, NGN, or GHS), deducts the platform fee (feeAmountInUsd), and credits your balance. trade.completed fires with the final amounts.If auto-settlement is enabled on the address, Breet also pays the net amount to the linked bank account. See Auto-settlement for the explanation.Webhook sequence, by scenario
What happens when a deposit is flagged
A flagged deposit is held, not lost. Example: your customer sends $3 of USDT on Tron, minimum is $10. The deposit sits inflagged until one of three things happens:
-
Customer tops up. Any later deposit to the same address in the same asset combines with outstanding flagged deposits at that address. The moment the combined USD total crosses the minimum, every flagged deposit flips to
completedin one batch — one credit, onetrade.completedper deposit, each carryingsettledTradeswith theidof every deposit in the batch. No fee applied. Thetrade.flaggedpayload carriesbalanceRemaining— how much more, in USD, has to land on that address to clear the minimum — so you can tell your customer the exact top-up amount. It already nets off every outstanding flagged deposit at that address, so each later below-minimum deposit fires its owntrade.flaggedcarrying a smallerbalanceRemaining. -
You pay a resolution fee. From your dashboard, or over the API. Breet deducts the resolution fee from the USD value of the crypto that was actually received, credits the remainder to your wallet immediately, and fires
trade.completedwith theflagFeeUSDfield populated so your system knows a fee was applied. From the dashboard: log in to partners.breet.io, open the flagged transaction, click Pay Resolution Fee, and confirm. Over the API: see Resolving a flagged deposit via the API below. -
You’ve turned on auto-resolution. When trade auto-resolution is enabled on your integration, Breet handles step 2 automatically the moment a deposit is flagged — it deducts the resolution fee from the USD value of the crypto that was actually received, credits the remainder to your wallet, and fires
trade.completedwithflagFeeUSDpopulated. No dashboard action, no waiting on the customer. Turn this on from the Business tab on the Developer page in your dashboard, or withPUT /users/auto-resolution/enable.
Resolving a flagged deposit via the API
POST /trades/sells/sell/{id}/complete does from your backend exactly what Pay Resolution Fee does from the dashboard. Use it when you want to decide per deposit rather than switching auto-resolution on for every one.
Catch the trade.flagged webhook
id on the payload is the deposit ID you pass to the endpoint.Check that the deposit is resolvable by fee
GET /trades/transactions/{id}: status is flagged and passAMLCheck is true. A deposit flagged by an AML check is not eligible — contact support for those.Work out what your customer nets
flagFeeUSD, returned by GET /trades/assets. Breet deducts it from amountReceived (the USD value actually received), so the credit is based on amountReceived - flagFeeUSD. That remainder must be greater than $1 — below that, the call returns 400 and a top-up is the only route.Call the endpoint
Settle on the webhook, not the response
trade.completed fires for the deposit with flagFeeUSD populated. Treat that event as your source of truth, exactly as you do on the happy path. If auto-settlement is enabled on the address, the net amount also pays out to the linked bank account and you’ll get the withdrawal.* events.Edge cases
Wrong asset
If a customer sends a different asset to one of your addresses (e.g. they send ETH to a USDT address), recovery is automatic — no support ticket needed. This applies only if the received asset is one of our supported assets. What happens behind the scenes:- We detect the asset mismatch.
- A new address is generated on your integration for the asset that actually arrived. The original wallet’s bank account and auto-settlement configurations are carried over.
- The deposit processes as a normal trade on the new wallet.
trade.address.created— new address payload withid,address,asset,label, andcreatedAt.- An email from us confirming the mismatch and recovery. No action needed on your end.
trade.pending→trade.completed— standard trade lifecycle on the new wallet. Thetrade.pendingpayload includesisWrongAssetDeposit: trueso you can identify this as a wrong-asset recovery.- If auto-settlement was on:
withdrawal.pending→withdrawal.processing→withdrawal.completed. Funds settle to the bank account from the original wallet. - If auto-settlement was off: funds credit your dashboard balance. Resolve with your user from there as you normally would.
USD value and timing
amountInUSD is recalculated on each webhook, not locked at detection. The value on trade.completed is authoritative — use it for accounting. Local-currency conversion uses the rate at completion time.
Chain reorganisations
Rare on supported networks. If a pending deposit is orphaned before it confirms, the deposit moves todeleted and fires trade.deleted — always before trade.completed could fire. Nothing is credited.
Fetching deposits via the API
Rather than relying only on webhooks, you can inspect deposits directly:FAQ
How long can a deposit stay pending?
How long can a deposit stay pending?
txHash.Should I use one address for multiple customers?
Should I use one address for multiple customers?
label field. When a deposit webhook fires, destinationAddress and destinationDescription (the label) tell you exactly who paid.Addresses are permanent and reusable, so you generate a customer’s address once, store it, and reuse it for all their future deposits.Does Breet charge a network/gas fee on deposits?
Does Breet charge a network/gas fee on deposits?
feeAmountInUsd).What's the difference between feeAmountInUsd and flagFeeUSD?
What's the difference between feeAmountInUsd and flagFeeUSD?
feeAmountInUsd is the platform fee on a normal completed deposit. flagFeeUSD is the resolution fee applied when you pay to release a flagged below-minimum deposit — from your dashboard, over the API, or automatically through auto-resolution. On the happy path, flagFeeUSD is 0.Can I resolve a flagged deposit without the dashboard?
Can I resolve a flagged deposit without the dashboard?
POST /trades/sells/sell/{id}/complete to pay the resolution fee for one deposit, or turn on auto-resolution with PUT /users/auto-resolution/enable to have every below-minimum deposit resolved the moment it’s flagged. See Resolving a flagged deposit via the API.Next steps
- Move funds out of your wallet → Withdrawals
- Set up webhook handling → Webhooks
- Settle deposits automatically → Auto-settlement
- See supported assets and minimums → Supported assets
- Simulate a deposit on testnet → Testing