The new Webhooks service provides a more robust, reliable, faster, and feature-rich integration experience. While the new system introduces many enhanced capabilities, it also deprecates some existing features to streamline functionality and improve performance.
This document will guide you through:
- Understanding new features and improvements
- Mapping changes between the old and new webhook payloads
- Best practices for implementing the new system
Key Benefits
Here’s a summary of the new service and improvements:
- Improved Performance: Reduced response times and increased resiliency.
- Events Catalog: Subscribe to specific events or event categories.
- Visibility: New UI for notifications and send attempts.
- Enhanced controls: UI and API management, including notifications, resend up to 30 days.
- No holdups: Removed existing 10s inherent delay used in V1 to best-effort order messages.
Changelog
- Event Filtering/subscription
- You can now subscribe to events by their
eventType
, reducing the need to process unwanted events.
- You can now subscribe to events by their
- Event types
- A new syntax for event types is introduced. Mapping of V1 to V2 event types is provided in Event Mapping: Old to New.
- Event ordering
- The 10-second delay previously applied to certain events has been removed.
- While we still make efforts to send notifications in order (per resource), Fireblocks doesn’t guarantee delivery of
events in the order in which they’re generated. Your endpoint shouldn’t expect the delivery of events in
order.
- Resend Capability (Under Development)
- We now allow resending events for up to 30 days from the original event timestamp.
- To initiate a resend, use the
resourceId
field of the event'sdata
object.
- Improved Retry Logic
- Retry attempts for failed webhook deliveries now span a longer time window to ensure delivery success.
- Error Rate Monitoring and Disabling
- Webhooks with an error rate exceeding a specific threshold will be automatically disabled to protect the system
integrity. - Handle events asynchronously with queues and quickly return a
2xx
status code to prevent performance issues in your application
- Webhooks with an error rate exceeding a specific threshold will be automatically disabled to protect the system
Notifications Object Differentiation
The new webhook payload format is designed for clarity and extensibility. Below is the structure of the new payload:
Old Field | New Field | Type | Description |
---|---|---|---|
- | id | string (UUID) | Unique identifier for the webhook notification object. |
type | eventType | enum | Description of the event (e.g., transaction.created ). |
- | resourceId | string (UUID) | (Optional) ID of the entity that triggered the event (e.g., txid ). |
data | data | object | Contains the API resource relevant to the event (e.g., the full transaction object for a transaction.created event). |
timestamp | createdAt | number | Webhook timestamp. |
tenantId | workspaceId | string (UUID) | The tenant or workspace identifier associated with the event. |
Note:
Although the event payload remains unchanged, the notification object has been updated, requiring some adjustments on your end for parsing. Additionally, you’ll need to register your webhook listener on Push API V2 to start using it.
Key Changes from the Old Payload
id
: Unique identifier for the webhook notification object.type
→eventType
: Unified event naming for consistency.resourceId
: Introduced to enable precise identification of the entity associated with the event.tenantId
→workspaceId
: The tenant/workspace identifier associated with the event.timestamp
→createdAt
: Describes when the webhook was created.
Note:
Review Webhooks V2 documentation and implement accordingly. Please be sure to remove V1 webhooks under the Admin center.
Event Mapping: Old to New
To make the migration seamless, below is the mapping of old event names to new ones:
V1 Category | V1 Event Type | V2 Category | V2 Event Type |
---|---|---|---|
Transactions | TRANSACTION_CREATED | Transactions | transaction.created |
Transactions | TRANSACTION_STATUS_UPDATED | Transactions | transaction.status.updated |
Transactions | TRANSACTIONS_APPROVAL_STATUS_UPDATED | Transactions | transaction.approval_status.updated |
Internal, External & Contract Wallet | EXTERNAL_WALLET_ASSET_ADDED | Whitelist | external_wallet.asset.added |
Internal, External & Contract Wallet | EXTERNAL_WALLET_ASSET_REMOVED | Whitelist | external_wallet.asset.removed |
Internal, External & Contract Wallet | INTERNAL_WALLET_ASSET_ADDED | Whitelist | internal_wallet.asset.added |
Internal, External & Contract Wallet | INTERNAL_WALLET_ASSET_REMOVED | Whitelist | internal_wallet.asset.removed |
Internal, External & Contract Wallet | CONTRACT_WALLET_ASSET_ADDED | Whitelist | contract_wallet.asset.added |
Internal, External & Contract Wallet | CONTRACT_WALLET_ASSET_REMOVED | Whitelist | contract_wallet.asset.removed |
Vault | VAULT_ACCOUNT_ADDED | Wallet | vault_account.created |
Vault | VAULT_ACCOUNT_ASSET_ADDED | Wallet | vault_account.asset.added |
Vault | VAULT_ACCOUNT_ASSET_BALANCE_UPDATED | Wallet | vault_account.asset.balance_updated |
NFT | VAULT_ACCOUNT_NFT_BALANCE_UPDATED | Wallet | vault_account.nft.balance_updated |
Embedded Wallet | NCW_STATUS_UPDATED | Embedded Wallet | embedded_wallet.status.updated |
Embedded Wallet | NCW_STATUS_CREATED | Embedded Wallet | embedded_wallet.account.created |
Embedded Wallet | NCW_ASSET_CREATED | Embedded Wallet | embedded_wallet.asset.added |
Embedded Wallet | NCW_BALANCE_UPDATED | Embedded Wallet | embedded_wallet.asset.balance_updated |
Embedded Wallet | NCW_ADD_DEVICE_SETUP_REQUESTED | Embedded Wallet | embedded_wallet.device.added |
Exchange & Fiat Account | EXCHANGE_ACCOUNT_ADDED | CeFi | exchange_account.added |
Exchange & Fiat Account | EXCHANGE_ACCOUNT_ADDED | CeFi | fiat_account.added |
Network Connection | NETWORK_CONNECTION_ADDED | Network | connection.added |
Network Connection | NETWORK_CONNECTION_REMOVED | Network | connection.removed |
Network Connection | NETWORK_CONNECTION_ADDED | Network | connection.added |
Network Connection | WAITING_FOR_PEER_APPROVAL | Network | connection.request.waiting_peer_approval |
Network Connection | REJECTED_BY_PEER | Network | connection.request.rejected_by_peer |
Smart Transfer | TICKET_CREATED | Smart Transfer | ticket.created |
Smart Transfer | TICKET_SUBMITTED | Smart Transfer | ticket.submitted |
Smart Transfer | TICKET_EXPIRED | Smart Transfer | ticket.expired |
Smart Transfer | TICKET_CANCELED | Smart Transfer | ticket.canceled |
Smart Transfer | TICKET_FULFILLED | Smart Transfer | ticket.fulfilled |
Smart Transfer | TICKET_COUNTERPARTY_ADDED | Smart Transfer | ticket.counterparty.added |
Smart Transfer | TICKET_COUNTERPARTY_EXTERNAL_ID_SET | Smart Transfer | ticket.counterparty_external_id.set |
Smart Transfer | TICKET_NOTE_ADDED | Smart Transfer | ticket.note.added |
Smart Transfer | TICKET_EXPIRES_IN_SET | Smart Transfer | ticket.expires_in.set |
Smart Transfer | TICKET_EXPIRES_AT_SET | Smart Transfer | ticket.expires_at.set |
Smart Transfer | TICKET_TERM_ADDED | Smart Transfer | ticket.term.added |
Smart Transfer | TICKET_TERM_UPDATED | Smart Transfer | ticket.term.updated |
Smart Transfer | TICKET_TERM_DELETED | Smart Transfer | ticket.term.deleted |
Smart Transfer | TICKET_TERM_FUNDED | Smart Transfer | ticket.term.funded |
Smart Transfer | TICKET_TERM_MANUALLY_FUNDED | Smart Transfer | ticket.term.manually_funded |
Smart Transfer | TICKET_TERM_FUNDING_CANCELED | Smart Transfer | ticket.term.funding_canceled |
Smart Transfer | TICKET_TERM_FUNDING_FAILED | Smart Transfer | ticket.term.funding_failed |
Smart Transfer | TICKET_TERM_FUNDING_COMPLETED | Smart Transfer | ticket.term.funding_completed |
Smart Transfer | TICKET_TERM_TRANSACTION_STATUS_CHANGED | Smart Transfer | ticket.term.transaction_status_changed |
Off Exchange | SETTLEMENT_CREATED | Off Exchange | settlement.created |
Off Exchange | COLLATERAL_SIGNER_READY_EVENT | Off Exchange | collateral.status.updated |