Overview
Wallet webhooks let you subscribe to real-time events for transactions, signing operations, and delegation grants across your wallets. Events fire as operations move through each stage — from creation to confirmation or failure. These webhooks work the same way for both Server Wallets and Embedded Wallets.Looking for onchain transfer monitoring (ERC-20 in/out of any address)? See Onchain Activity Webhooks or Multi-Address subscriptions.
Event types
Transaction lifecycle events
The following event types cover the full transaction lifecycle:| Event | Description |
|---|---|
wallet.transaction.created | Transaction is created |
wallet.transaction.signed | Transaction is signed |
wallet.transaction.broadcast | Transaction is broadcast to the network |
wallet.transaction.pending | Transaction stuck in mempool for more than 30 seconds |
wallet.transaction.replaced | Transaction replaced an existing pending transaction |
wallet.transaction.confirmed | Transaction confirmed onchain |
wallet.transaction.failed | Transaction failed onchain or was replaced |
Signing events
These events fire when signing operations complete outside of a full transaction send flow:| Event | Description |
|---|---|
wallet.typed_data.signed | EVM EIP-712 typed data signed |
wallet.message.signed | Message signed (EVM EIP-191 or Solana) |
wallet.hash.signed | Arbitrary hash signed (EVM only) |
Delegation events
These events fire when delegation grants are created or revoked:| Event | Description |
|---|---|
wallet.delegation.created | Delegation grant created for an end user |
wallet.delegation.revoked | Delegation grant revoked |
Creating a subscription
Use the SDK to create a webhook subscription for wallet events:EVM
Supported events
All transaction lifecycle, signing, and delegation events are supported on EVM:| Event | Description |
|---|---|
wallet.transaction.created | Transaction is created |
wallet.transaction.signed | Transaction is signed (signEvmTransaction) |
wallet.transaction.broadcast | Transaction is broadcast to the network |
wallet.transaction.pending | Transaction stuck in mempool for more than 30 seconds |
wallet.transaction.replaced | Transaction replaced an existing pending transaction |
wallet.transaction.confirmed | Transaction confirmed onchain |
wallet.transaction.failed | Transaction failed onchain or was replaced |
wallet.typed_data.signed | EVM EIP-712 typed data signed |
wallet.message.signed | EVM EIP-191 message signed |
wallet.hash.signed | Arbitrary hash signed |
wallet.delegation.created | Delegation grant created |
wallet.delegation.revoked | Delegation grant revoked |
Webhook payload
EVM payloads include thetransaction_hash and the address of the account that sent the transaction.
When a transaction is performed via delegated signing, the payload also includes user_id and delegation_id for attribution.
Confirmed event:
pending event includes gas parameters so you can evaluate whether to submit a replacement transaction with higher gas.
Solana
Supported events
Solana supports a subset of transaction lifecycle events. Thepending and replaced events are not supported on Solana. Signing and delegation events are also supported on Solana.
| Event | Description |
|---|---|
wallet.transaction.created | Transaction is created |
wallet.transaction.signed | Transaction is signed (signSolanaTransaction) |
wallet.transaction.broadcast | Transaction is broadcast to the network |
wallet.transaction.confirmed | Transaction confirmed onchain |
wallet.transaction.failed | Transaction failed onchain |
wallet.message.signed | Message signed |
wallet.delegation.created | Delegation grant created |
wallet.delegation.revoked | Delegation grant revoked |
Webhook payload
Solana payloads usetransaction_signature instead of transaction_hash.
When a transaction is performed via delegated signing, the payload includes user_id and delegation_id for attribution.
Confirmed event:
Transaction lifecycle scenarios
The events you receive depend on how the transaction progresses through the network.Transaction confirmed successfully
The most common path: a transaction is created, broadcast, and confirmed onchain.Transaction failed onchain
The transaction was broadcast but failed during execution (e.g., reverted).Transaction replaced
When a stuck transaction is replaced with a new one (e.g., with higher gas), the original and replacement each emit separate events.| Transaction | Events |
|---|---|
| Original (stuck) | failed |
| Replacement | broadcast → replaced → confirmed or failed |
failed event because it will never land onchain. Handle the old transaction failure accordingly.
Transaction stuck > 30 seconds (EVM only)
If a transaction remains pending in the mempool for more than 30 seconds, apending event fires with gas parameters. You can use this to decide whether to submit a replacement transaction or continue waiting.
Transaction monitoring expires (EVM only)
If a transaction is still pending when the monitoring window expires, no further events are fired.Delegated signing attribution
When transactions or signing operations are performed via delegated signing (API-key auth with a delegation grant), allwallet.transaction.*, wallet.typed_data.signed, wallet.message.signed, and wallet.hash.signed webhook payloads include two additional fields for attribution:
| Field | Description |
|---|---|
user_id | The end user whose wallet was used for the operation |
delegation_id | The delegation grant that authorized the operation |
Best practices
Verify webhook signatures
Verify webhook signatures
Always verify the signature on incoming webhook payloads using the
secret returned when you created the subscription. This ensures the payload is genuinely from CDP and has not been tampered with. See Verify webhook signatures for implementation details.Handle monitoring window expiry
Handle monitoring window expiry
CDP guarantees at-least-once delivery for all webhook events fired within the monitoring window. Most transactions confirm well within this period. In the rare case that a transaction is still pending when the monitoring window expires (3 minutes for EVM, 2 minutes for Solana), no further events are fired. You can query the network at that point to check whether the transaction is still pending, has since confirmed, or has failed.
Handle the pending event correctly
Handle the pending event correctly
The
pending event means a transaction has been in the mempool for more than 30 seconds — it does not mean the transaction failed. When you receive a pending event, you can:- Submit a replacement transaction with higher gas (using the gas parameters in the payload)
- Continue waiting for a
confirmedorfailedevent
What to read next
Multi-address subscriptions
Monitor up to 100 wallet addresses with a single subscription.
Onchain Activity webhooks
Monitor smart contract events and ERC-20 token transfers on Base.
Verify webhook signatures
Validate that webhook payloads are genuinely from CDP.
Webhooks overview
All webhook surfaces and shared concepts.