Webhooks are part of the Subscriptions to Transactions API. This page explains how the system works. For a hands-on walkthrough, see the Wallet Activity Alerts recipe.
How it works
1
Create a subscription
Call Create Subscription with a
callback_url and a list of wallet addresses. Optionally filter by chain_ids to limit which chains you monitor.2
Zerion monitors the wallets
Zerion watches all specified wallets across the selected chains (or all supported chains if none are specified).
3
Your server receives notifications
When a watched wallet sends or receives a transaction, Zerion sends a POST request to your callback URL with the full transaction payload.
Payload format
Every webhook notification is a POST request with a JSON body following the JSON:API structure. The top-leveldata object describes the notification, while the included array contains the full transaction details.
Key fields
The webhook labels every transaction with
flags.is_trash; it does not drop spam from the stream. To suppress spam notifications, filter on this field in your handler (skip transactions where is_trash is true). This also lets you apply your own threshold. See the Spam Filtering guide for how the classification works.Contract interactions
When a transaction is a recognized contract interaction, the transaction object includes anapplication_metadata object:
hash.
Signature verification
Every webhook request includes headers for verifying authenticity. Always verify signatures in production to ensure requests originate from Zerion.Verification steps
- Concatenate the signing string:
${X-Timestamp}\n${request_body}\n - Fetch the public certificate from the
X-Certificate-URLheader - Verify the
X-Signatureagainst the signing string using RSA-PKCS1v15 with SHA-256
Retry behavior
If your server returns a5xx error or the request times out, Zerion retries delivery up to 3 times, spaced about 20 seconds apart (roughly a 60-second window). After the final failed attempt, the notification is dropped permanently.
A 4xx response is treated as acknowledged and is not retried.
To minimize missed notifications:
- Return a
200response as quickly as possible, and process the payload asynchronously - Keep your endpoint available with high uptime
- Monitor your endpoint for errors and slow responses
Rollbacks
If a transaction is removed from the canonical chain (e.g., due to a chain reorganization), Zerion sends a second webhook for the same transaction withdeleted: true set on the transaction resource inside included:
included[0].attributes.deleted is true, the transaction has been rolled back and is no longer part of the canonical chain. Use the transaction hash to match it against the original notification and remove or mark it accordingly in your system.
Delivery guarantees
Zerion webhooks are best-effort:- Not guaranteed: if all 3 delivery attempts fail, the notification is dropped
- Order is not guaranteed: notifications may arrive out of order relative to on-chain transaction ordering
- Duplicates are possible: your server should handle the same notification arriving more than once
hash and chain to deduplicate, and don’t assume notifications arrive in chronological order.
Subscription limits
On the free plan, each subscription can monitor up to 5 wallets. On a paid plan, there is no limit, so you can add as many wallets as you need. The API accepts up to 100 wallets per request, so for larger lists, batch your additions across multiple calls.
Testing webhooks
Use webhook.site to get a temporary callback URL for testing:- Go to webhook.site and copy your unique URL
- Create a subscription with that URL as the
callback_url - Trigger a transaction on a watched wallet
- Inspect the payload and headers on webhook.site