Skip to main content
Privy emits webhooks when earn wallet actions change status, allowing your app to react to deposits, withdrawals, incentive claims, and fee collections in real time without polling.

Setup

Subscribe to earn events from the Configuration > Webhooks page in the Privy Dashboard.
Webhooks can be tested at no cost in development environments. To enable webhooks in production, upgrade to the Enterprise plan in the Privy Dashboard.
For general webhook setup instructions, payload verification, and retry behavior, see the webhooks overview.

Status lifecycle

Every earn action (deposit, withdraw, incentive claim, fee collection) moves through a predictable status lifecycle. Privy emits a webhook at each transition.
1

Created

The action is received and queued for processing. At this point, no transaction has been signed or broadcast.
2

Succeeded, rejected, or failed

The action reaches a terminal state:
  • Succeeded — the transaction confirmed onchain.
  • Rejected — the action failed before any transaction was signed or broadcast (e.g. insufficient balance, policy violation). Safe to retry.
  • Failed — a transaction was broadcast but reverted onchain. Inspect the action’s steps for details.

Event reference

Deposit events

Fired when a wallet deposits assets into a yield vault.

Withdrawal events

Fired when a wallet redeems vault shares for the underlying asset plus accrued yield.

Incentive claim events

Fired when a wallet claims additional token rewards distributed by the vault.

Fee collection events

Fired when your app collects an Aave vault’s accrued performance fees. See collect performance fees.

Common patterns

Listen for wallet_action.earn_deposit.succeeded to refresh the user’s position. Once the webhook fires, call the get position endpoint to fetch the updated assets_in_vault balance and display it in your UI.
Listen for wallet_action.earn_withdraw.succeeded to trigger a notification. The webhook payload includes the wallet_id and vault_id, which your app can use to look up the user and send an in-app or push notification.
A rejected status means no transaction was broadcast — for example, due to insufficient balance or a policy violation. Your app can safely prompt the user to retry. Check the action’s error details to surface a helpful message.
A failed status means a transaction was broadcast but reverted onchain. Use the get wallet action endpoint with ?include=steps to inspect what went wrong. Common causes include vault liquidity shortfalls or gas estimation issues.