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.
Outgoing delivery logs & manual resend: To list stored deliveries, view attempt history for one event, or trigger a one-off resend by trade/withdrawal reference, use the Webhooks group in the API reference tab (endpoints under /transactions/webhooks). This guide covers incoming payloads and verification on your server.

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 below the asset’s minimum deposit amount. Funds are held and not credited. See how flagged deposits are resolved.

Payload example

{
  "id": "692f91aa729255932afe9078",
  "asset": "SOL_TEST",
  "feePercentage": 1.5,
  "feeAmountInUsd": 0.32,
  "rate": 1600,
  "conversionRate": 1
  "cryptoAmount": 0.00025406,
  "amountInUSD": 21.379427842514175,
  "flagFeeUSD": 0,
  "vaultId": "121",
  "senderAddress": "bc1qf43tdrym26qlz8rg06f88wg35n27uhcf29zs4f",
  "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.
ratenumberThe NGN per USD rate.
conversionRatenumberThe NGN to GHS rate applied for GHS transactions, always 1 for NGN.
senderAddressstringWallet address of the sender.
destinationAddressstringWallet address receiving the funds.
destinationDescriptionstringOptional description for the recipient.
txHashstringBlockchain transaction hash.
statusstringTransaction status (pending, completed, flagged).
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.
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.

Address creation webhook

This webhook fires as a fallback when a wallet address is successfully generated. It confirms the address is live and ready to receive deposits.
EventDescription
trade.address.createdA wallet address has been generated and is ready to receive deposits. Sent as a fallback alongside the API response.

Payload example

{
  "event": "trade.address.created",
  "id": "6a1e1281ab08f50ad3127259",
  "address": "TB3yDFJXFKM2BySqhCPgyRuSzVkSR2CVam",
  "asset": "TRX_TEST",
  "label": "unique-ref"
}

Payload fields

FieldTypeDescription
eventstringAlways trade.address.created.
idstringUnique identifier for the generated address record.
addressstringThe wallet address that was created.
assetstringThe asset identifier the address was generated for (e.g., TRX_TEST).
labelstringThe label passed when the address was generated.

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.
payoutAmountnumberThe actual fiat amount paid out (after markup deduction for business).
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.

Resending webhooks

If your server missed a webhook or you need to replay events for debugging, Breet lets you inspect delivery history and trigger manual resends. All outgoing webhook events are persisted for 7 days. You can resend webhooks in two ways:
  • From the dashboard — Go to Settings → For Developer → Webhook Logs to view all outgoing events, inspect delivery statuses, and resend any event with a single click.
  • Via the API — Use the endpoints below to programmatically list, inspect, and resend webhook events.
The API endpoints below require an active integration with API access (VIP partners). For full request/response schemas, see the Webhooks API reference.

List delivery history

Retrieve a paginated list of all outgoing webhook events sent to your endpoint.
GET /transactions/webhooks
You can filter results using optional query parameters:
ParameterTypeDescription
pagenumberPage number for pagination.
referencestringFilter by a specific trade or withdrawal ID.
statusstringFilter by delivery outcome: delivered or failed.
eventNamestringFilter by event type (e.g., trade.completed, withdrawal.pending).

View a single event

Fetch full details for a specific webhook event, including every delivery attempt with timestamps and HTTP status codes.
GET /transactions/webhooks/{id}
The response includes the attempts array, which records each delivery try with the response status code and timestamp — useful for diagnosing endpoint failures.

Resend by reference

Trigger an immediate redelivery of all webhook events associated with a given trade or withdrawal reference.
POST /transactions/webhooks/resend/{reference}
The reference is the trade or withdrawal document ID (the same value as id in your webhook payloads). The response returns the result of each resend attempt:
{
  "success": true,
  "message": "webhook resend attempted",
  "data": [
    {
      "id": "67a1b2c3d4e5f67890123456",
      "status": "delivered"
    },
    {
      "id": "67a1b2c3d4e5f67890123457",
      "status": "failed",
      "error": "webhook delivery failed"
    }
  ]
}

When to resend

  • Your server was down during the original delivery and all automatic retries have been exhausted.
  • You deployed a bug fix and need to replay events that previously failed processing.
  • You want to verify your webhook handler is working correctly in a staging environment.
Resent webhooks contain the same payload as the original event. Make sure your processing logic is idempotent — use the id and event fields to detect duplicates and avoid processing the same event twice.