> ## Documentation Index
> Fetch the complete documentation index at: https://docs.privy.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks

> Track onboarding reviews, wallet registrations, and fund orders with real-time webhooks.

Privy sends webhooks for three kinds of TMMF events:

* WisdomTree receives an onboarding submission.
* A wallet registration changes.
* A fund order changes status.

## Setup

Subscribe to TMMF events from the **Configuration > Webhooks** page in the [Privy Dashboard](https://dashboard.privy.io/apps?page=webhooks).

> [!NOTE]
>
> 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](https://docs.privy.io/api-reference/webhooks/overview.md).

## Onboarding events

These events confirm that WisdomTree received a submission.

| Event | Fired when |
| - | - |
| `tmmf.kyb.updated` | WisdomTree received an organization's [KYB submission](https://docs.privy.io/wallets/actions/earn/tokenized-money-market-funds/onboard-businesses), or its resubmission after corrections. |
| `tmmf.kyc.updated` | WisdomTree received a user's [KYC submission](https://docs.privy.io/wallets/actions/earn/tokenized-money-market-funds/onboard-individuals). |

```json tmmf.kyb.updated theme={"system"}
{
  "type": "tmmf.kyb.updated",
  "organization_id": "<organization-id>",
  "provider": "wisdomtree",
  "environment": "sandbox",
  "data": {
    "status": "pending",
    "kyb": {"status": "pending"}
  },
  "changes": {}
}
```

`tmmf.kyc.updated` has the same payload, with two changes:

* It has `user_id` in place of `organization_id`.
* Its `data` has `kyc` in place of `kyb`.

In both events, `changes` is always empty.

> [!NOTE]
>
> These events do not currently fire when the review status changes later, for example to
> `approved`. To follow the review, poll the
> [KYB](https://docs.privy.io/wallets/actions/earn/tokenized-money-market-funds/onboard-businesses#check-the-review-status)
> or
> [KYC](https://docs.privy.io/wallets/actions/earn/tokenized-money-market-funds/onboard-individuals#check-the-review-status)
> status.

## Wallet events

This event tells your app that a wallet's registration changed.

| Event | Fired when |
| - | - |
| `tmmf.wallet.updated` | A [register](https://docs.privy.io/wallets/actions/earn/tokenized-money-market-funds/register-wallets.md) request registered the wallet, or changed the wallet's registration status. |

```json tmmf.wallet.updated theme={"system"}
{
  "type": "tmmf.wallet.updated",
  "wallet_id": "<your-wallet-id>",
  "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "provider": "wisdomtree",
  "chain": "ethereum_sepolia",
  "environment": "sandbox",
  "status": "approved",
  "user_id": "<organization-id>",
  "created_at": 1761998400000,
  "updated_at": 1761998400000
}
```

## Order events

Privy sends one webhook when it creates an order. It sends a second one when the order reaches a final status. The payload is the order's wallet action, with its steps.

| Event | Fired when |
| - | - |
| `wallet_action.tmmf_deposit.created` | Privy created and queued a purchase. |
| `wallet_action.tmmf_deposit.succeeded` | The shares purchased reached the wallet. |
| `wallet_action.tmmf_deposit.rejected` | The purchase stopped before any funds moved. |
| `wallet_action.tmmf_deposit.failed` | WisdomTree failed or refunded the purchase after the transfer. |
| `wallet_action.tmmf_withdraw.created` | Privy created and queued a sale. |
| `wallet_action.tmmf_withdraw.succeeded` | The proceeds reached the wallet. |
| `wallet_action.tmmf_withdraw.rejected` | The sale stopped before any funds moved. |
| `wallet_action.tmmf_withdraw.failed` | WisdomTree failed or refunded the sale after the transfer. |

## Common patterns

These patterns show how to combine the events with the API.

> [accordion] Follow an onboarding review
>
> Listen for `tmmf.kyb.updated` or `tmmf.kyc.updated` to know that WisdomTree received a
> submission. Then poll the [review
> status](https://docs.privy.io/wallets/actions/earn/tokenized-money-market-funds/onboard-businesses#check-the-review-status)
> until it is `approved`. Then
> [register](https://docs.privy.io/wallets/actions/earn/tokenized-money-market-funds/register-wallets.md) the user's
> wallets. While the status is `action_required`, show the `resubmission` reasons to the business.

> [accordion] Refresh positions after an order
>
> Listen for `wallet_action.tmmf_deposit.succeeded` and `wallet_action.tmmf_withdraw.succeeded`.
> Then [list the wallet's
> positions](https://docs.privy.io/wallets/actions/earn/tokenized-money-market-funds/get-positions.md) to show the new
> balance.

> [accordion] Handle failed orders
>
> A `failed` order means WisdomTree failed or refunded it after the transfer. Use the [get wallet
> action](https://docs.privy.io/api-reference/wallets/actions/get.md) endpoint with `?include=steps` to read the
> `failure_reason` and the `wisdomtree_settlement` step.
