Skip to main content
Use the withdraw endpoint to sell fund shares from a registered wallet. Privy sends the shares to WisdomTree. Privy then tracks the order as a wallet action until the proceeds reach the wallet.

Redemption flow

  1. Privy creates the order as a wallet action with status pending, and sends the wallet’s shares to WisdomTree.
  2. WisdomTree fills the order. A secondary order fills from the fund’s onchain pool. A primary order fills at the daily NAV strike.
  3. The status moves to succeeded once the proceeds reach the wallet.

Usage

To sell fund shares, send a POST request to:

Parameters

The body describes the order.
string
required
The number of fund shares to sell, as a decimal string, e.g. "10.000000".
string
required
The currency of the proceeds, e.g. "USDC". Case-insensitive.
string
required
The chain the order trades on. Use ethereum_sepolia in the sandbox.
string
required
The fund ticker, e.g. "WTGXX". Case-insensitive.
'sandbox' | 'production'
The WisdomTree environment the order trades in. Defaults to production. Use sandbox to test. See how the sandbox works.
'primary' | 'secondary'
required
How the order fills: secondary from the fund’s onchain pool, which is faster, or primary directly with the fund at the next NAV strike.
string
Your app’s identifier for the order. Privy returns it on the wallet action.
string
A unique value of at least 24 characters that prevents replaying a signed request.
Wallets with owner_id present must provide an authorization signature as a request header.

Returns

The endpoint returns the order as a wallet action. It has the same fields as a purchase, with three differences:
  • type is always "tmmf_withdraw".
  • In the wisdomtree_settlement step, requested holds the shares sent, e.g. {"fund": "WTGXX", "amount": "10"}.
  • In the same step, received holds the proceeds, e.g. {"withdraw_asset": "USDC", "amount": "9.99"}.

Example

This request sells 10 WTGXX shares for USDC through the fund’s pool.
Example response
Idempotency on errors: This endpoint returns pending immediately. Replaying the same key returns the cached response. On a synchronous 5xx, Privy deletes the record so the same key retries fresh. Action outcomes (rejected, failed, succeeded) arrive via webhooks and polling. Policy violations always allow fresh retries.

Statuses and failures

A sale has the same statuses and common errors as a purchase. For a sale, the wallet must hold enough shares. A failed sale means WisdomTree failed or refunded the order after Privy sent the shares (order_refunded).
To know when the proceeds reach the wallet, poll get wallet action. Or listen for the wallet_action.tmmf_withdraw.succeeded webhook.

Next steps

Once the sale succeeds, show the updated position. Use webhooks to follow future orders.

List positions

Show the wallet’s shares, their value, and pending orders.

Webhooks

Receive order webhooks when a sale completes.