Skip to main content
This reference provides detailed documentation for all webhook event types available in Privy, including example payloads for each event.
Webhooks is currently a scale feature. To use webhooks, please upgrade your account in the Privy Dashboard.

Webhook delivery

Privy sends webhooks to your configured endpoint via Svix. The webhook system operates on an at least once delivery basis with automatic retries if the endpoint does not successfully respond.
Redundant webhook deliveries can be identified using the idempotency_key field where available, ensuring your application can safely handle duplicate events.
To set up webhooks, go to the webhooks page in the Privy Dashboard.

Event structure

All webhook events follow a consistent structure with the event type included as a type field:
{
  "type": "event.type"
  // Event-specific data
}

User and authentication events

user.created

Triggered when a new user is created in your app.

user.authenticated

Triggered when a user successfully authenticates with your app.

user.linked_account

Triggered when a user links a new account (email, wallet, social, etc.) to their Privy account.
  • Email account
  • Ethereum wallet
  • Google OAuth
{
  "type": "user.linked_account",
  "user": {
    "id": "did:privy:cfbsvtqo2c22202mo08847jdux2z",
    "created_at": 1716153600,
    "linked_accounts": [],
    "mfa_methods": [],
    "has_accepted_terms": true,
    "is_guest": false
  },
  "account": {
    "type": "email",
    "address": "[email protected]",
    "verified_at": 1716153600,
    "first_verified_at": 1716153600,
    "latest_verified_at": 1716153600
  }
}

user.unlinked_account

Triggered when a user unlinks an account from their Privy account.

user.updated_account

Triggered when a user updates an existing linked account.

user.transferred_account

Triggered when an account is transferred from one user to another (typically during user merging).

user.wallet_created

Triggered when a user creates a new embedded wallet.

Transaction events

transaction.broadcasted

Triggered when a transaction has been submitted to the network but has not yet been included in a block.

transaction.confirmed

Triggered when a transaction has been included in at least one block that has been confirmed on the network.

transaction.execution_reverted

Triggered when a transaction’s execution reverted (typically due to a smart contract error).

transaction.still_pending

Triggered when a transaction is still pending after the expected confirmation time. Listen to this webhook to trigger transaction speed-ups.
Failures are uncommon overall, but more likely to occur on Base and Polygon than other chains (<1% of transactions). To ensure transactions get confirmed, follow the guide on transaction replacement to speed up stalled transactions.

transaction.failed

Triggered when a transaction has been pending for too long, signaling that it will not be included on-chain. This can happen when the gas fee is too low given the current activity on the blockchain.

transaction.replaced

Triggered when a transaction was replaced (e.g., speed-up or cancel operation). This is only applicable to EVM chains.

transaction.provider_error

Triggered when a custodial wallet transaction request has been rejected by the custodian or encountered an error. This can happen when attempting to spend funds that haven’t been fully screened by the custodian yet, or when a transaction does not meet the custodian’s compliance requirements.

Wallet and funds events

wallet.funds_deposited

Triggered when funds are deposited into a wallet.
Deposit webhooks are available for select chains on Tier 3 and Tier 2. To see which exact chains are supported, go to the Dashboard webhooks page.
  • Native token
  • ERC-20 token
  • SPL token
{
  "type": "wallet.funds_deposited",
  "wallet_id": "wallet-123",
  "idempotency_key": "124",
  "caip2": "eip155:1",
  "asset": {
    "type": "native-token",
    "address": null
  },
  "amount": "1000000000000000000",
  "transaction_hash": "0x456",
  "sender": "0x789",
  "recipient": "0xabc",
  "block": {
    "number": 12346
  }
}
idempotency_key
string
An idempotent ID that uniquely identifies the deposit. In cases where the webhook triggers more than once, the idempotency_key will match.
amount
string
Absolute amount of the transaction. Denominated based on the asset (e.g. wei for EVM, or lamports for SOL). Stringified to maintain precision from BigInt.

wallet.funds_withdrawn

Triggered when funds are withdrawn from a wallet.
  • Native token
  • ERC-20 token
  • SPL token
{
  "type": "wallet.funds_withdrawn",
  "wallet_id": "wallet-123",
  "idempotency_key": "124",
  "caip2": "eip155:1",
  "asset": {
    "type": "native-token",
    "address": null
  },
  "amount": "1000000000000000000",
  "transaction_hash": "0x456",
  "sender": "0x789",
  "recipient": "0xabc",
  "block": {
    "number": 12346
  }
}

Security events

wallet.private_key_export

Triggered when a user exports their private key from an embedded wallet.

wallet.recovery_setup

Triggered when a user sets up wallet recovery.

wallet.recovered

Triggered when a user successfully recovers their wallet.

MFA events

mfa.enabled

Triggered when multi-factor authentication is enabled for a user.
MFA methods: sms, totp (authenticator app), passkey

mfa.disabled

Triggered when multi-factor authentication is disabled for a user.