Webhook events and payloads

Reference for Blaaiz webhook event types and common payload structure

Use this page to quickly see which events Blaaiz emits and what every webhook payload contains.

Event types

Your business has three webhook URLs: collection_url, payout_url, and kyc_url. The table below shows every event and which URL it is delivered to.

EventDescriptionDelivered toGuide
collection.initiatedCollection request createdcollection_urlCollection
collection.pendingAwaiting customer paymentcollection_urlCollection
collection.completedPayment received successfullycollection_urlCollection
collection.failedPayment failedcollection_urlCollection
collection.expiredInterac money request expired before the payer approved itcollection_urlCollection
auto_deposit_email.activeInterac auto-deposit registration activatedcollection_url, with payout_url fallbackInterac auto-deposit email
auto_deposit_email.blockedInterac auto-deposit registration blocked or an active registration removedcollection_url, with payout_url fallbackInterac auto-deposit email
refund_initiatedRefund of a collection to source startedcollection_urlRefund
refundRefund of a collection to source succeeded or failed (see status)collection_urlRefund
payout.initiatedPayout has been createdpayout_urlPayout
payout.processingPayout is being processedpayout_urlPayout
payout.completedPayout completed successfullypayout_urlPayout
payout.failedPayout failedpayout_urlPayout
crypto.payout.processingCrypto payout accepted for processingpayout_urlCrypto API
crypto.payout.successfulCrypto payout completed successfullypayout_urlCrypto API
crypto.payout.failedCrypto payout reached a final failed statepayout_urlCrypto API
crypto.deposit.successfulCrypto deposit credited to a business crypto wallet. The payload identifies the customer when a customer wallet address is funded.collection_urlCrypto API
customer.status_changedCustomer's verification_status transitioned. The single event covers all customer-level transitions for both KYC (individual) and KYB (business): inspect old_status and new_status on the payload to know which way it moved. The legacy event labels customer.verified and customer.rejected are still mentioned in this guide for clarity, but the wire event_type value is always customer.status_changed.collection_urlCustomer
virtual_account.createdVirtual account createdcollection_urlVirtual account
virtual_account.readyVirtual account ready to receive fundscollection_urlVirtual account
virtual_account.rejectedVirtual account verification rejectedcollection_urlVirtual account
virtual_account.failedVirtual account creation failedcollection_urlVirtual account
virtual_account.creditedFunds received in virtual accountcollection_urlVirtual account
merchant.kyc.session.completedA Signa verification session finished review. data.result is APPROVED or REJECTEDkyc_urlSigna
merchant.kyc.session.expiredA Signa verification session passed its deadline before it completedkyc_urlSigna

Payout and crypto payout events use your payout_url. Signa events use your kyc_url. Interac auto-deposit registration events use collection_url, or payout_url when collection_url is null. Crypto deposit events and the other listed events use collection_url.

Signa events use their own payload shape and their own retry schedule. See Signa webhooks.

Interac auto-deposit registration events use a flat payload with type, email, status, message, and event_id. See registration status webhooks for the exact payload.

Payload structure

Fiat and collection webhook payloads include:

  • event — The event type
  • data — The event data object
  • timestamp — When the event occurred
  • signature — HMAC signature for verification (header: x-blaaiz-signature)

Always verify the x-blaaiz-signature using your webhook signing_secret to ensure the webhook originates from Blaaiz.

Crypto payout payload

Crypto payout webhooks use a flat JSON object. They do not use the data wrapper from other webhook events.

{
  "event": "crypto.payout.successful",
  "transaction_id": "crypto-transaction-id",
  "transaction_reference": "CRYPTO-REF",
  "transaction_status": "SUCCESSFUL",
  "wallet_id": "crypto-wallet-id",
  "currency": "USDC",
  "amount": "100.000000",
  "network": "ETHEREUM_MAINNET",
  "token": "USDC",
  "address": "0x742d35Cc6634C0532925a3b844Bc9e7595f6E123",
  "transaction_hash": "0xabc123",
  "event_id": "webhook-log-id",
  "type": "crypto.payout.successful"
}

The crypto.payout.failed event includes failure_reason. Blaaiz sends this event only for a final failed state.

Crypto deposit payload

Crypto deposit webhooks use the same flat JSON structure. Blaaiz sends the event after it credits the business crypto wallet.

The customer_id field is at the top level. The payload has no source object.

{
  "event": "crypto.deposit.successful",
  "transaction_id": "crypto-transaction-id",
  "transaction_reference": "CRYPTO-REF",
  "transaction_status": "SUCCESSFUL",
  "wallet_id": "crypto-wallet-id",
  "customer_id": "customer-id",
  "currency": "USDC",
  "amount": "100.000000",
  "fee": "1.000000",
  "net_amount": "99.000000",
  "network": "ETHEREUM_MAINNET",
  "token": "USDC",
  "source_address": "0x742d35Cc6634C0532925a3b844Bc9e7595f6E123",
  "transaction_hash": "0xabc123",
  "event_id": "webhook-log-id",
  "type": "crypto.deposit.successful"
}

Webhook retries

The retry, log, and replay guidance below does not apply to Interac auto-deposit registration events. Those events use synchronous delivery without automatic retries or webhook logs. Use the read endpoints to check a missed status update.

A webhook can be delivered more than once. Use event_id to process each event once in your system.

Return a 2xx response when you accept a webhook. Blaaiz can retry a delivery that does not receive a 2xx response.

Use the webhook log endpoints to inspect delivery status. You can replay an eligible failed delivery.

⚙️ Best practices

  • Reply with a 2xx promptly and process work asynchronously if needed.
  • Implement idempotency using the event_id so duplicate deliveries don’t double-process work.
  • Return non-2xx only when you truly want a retry.

Data retention

Webhook logs (payloads, responses, attempt history) are retained for 90 days. After 90 days, records are pruned for both successful and failed deliveries.

  • If you need webhook data beyond 90 days, store it in your own systems.
  • Replay is only available for webhooks within the 90-day window.

On this page