> ## 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.

# Onboard businesses

> Submit an organization's KYB data to WisdomTree, track the review, and answer corrections.

A business must pass WisdomTree's KYB review before it can trade. The business onboards through the KYB endpoints of its [organization](https://docs.privy.io/organizations/overview.md). Set `provider` to `wisdomtree` in each request.

Privy forwards the data to WisdomTree. WisdomTree reviews submissions asynchronously. Privy does not store the KYB data.

### Onboarding flow

1. Your app's server [submits the business data](#submit-verification-data). The request also answers WisdomTree's agreements.
2. WisdomTree reviews the submission. The status starts as `pending`.
3. WisdomTree may need changes. The status then moves to `action_required`. Your app [answers each correction](#answer-corrections), and Privy submits the business again.
4. Once the status is `approved`, the organization can [register wallets](https://docs.privy.io/wallets/actions/earn/tokenized-money-market-funds/register-wallets.md) and trade.

The review uses these statuses:

| Status | Meaning |
| - | - |
| `not_started` | The organization has not submitted KYB data to WisdomTree. |
| `pending` | WisdomTree is reviewing the submission. |
| `action_required` | WisdomTree needs corrections before it continues. |
| `approved` | The organization can register wallets and trade. |
| `rejected` | WisdomTree declined the business. |
| `suspended` | WisdomTree suspended the business. |

## Submit verification data

To submit an organization's KYB data, send a `POST` request to:

```bash theme={"system"}
https://api.privy.io/v1/organizations/{organization_id}/kyb/submit
```

### Parameters

The body holds the business data and its answers to WisdomTree's agreements.

**provider** `'wisdomtree'` *required*

The fund provider.

**environment** `'sandbox' | 'production'`

The WisdomTree environment of the submission. Defaults to `production`. Use `sandbox` to test. See
[how the sandbox
works](https://docs.privy.io/wallets/actions/earn/tokenized-money-market-funds/sandbox.md#how-the-sandbox-works).

**agreements** `object[]`

The WisdomTree agreements the business accepts.

**child attributes**

**type** `'provider_terms' | 'stablecoin_customer_terms' | 'other'` *required*

The kind of terms. Use `provider_terms` for WisdomTree's agreements.

**agreement\_id** `string` *required*

The agreement's ID.

**version** `string` *required*

The version of WisdomTree's current agreement set.

**accepted\_at** `string` *required*

ISO 8601 timestamp of when the business accepted the agreement.

**accepted\_by\_associated\_person\_id** `string`

The associated person who accepted the agreement for the business.

**declined\_agreements** `object[]`

The WisdomTree agreements the business does not confirm.

**child attributes**

**agreement\_id** `string` *required*

The agreement's ID.

**reason** `string` *required*

Why the business does not confirm the agreement.

**data** `object` *required*

The business's KYB data. See [business data fields](#business-data-fields).

> [!NOTE]
>
> Each agreement of WisdomTree's current set must be either in `agreements` or in
> `declined_agreements`. If the request does not match the current set, Privy returns a `400` that
> lists the agreement IDs and the current version. Use that response as the source of truth: the set
> can change.

### Returns

The endpoint returns `202 Accepted` with the organization's KYB status. See the [status fields](#status-fields).

> [!WARNING]
>
> If WisdomTree does not answer, Privy returns `502` with the code `provider_unavailable`. Retry
> after a few minutes.

### Example

This request submits a United States corporation with one owner.

```bash theme={"system"}
curl -X POST https://api.privy.io/v1/organizations/{organization_id}/kyb/submit \
  -H "privy-app-id: <your-app-id>" \
  -H "Authorization: Basic <credentials>" \
  -H "Content-Type: application/json" \
  -d '{
    "provider": "wisdomtree",
    "environment": "sandbox",
    "agreements": [
      {
        "type": "provider_terms",
        "agreement_id": "<agreement-key>",
        "version": "<agreement-set-version>",
        "accepted_at": "2026-11-01T12:00:00.000Z"
      }
    ],
    "data": {
      "business_legal_name": "Acme Corp",
      "registered_address": {
        "street_line_1": "548 Market St",
        "city": "San Francisco",
        "subdivision": "CA",
        "postal_code": "94104",
        "country": "USA"
      },
      "country_of_incorporation": "USA",
      "business_type": "corporation",
      "business_description": "B2B payments platform",
      "email": "compliance@acme.example",
      "identifying_information": [
        {"type": "ein", "issuing_country": "USA", "number": "12-3456789"}
      ],
      "account_purpose": "treasury_management",
      "source_of_funds": "operating_revenue",
      "associated_persons": [
        {
          "first_name": "Jane",
          "last_name": "Doe",
          "email": "jane@acme.example",
          "date_of_birth": "1985-06-15",
          "residential_address": {
            "street_line_1": "1 Main St",
            "city": "San Francisco",
            "subdivision": "CA",
            "postal_code": "94105",
            "country": "USA"
          },
          "has_ownership": true,
          "has_control": true,
          "is_signer": true,
          "ownership_percentage": 60,
          "is_us_person": true,
          "identifying_information": [
            {"type": "ssn", "issuing_country": "USA", "number": "123-45-6789"}
          ],
          "documents": [
            {"purposes": ["government_id"], "file": "data:application/pdf;base64,<...>"}
          ]
        }
      ],
      "documents": [
        {"purposes": ["w9"], "file": "data:application/pdf;base64,<...>"},
        {"purposes": ["business_formation"], "file": "data:application/pdf;base64,<...>"},
        {"purposes": ["ownership_information"], "file": "data:application/pdf;base64,<...>"}
      ]
    }
  }'
```

```json Example response theme={"system"}
{
  "provider": "wisdomtree",
  "environment": "sandbox",
  "status": "pending",
  "kyb": {"status": "pending"},
  "requirements_due": [],
  "future_requirements_due": [],
  "resubmission": null
}
```

## Business data fields

`data` uses the same shape as [headless KYB](https://docs.privy.io/kyc-kyb/kyb-headless.md#business-data-fields). The same rules apply to its shared fields:

* The business details and addresses.
* `identifying_information` and `associated_persons`.
* `documents`.

Country codes use ISO 3166-1 alpha-3. Unlike headless KYB, `data` has no investor status.

WisdomTree also reads the fields below. The request does not require them. WisdomTree may still ask for them in a correction.

> [accordion] Optional fields WisdomTree reads
>
> | Field | Type | Description |
> | - | - | - |
> | `funds_ownership` | `string` | Who owns the funds the business invests: `business`, `customers`, `outside_investors`, `mixed`, or `other`. |
> | `material_investors` | `object[]` | Investors with material ownership, each with `name`, `investor_type`, `country`, `ownership_percentage`, and `relationship_description`. |
> | `ownership_threshold` | `number` | The ownership percentage, from 5 to 25, above which the business lists beneficial owners. |
> | `has_material_intermediary_ownership` | `boolean` | Whether an intermediary entity holds material ownership. |
> | `has_25_percent_beneficial_owner` | `boolean` | Whether a person owns 25% or more of the business. |
> | `due_diligence_exemption_classifications` | `string[]` | The due diligence exemptions the business claims. |
> | `fatf_high_risk_country_exposure` | `object` | Exposure to FATF high-risk countries, with `has_exposure`, `countries`, and `explanation`. |
> | `complies_with_us_sanctions` | `boolean` | Whether the business complies with United States sanctions. |
> | `aml_program` | `object` | The anti-money-laundering program, with `status` and `explanation`. |
> | `sanctions_screening_lists` | `string[]` | The sanctions lists the business screens against: `ofac`, `un`, `eu`, `hmt_ofsi`, `dfat`, or `other`. |
> | `compliance_screening_explanation` | `string` | How the business screens customers. |
> | `blockchain_monitoring` | `object` | How the business monitors blockchain activity, with `status`, `provider`, and `explanation`. |
> | `independent_compliance_testing` | `object` | Independent testing of the compliance program, with `status`, `tested_by`, `tested_at`, and `explanation`. |
> | `compliance_officer` | `object` | The compliance officer, with `name`, `email`, and `phone`. |
> | `operates_in_digital_assets` | `boolean` | Whether the business operates in digital assets. |
> | `exercises_discretion_over_stablecoin_reserves` | `boolean` | Whether the business manages stablecoin reserves at its discretion. |

The `status` of `aml_program` and `blockchain_monitoring` is `implemented`, `in_progress`, `not_implemented`, or `not_applicable`. The `status` of `independent_compliance_testing` is `completed`, `scheduled`, `not_completed`, or `not_applicable`.

Each associated person can also include `is_director`, `is_regulatory_notices_recipient`, `is_us_person`, `politically_exposed_person` (`is_pep` and `details`), `delegation` (`is_delegated`), and `relationship_established_at`.

## Check the review status

To check the status, send a `GET` request to:

```bash theme={"system"}
https://api.privy.io/v1/organizations/{organization_id}/kyb?provider=wisdomtree
```

Add `environment=sandbox` to the query to read the sandbox status. The response lists one status for WisdomTree, in that environment:

```json Example response theme={"system"}
{
  "kyb_statuses": [
    {
      "provider": "wisdomtree",
      "environment": "sandbox",
      "status": "action_required",
      "kyb": {"status": "action_required"},
      "requirements_due": ["org_details.tax_id"],
      "future_requirements_due": [],
      "resubmission": {
        "message": "Please correct the highlighted fields.",
        "due_at": "2026-11-15T00:00:00Z",
        "reasons": [
          {
            "id": 5,
            "field": "org_details.tax_id",
            "field_label": "Tax ID",
            "message": "The EIN does not match the IRS record",
            "required_action": "resubmit_corrected",
            "answered": false
          }
        ]
      }
    }
  ],
  "next_cursor": null
}
```

### Status fields

The submit, status, and corrections endpoints all return these fields.

**provider** `'wisdomtree'`

The fund provider.

**environment** `'sandbox' | 'production'`

The WisdomTree environment of the status.

**status** `string`

The organization's KYB status. See the [onboarding flow](#onboarding-flow).

**kyb** `object`

The KYB review.

**child attributes**

**status** `string`

The KYB status.

**rejection\_reasons** `string[] | undefined`

WisdomTree's reasons, while the status is `rejected`.

**requirements\_due** `string[]`

The fields WisdomTree needs corrected, by the provider's field paths.

**future\_requirements\_due** `string[]`

Fields WisdomTree may ask for later.

**resubmission** `object | null`

What WisdomTree needs corrected, while the status is `action_required`. `null` otherwise.

**child attributes**

**message** `string | null`

A short summary to show the business.

**due\_at** `string | null`

The deadline to answer every reason.

**reasons** `object[]`

The corrections to answer. Each has `id`, `field`, `field_label`, `message`,
`required_action`, and `answered`.

## Answer corrections

While the status is `action_required`, `resubmission.reasons` lists what WisdomTree needs. Answer each reason by its `id`. Send a `POST` request to:

```bash theme={"system"}
https://api.privy.io/v1/organizations/{organization_id}/kyb/corrections/{reason_id}
```

Once your app answers every reason, Privy submits the business to WisdomTree again. The status then moves back to `pending`.

### Parameters

Each reason has a `required_action`. It tells your app which field to send.

**provider** `'wisdomtree'` *required*

The fund provider.

**environment** `'sandbox' | 'production'`

The WisdomTree environment of the submission to correct. Defaults to `production`. Use `sandbox` to test. See
[how the sandbox works](https://docs.privy.io/wallets/actions/earn/tokenized-money-market-funds/sandbox.md#how-the-sandbox-works).

**attested** `boolean` *required*

Whether the business attests that the answer is accurate. `false` withdraws an earlier answer.

**values** `object`

Corrected values by the provider's field path, e.g. `{"org_details.tax_id": "98-7654321"}`. For reasons with `required_action` set to `resubmit_corrected`.

**document** `string`

A base64 data URI of a PDF, JPEG, or PNG file. For reasons with `required_action` set to `upload_replacement_document` or `upload_additional_document`.

**explanation** `string`

A written answer. For reasons with `required_action` set to `provide_explanation`.

### Returns

The endpoint returns the organization's KYB status. See the [status fields](#status-fields).

### Example

This request answers reason `5` with a new tax ID.

```bash theme={"system"}
curl -X POST https://api.privy.io/v1/organizations/{organization_id}/kyb/corrections/5 \
  -H "privy-app-id: <your-app-id>" \
  -H "Authorization: Basic <credentials>" \
  -H "Content-Type: application/json" \
  -d '{
    "provider": "wisdomtree",
    "environment": "sandbox",
    "values": {"org_details.tax_id": "98-7654321"},
    "attested": true
  }'
```

> [!NOTE]
>
> If WisdomTree rejects an answer, for example a document that does not match what the reason asks
> for, Privy returns `400` with WisdomTree's message. The reason stays unanswered.

## Next steps

Once WisdomTree approves the business, register its wallets.

> [card] [Register wallets](https://docs.privy.io/wallets/actions/earn/tokenized-money-market-funds/register-wallets.md)
>
> Register the organization's wallets with WisdomTree.

> [card] [Webhooks](https://docs.privy.io/wallets/actions/earn/tokenized-money-market-funds/webhooks.md)
>
> Receive `tmmf.kyb.updated` when WisdomTree takes a submission.
