Skip to main content
Breet sends webhook notifications to your server whenever important events occur, such as incoming crypto deposits or withdrawal status changes. Your application can listen for these events and respond accordingly.

Crypto wallet deposit webhooks

These webhooks fire whenever a wallet address receives crypto assets. You will receive events for the following transaction states:
EventDescription
trade.pendingAn incoming crypto transaction has been detected on the blockchain but has not yet been fully confirmed or processed.
trade.completedThe transaction is fully confirmed, has passed all checks, and your account has been credited.
trade.flaggedThe transaction is confirmed on-chain but failed a check: below the asset minimum, failed AML screening, or flagged as a possible duplicate. Funds are held and not credited.

Payload example

{
  "id": "692f91aa729255932afe9078",
  "asset": "SOL_TEST",
  "feePercentage": 1.5,
  "feeAmountInUsd": 0.32,
  "cryptoAmount": 0.00025406,
  "amountInUSD": 21.379427842514175,
  "flagFeeUSD": 0,
  "vaultId": "121",
  "destinationAddress": "6DKYpZfd86BUDTjPe4E3JEGwnYW99KU3NDazk7BjpN8V",
  "destinationDescription": "Partner_testingizzy",
  "txHash": "aa801188ukdjfhdbf3771dfdf86388b8b694a2ac0226748346y34kbc3",
  "status": "completed",
  "confirmations": 3,
  "note": "",
  "event": "trade.completed",
  "createdAt": 1764614655493,
  "updatedAt": 1764616198265,
  "index": 19,
  "blockInfo": {
    "blockHeight": "926040",
    "blockHash": "0000000000000000000158f293cda641e08a144673dc03814b187e8db758c929"
  }
}

Payload fields

FieldTypeDescription
idstringUnique identifier for the transaction.
assetstringThe crypto asset involved (e.g., ETH, BTC).
feePercentagenumberBreet’s platform fee rate applied to the trade, expressed as a percentage (e.g., 0.5 means 0.5%).
feeAmountInUsdnumberThe platform fee amount in USD, calculated as (feePercentage / 100) x amountInUSD.
cryptoAmountnumberAmount of crypto transferred.
amountInUSDnumberValue of the transaction in USD.
flagFeeUSDnumberFee applied for trades below minimum asset requirement. Initially 0, may be updated later.
vaultIdstringID of the vault handling the transaction.
destinationAddressstringWallet address receiving the funds.
destinationDescriptionstringOptional description for the recipient.
txHashstringBlockchain transaction hash.
statusstringTransaction status (pending, completed, failed).
confirmationsnumberNumber of blockchain confirmations.
notestringOptional note associated with the transaction.
eventstringWebhook event type (trade.completed, trade.pending, trade.flagged).
createdAttimestampTransaction creation timestamp (milliseconds).
updatedAttimestampLast update timestamp (milliseconds).
indexnumberInternal index for ordering transactions.
blockInfo.blockHeightstringBlock height in the blockchain.
blockInfo.blockHashstringHash of the block containing this transaction.

Auto-settlement fields

When a bank account is linked to a wallet address and auto-settlement is enabled, the webhook payload includes additional fields. For a full explanation of how auto-settlement works, see the Auto-settlement guide.
FieldTypeDescription
markupPercentnumberThe percentage markup configured on your integration (e.g. 2.5, optionally set by you).
markupAmountnumberThe absolute amount deducted as markup from the converted local currency amount.
amountSettlednumberThe final amount paid out to the linked bank account, after markup deduction.
settlementRatenumberThe exchange rate used to convert USD to the base local currency (NGN).
settlementConversionRatenumberThe conversion rate applied when settling in a secondary currency (e.g. NGN to GHS). For Nigerian accounts this is 1.
If a markup percentage is set, it is deducted from the transaction amount before the final payout is calculated. For example, if a trade amount is 1,000 USD and a 5% markup is applied, 50 USD is deducted and the settlement is calculated based on 950 USD.

Behavior notes

  • The webhook may send multiple events for the same transaction as its status changes. For example, a transaction may first trigger trade.pending, then later trade.completed.
  • The confirmations field indicates how many blockchain confirmations the transaction has received. This is especially important for trade.completed events.
  • For auto-settlement trades, withdrawal events are also sent and the related trade ID is included in the notification response.

Fiat/Crypto withdrawal webhooks

These webhooks fire whenever a withdrawal is created or when its status changes.
EventDescription
withdrawal.pendingThe withdrawal request has been received and is being processed.
withdrawal.completedThe withdrawal has been successfully processed and paid out.
withdrawal.reversedThe withdrawal was sent to the payment provider but the provider returned a failure. Funds are refunded to your wallet.
withdrawal.rejectedThe withdrawal was rejected during internal review before being sent to a payment provider. Funds are refunded to your wallet.

Payload example

