Deposit states
| State | What it means |
|---|---|
pending | Detected on-chain, waiting for confirmations. Nothing has been credited. |
completed | Fully confirmed, checks passed, wallet credited (and settled if auto-settlement is on). |
flagged | Confirmed on-chain but below the asset’s minimum deposit amount. Funds are held, not credited. |
trade.pending, trade.completed, or trade.flagged.
Happy path
You generate a deposit address
Call
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.Breet detects the transaction
When the transaction appears on-chain, Breet creates a deposit record and fires
trade.pending with confirmations: 0, the txHash, and the amount.Breet waits for confirmations
Confirmations required are configured per asset — don’t hardcode them. Treat
trade.completed or trade.flagged as your source of truth. trade.pending may fire multiple times as confirmations increments.Breet checks the amount
On the final confirmation, Breet checks that the deposit’s USD value meets the asset’s minimum (see thresholds or call
GET /trades/assets).Meets the minimum → completed. Below the minimum → flagged.Breet credits your wallet
On
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
| Scenario | Events (same id) |
|---|---|
| Clean deposit | trade.pending → trade.completed |
| Slow confirmations | trade.pending (×N as confirmations increments) → trade.completed |
| Below minimum | trade.pending → trade.flagged |
| Flagged → later resolved | trade.flagged → trade.completed |
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 $20. The deposit sits inflagged until one of two 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. No fee applied. -
You pay a resolution fee from your dashboard. Log in to partners.breet.io, open the flagged transaction, click Pay Resolution Fee, and confirm. 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.
Edge cases
Wrong asset or wrong network
If a customer sends a different asset to one of your addresses (e.g. USDT-BSC to a USDT-Tron address), it is not auto-credited. Contact support with thetxHash — recovery is manual and not guaranteed.
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 settlementRate at completion time.
Chain reorganisations
Rare on supported networks. If a pending deposit is orphaned before it confirms, the deposit moves to a non-credited terminal state — always beforetrade.completed could fire.
Fetching deposits via the API
Rather than relying only on webhooks, you can inspect deposits directly:| Purpose | Endpoint |
|---|---|
| List deposits | GET /trades/transactions |
| Fetch one by ID | GET /trades/transactions/{id} |
| List your wallet addresses | GET /trades/wallets |
FAQ
How long can a deposit stay pending?
How long can a deposit stay pending?
Seconds/Minutes on Solana/Tron/TON; up to an hour on slow chains. If a deposit is pending for more than 6 hours, contact support with the
txHash.Should I use one address for multiple customers?
Should I use one address for multiple customers?
No. Generate a separate address per customer (or per order) and pass their ID in the
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?
No. Your customer pays their own on-chain fee. Breet’s only charge on a deposit is the platform fee (
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. On the happy path, flagFeeUSD is 0.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