{
  "id": "6968ed1398fea49e805363bb",
  "event": "withdrawal.pending",
  "amount": 1000,
  "originalAmount": 1000,
  "currency": "usd",
  "status": "pending",
  "txHash": "0x123abcdef",
  "reference": "6968ed1398fea49e805363bb",
  "fee": 10,
  "meta": {
    "walletAddress": "14grJpemFaf88c8tiVb77W7TYg2W3ir6pfkKz3YjhhZ5",
    "network": "SOL",
    "token": "USDT",
    "symbol": "USDT",
    "avatar": "https://assets.breet.io/token-network-assets/USDT_SOL.png",
    "label": "",
    "txLink": "https://solscan.io/tx/"
  },
  "reason": "",
  "createdAt": "2026-01-15T13:35:15.967Z",
  "updatedAt": "2026-01-15T13:35:15.967Z"
}

Payload fields

FieldTypeDescription
idstringUnique identifier for the withdrawal request.
eventstringWebhook event type (withdrawal.pending, withdrawal.completed, withdrawal.reversed, withdrawal.rejected).
txHashstringBlockchain transaction hash (only present on completed transactions).
amountnumberNet amount to be withdrawn after fees.
originalAmountnumberOriginal withdrawal amount before fees were applied.
currencystringCurrency of the withdrawal (e.g., usd).
statusstringCurrent withdrawal status (pending, completed, reversed, rejected).
referencestringUnique reference for the withdrawal. Always the same value as id. We recommend using id instead.
tradestringTrade ID (if withdrawal was initiated from a trade).
feenumberFee charged for processing the withdrawal.
metaobjectAdditional metadata related to the withdrawal destination.
meta.typestringWithdrawal destination type (e.g., nuban, crypto).
meta.bankIdstringBank identifier for NUBAN withdrawals.
meta.bankNamestringName of the destination bank.
meta.accountNamestringVerified bank account holder name.
meta.accountstringInternal account reference ID.
meta.accountNumberstringBank account number (NUBAN).
meta.autoSettlementbooleanWhether the withdrawal is processed automatically.
meta.narrationstringTransfer narration or description shown on bank statement.
meta.feenumberWithdrawal fee charged for the transaction.
meta.walletAddressstringDestination wallet address for crypto withdrawals.
meta.networkstringBlockchain network used for the withdrawal (e.g., SOL).
meta.tokenstringToken being withdrawn (e.g., USDT).
meta.symbolstringToken symbol.
meta.avatarstringURL to the token or network asset icon.
meta.labelstringOptional label or description for the withdrawal destination.
meta.txLinkstringBase URL for viewing the transaction on a blockchain explorer.
reasonstringReason for rejection or reversal (empty if not applicable).
createdAtstring (ISO 8601)Timestamp when the withdrawal was created.
updatedAtstring (ISO 8601)Timestamp of the most recent status update.

Behavior notes

  • A single withdrawal may trigger multiple webhook events as its status progresses.
  • withdrawal.pending is always sent first.
  • txHash will not be present until the withdrawal is completed.
  • Always rely on the event and status fields to determine the current state of a withdrawal.

Webhook verification

To ensure the security and authenticity of incoming webhook notifications, Breet provides multiple layers of verification.

IP whitelisting

All webhook requests originate from Breet’s secure servers. Verify that incoming requests come from one of the following IP addresses:
46.101.201.155
46.101.225.109
46.101.225.97
46.101.225.251
159.89.20.62
Requests from any other IP addresses should be considered untrusted and ignored.

Webhook secret

Each webhook endpoint is configured with a webhook secret, visible in your dashboard (Go to Settings → For Developer) under the Webhook Verification Secret Key. The secret is included in every webhook request as a header:
x-webhook-secret: <your-webhook-secret>
To verify a webhook request:
  1. Retrieve the x-webhook-secret header from the incoming request.
  2. Compare it against the secret configured in your dashboard.
  3. Only process the request if the secrets match.
Keep your webhook secret secure. Do not expose it in public repositories, client-side code, or logs.
  1. Check the request IP against the allowed Breet IPs.
  2. Validate the x-webhook-secret header against the configured secret.
  3. Only process the payload if both checks pass.
  4. As an extra check, call Fetch Transaction by ID or Fetch Withdrawal by ID to confirm the transaction exists on Breet before taking any action.

Webhook retries

If your server does not respond with a successful 2xx status code, Breet automatically retries delivering the webhook using an exponential backoff schedule:
AttemptDelay
1st retry1 minute
2nd retry5 minutes
3rd retry1 hour
4th retry4 hours
5th retry8 hours
6th retry12 hours
7th retry24 hours
After the final retry (24 hours), the webhook attempt is marked as permanently failed.

Retry conditions

Retries occur when:
  • Your webhook endpoint returns any non-2xx HTTP status code (including 3xx, 4xx, or 5xx).
  • Your webhook endpoint times out.
  • Your server is unreachable.
Breet does not retry events where your server returns 2xx, even if the response body contains an error.

Best practices

  • Return a 2xx status code as soon as your server receives and accepts the webhook.
  • Handle duplicate deliveries. Breet may deliver the same event more than once during retries. Use the id and event fields together to detect duplicates and ensure your processing logic is idempotent.
  • Log all received events and failures to aid debugging.