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

# Onboard individuals

> Onboard individual end clients and open their accounts via the Anchorage Digital API.

Open a crypto account for an individual end client. If they're new to your platform, onboard them first, then open their account. If they already have a `customerId`, skip straight to opening the account.

## How it works

<Steps>
  <Step title="Check whether the client is new">
    Look up whether this individual already has a `customerId` with Anchorage Digital. Existing clients can open additional accounts without repeating onboarding.
  </Step>

  <Step title="Onboard the client (new clients only)">
    Submit the client's KYC information and documentation, and collect their agreement to your terms and conditions. Anchorage Digital performs due diligence and returns a `customerId`.
  </Step>

  <Step title="Open the account">
    Create an account (subaccount) for the client, specifying the account type and linking it to their `customerId` — either the one just created, or an existing one.
  </Step>

  <Step title="Confirm approval">
    Check the account's status, or subscribe to the `subaccount.opened` webhook, to know when it's active.
  </Step>
</Steps>

<Note>
  You don't need to wait for a new client's onboarding to be fully approved before opening their account — you can submit the account application right after receiving their `customerId`. Client onboarding and account opening are approved together.
</Note>

This flow supports opening every individual account type — see the account types table in [Step 6](#step-6-create-the-account) for the full list.

Before onboarding your first client, decide how you'll deliver terms and conditions and whether you're using a KYC reliance model — see [Terms and conditions](/knowledge-base/platform/developers/wealth/wealth-management-onboarding-terms-types).

***

## Integration steps

<Note>
  If this client already has a `customerId`, skip ahead to [Step 6: Create the account](#step-6-create-the-account).
</Note>

### Step 1: Onboard the client

**`POST /v2/onboarding/customers`**

* `applicationType`: `RIA_PC_INDIVIDUAL`
* `externalId`: unique identifier used by the wealth platform to identify this end client
* `entries`: see table below

<Note>
  **Sandbox:** applications must use mock data and reviews are expedited. **Production:** actual client information is required and a more thorough review process applies — no mock data is permitted in production.
</Note>

| **Tag**                               | **Description**                       | **Required**                                                           | **Type** | **Value restrictions**                    |
| :------------------------------------ | :------------------------------------ | :--------------------------------------------------------------------- | :------- | :---------------------------------------- |
| legalEntityName                       | legal entity name                     | Yes                                                                    | String   |                                           |
| programCustomer                       | list of end clients                   | Yes                                                                    | Array    | 1 entry                                   |
| programCustomer/firstName             | end client first name                 | Yes                                                                    | String   | limited to 36 characters                  |
| programCustomer/lastName              | end client last name                  | Yes                                                                    | String   | limited to 48 characters                  |
| programCustomer/middleName            | end client middle name                | No                                                                     | String   |                                           |
| programCustomer/dateOfBirth           | end client date of birth              | Yes                                                                    | Date     | ISO 8601 date (without time)              |
| programCustomer/email                 | end client email address              | Yes                                                                    | String   | valid e-mail address                      |
| programCustomer/ssn                   | end client social security number     | Yes (this or `governmentId` required)                                  | String   | 9-digit number                            |
| programCustomer/governmentId          | end client government-specific ID     | Yes (this or `ssn` required)                                           | String   |                                           |
| programCustomer/physicalCountry       | end client country                    | Yes                                                                    | String   | ISO 3166-1 alpha-2 country code           |
| programCustomer/physicalStreetAddress | end client street address             | Yes                                                                    | String   |                                           |
| programCustomer/physicalCity          | end client city name                  | Yes                                                                    | String   |                                           |
| programCustomer/physicalStateUS       | end client US state                   | Yes, for US country                                                    | String   | 2-character USPS state code               |
| programCustomer/physicalStateOther    | end client non-US state or province   | Yes, for non-US countries                                              | String   |                                           |
| programCustomer/physicalPostalCode    | end client zip code or postal code    | Yes                                                                    | String   |                                           |
| programCustomer/idType                | end client type of ID uploaded        | Yes                                                                    | Enum     | `GOVERNMENT_ISSUED_ID_CARD` or `PASSPORT` |
| certifiedW9                           | customer has signed W-9 certification | Yes if `programCustomer/ssn` is provided (US individuals)              | Boolean  | `true` or `false`                         |
| certifiedW8                           | customer has signed W-8 certification | Yes if `programCustomer/governmentId` is provided (non-US individuals) | Boolean  | `true` or `false`                         |

A unique `customerId` is returned, which is used in all future calls to identify this end client.

<CodeGroup>
  ```json Request — non-US individual (W-8) theme={null}
  {
    "applicationType": "RIA_PC_INDIVIDUAL",
    "entries": [
      { "key": "legalEntityName", "value": "RIA PC Inv 1 Test" },
      {
        "key": "programCustomer",
        "value": {
          "firstName": "Kevin",
          "lastName": "Flynn_1",
          "dateOfBirth": "01/01/1970",
          "email": "kevin.flynn_1@test.com",
          "governmentId": "123456789",
          "physicalCity": "city",
          "physicalCountry": "FRANCE",
          "physicalPostalCode": "7500",
          "physicalStateOther": "Paris",
          "physicalStreetAddress": "123 Lightcycle Way",
          "idType": "GOVERNMENT_ISSUED_ID_CARD"
        }
      },
      { "key": "certifiedW8", "value": true }
    ]
  }
  ```

  ```json Request — US individual (W-9) theme={null}
  {
    "applicationType": "RIA_PC_INDIVIDUAL",
    "entries": [
      { "key": "legalEntityName", "value": "RIA PC Inv 1 Test" },
      {
        "key": "programCustomer",
        "value": {
          "firstName": "Kevin",
          "lastName": "Flynn_1",
          "dateOfBirth": "01/01/1970",
          "email": "kevin.flynn_1@test.com",
          "ssn": "123456789",
          "physicalCity": "city",
          "physicalCountry": "US",
          "physicalPostalCode": "94104",
          "physicalStateUS": "CA",
          "physicalStreetAddress": "123 Lightcycle Way",
          "idType": "GOVERNMENT_ISSUED_ID_CARD"
        }
      },
      { "key": "certifiedW9", "value": true }
    ]
  }
  ```

  ```json Response theme={null}
  {
    "data": {
      "customerId": "c78e4bbd8f346e1f314f160ef3c84e69d2d1cbc878e569137eba688a1cf56ea1",
      "status": "IN_PROGRESS"
    }
  }
  ```
</CodeGroup>

### Step 2: Upload required documents

**`POST /v2/onboarding/customers/{{customerId}}/document`**

| **Tag**      | **Description**                 | **Required**                     | **Type** | **Value restrictions**             |
| :----------- | :------------------------------ | :------------------------------- | :------- | :--------------------------------- |
| documentType | passport                        | Yes, if ID card is not provided  | Upload   | GIF, JPEG, PNG, or PDF — max 25 MB |
| documentType | government-issued ID card front | Yes, if passport is not provided | Upload   | GIF, JPEG, PNG, or PDF — max 25 MB |
| documentType | government-issued ID card back  | Yes, if passport is not provided | Upload   | GIF, JPEG, PNG, or PDF — max 25 MB |

<Note>
  Upload a single image file (GIF, JPEG, PNG, or PDF). If a second file is uploaded, the latest replaces the first. Multi-file archives are rejected. A signed upload URL is returned and accepts the document via a PUT request. The URL is valid for 15 minutes — if it expires, request a new one by calling this endpoint again.
</Note>

<CodeGroup>
  ```json Request theme={null}
  {
    "documentType": "programCustomer.idCardFront"
  }
  ```

  ```json Response theme={null}
  {
    "data": {
      "url": "https://storage.googleapis.com/anchorage/pii/v1/{{customerId}}/ID_CARD_FRONT/{{documentId}}?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Expires=899&X-Goog-Signature={{signature}}"
    }
  }
  ```
</CodeGroup>

Upload the image to the returned URL:

```bash theme={null}
curl -X PUT -H 'Content-Type: application/octet-stream' --data-binary @image.png {{step2url.response.body.data.url}}
```

### Step 3: Check onboarding status

**`GET /v2/onboarding/customers/{{customerId}}`**

Any errors or missing documents are listed in the `errors` section of the response.

```json Response theme={null}
{
  "data": {
    "customerId": "c78e4bbd8f346e1f314f160ef3c84e69d2d1cbc878e569137eba688a1cf56ea1",
    "entries": [
      {
        "key": "programCustomer",
        "value": [
          {
            "dateOfBirth": "01/01/1970",
            "email": "kevin.flynn_1@test.com",
            "firstName": "Kevin",
            "idCardBack": "866b68b4a99de75dd9bca11d231041a7bd4e2469bc488abf5d6614283917b34c",
            "idCardFront": "55c7e1dc053fdd522470040e59a448cb3ad9593dd169729cee27660ae95466c4",
            "idType": "GOVERNMENT_ISSUED_ID_CARD",
            "lastName": "Flynn_1",
            "physicalCity": "city",
            "physicalCountry": "US",
            "physicalPostalCode": "94104",
            "physicalStateUS": "CA",
            "physicalStreetAddress": "123 Lightcycle Way",
            "ssn": "123456789"
          }
        ]
      },
      { "key": "legalEntityName", "value": "RIA PC Inv 1 Test" }
    ],
    "errors": [
      { "key": "programCustomer.idCardFront", "status": "MISSING", "value": "expected 1 answer for non-void triggered question, instead got 0" },
      { "key": "programCustomer.idCardBack", "status": "MISSING", "value": "expected 1 answer for non-void triggered question, instead got 0" }
    ],
    "status": "IN_PROGRESS"
  }
}
```

### Step 4: Submit the client application

**`POST /v2/onboarding/customers/{{customerId}}/submit`**

Once submitted, you can move on to opening the account — you don't need to wait for approval first (see the note above).

### Step 5: Check client approval status

**`GET /v2/onboarding/customers/{{customerId}}`**

Upon successful submission, status changes from `IN_PROGRESS` to `IN_REVIEW`. Once fully approved, status changes to `COMPLETE`. To receive asynchronous notification when approval completes, register for webhooks — see [Configure webhooks](/knowledge-base/platform/developers/webhooks/webhooks-configure).

### Step 6: Create the account

**`POST /v2/onboarding/subaccounts`**

Supported individual account types:

| Account type         | Subtype      | End client(s) |
| :------------------- | :----------- | :------------ |
| `IRA`                | —            | 1             |
| `IRA`                | `ROLLOVER`   | 1             |
| `IRA`                | `CONVERSION` | 1             |
| `ROTH`               | —            | 1             |
| `ROTH`               | `ROLLOVER`   | 1             |
| `ROTH`               | `CONVERSION` | 1             |
| `JOINT`              | —            | 2             |
| `CUSTODIAL`          | —            | 2             |
| `INDIVIDUAL_TAXABLE` | —            | 1             |

Expected program signers by account type:

| Account type         | Expected program signers                    |
| :------------------- | :------------------------------------------ |
| `IRA`                | Linked end client who owns the account      |
| `ROTH`               | Linked end client who owns the account      |
| `JOINT`              | Both linked end clients who own the account |
| `CUSTODIAL`          | Parent end client, not the child            |
| `INDIVIDUAL_TAXABLE` | Linked end client who owns the account      |

Key fields:

| Field                                       | Description                                      | Required                                  | Type    | Restrictions                                                                                                                                                |
| :------------------------------------------ | :----------------------------------------------- | :---------------------------------------- | :------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `legalEntityName`                           | Legal entity name                                | Yes                                       | String  |                                                                                                                                                             |
| `accountType`                               | Account type                                     | Yes                                       | Enum    | See table above                                                                                                                                             |
| `accountSubtype`                            | Account subtype                                  | Only for `IRA` or `ROTH`                  | Enum    | `ROLLOVER` or `CONVERSION`                                                                                                                                  |
| `programSignerGroup`                        | List of program signers                          | Yes                                       | Array   |                                                                                                                                                             |
| `programSignerGroup/programSignerFirstName` | First name                                       | Yes                                       | String  |                                                                                                                                                             |
| `programSignerGroup/programSignerLastName`  | Last name                                        | Yes                                       | String  |                                                                                                                                                             |
| `programSignerGroup/programSignerEmail`     | Email                                            | Yes                                       | String  | Valid email                                                                                                                                                 |
| `documentPreferenceAddressDefaultEmail`     | Statement delivery email(s)                      | Yes                                       | String  | Comma-separated valid emails                                                                                                                                |
| `termsAgreementID`                          | Terms agreement ID                               | If T\&Cs enabled                          | String  | ID from `/v2/onboarding/agreements/terms` — see [Terms and conditions](/knowledge-base/platform/developers/wealth/wealth-management-onboarding-terms-types) |
| `beneficiaryGroup`                          | Beneficiaries                                    | No                                        | Array   |                                                                                                                                                             |
| `beneficiaryGroup/beneficiaryType`          | Type                                             | Yes                                       | Enum    | `SPOUSE`, `FAMILY_OR_FRIEND`, `CHARITY`, `TRUST`, `ESTATE`                                                                                                  |
| `beneficiaryGroup/beneficiaryName`          | Name                                             | Yes                                       | String  |                                                                                                                                                             |
| `beneficiaryGroup/beneficiaryAllocation`    | Allocation %                                     | Yes, must sum to 100                      | Number  | 1–100                                                                                                                                                       |
| `contingencyBeneficiaryGroup`               | Contingency beneficiaries                        | No                                        | Array   | Same structure as `beneficiaryGroup`                                                                                                                        |
| `fees`                                      | Fee configuration                                | No                                        | Array   | See [fee types](/knowledge-base/platform/developers/wealth/wealth-management-subaccounts#fee-types)                                                         |
| `isSegregated`                              | Wallet structure (omnibus or segregated wallets) | No, defaults to `false` (omnibus wallets) | Boolean | Org must opt into feature                                                                                                                                   |
| `programCustomers`                          | Linked end clients                               | Yes                                       | Array   |                                                                                                                                                             |
| `programCustomers/programCustomerId`        | End client ID                                    | Yes                                       | String  | The `customerId` from Step 1 — or an existing client's `customerId` if you skipped onboarding                                                               |
| `programCustomers/programCustomerRole`      | Role                                             | Yes                                       | Enum    | `PRIMARY` or `SECONDARY`                                                                                                                                    |
| `submit`                                    | Submit immediately                               | No, defaults to `false`                   | Boolean |                                                                                                                                                             |

<Note>
  Each account requires a signer who can represent the client. The signer can be the end client themselves or another authorized individual.
</Note>

```json Example request theme={null}
{
  "name": "{{name}}",
  "externalId": "{{externalId}}",
  "submit": true,
  "entries": [
    { "key": "legalEntityName", "value": "SubAccount IRA ROLLOVER" },
    { "key": "accountType", "value": "IRA" },
    { "key": "accountSubtype", "value": "ROLLOVER" },
    { "key": "isSegregated", "value": true },
    { "key": "documentPreferenceAddressDefaultEmail", "value": "kevin.flynn_4@test.com" },
    { "key": "programSignerGroup", "value": [
        { "programSignerFirstName": "Kevin", "programSignerLastName": "Flynn_5", "programSignerEmail": "kevin.flynn_5@test.com" },
        { "programSignerFirstName": "Kevin", "programSignerLastName": "Flynn_6", "programSignerEmail": "kevin.flynn_6@test.com" }
      ]
    },
    { "key": "programCustomers", "value": [
        { "programCustomerId": "{{customerId1}}", "programCustomerRole": "PRIMARY" }
      ]
    },
    { "key": "beneficiaryGroup", "value": [
        { "beneficiaryType": "SPOUSE", "beneficiaryName": "Test beneficiary", "beneficiaryAllocation": "50" },
        { "beneficiaryType": "CHARITY", "beneficiaryName": "Test beneficiary 2", "beneficiaryAllocation": "50" }
      ]
    },
    { "key": "contingencyBeneficiaryGroup", "value": [
        { "beneficiaryType": "FAMILY_OR_FRIEND", "beneficiaryName": "Test beneficiary 3", "beneficiaryAllocation": "25" },
        { "beneficiaryType": "TRUST", "beneficiaryName": "Test beneficiary 4", "beneficiaryAllocation": "75" }
      ]
    },
    { "key": "fees", "value": [
        { "feeType": "ADVISORY", "feeRate": "0.1" },
        { "feeType": "MANAGEMENT", "feeRate": "0.25", "feeIsBillable": true }
      ]
    }
  ]
}
```

A unique `subaccountId` is returned for all future references to this account.

Every account type follows this same payload shape — only `accountType`, `accountSubtype` (where applicable), and the number of `programCustomers` entries change, per the table above. Add `termsAgreementId` to a program signer's entry only if [terms and conditions delivery](/knowledge-base/platform/developers/wealth/wealth-management-onboarding-terms-types) requires their explicit agreement. See [Onboarding examples](/knowledge-base/platform/developers/wealth/wealth-management-onboarding-examples) for complete request payloads, with and without a `termsAgreementId`, for every account type.

### Step 7: List account applications

**`GET /v2/onboarding/subaccounts`**

Returns all account onboarding applications associated with this API key. Supports `afterId` and `limit` for cursor pagination.

### Step 8: Check account status

**`GET /v2/onboarding/subaccounts/{subaccountId}`**

Errors and missing documents are listed in the `errors` array of the response.

### Step 9: Update the account application (if errors are present)

**`PUT /v2/onboarding/subaccounts/{subaccountId}`**

Uses the same `entries` array shape as Step 6. Only include the entries you want to change — omitted fields keep their existing value.

```json Example request theme={null}
{
  "entries": [
    { "key": "documentPreferenceAddressDefaultEmail", "value": "kevin.flynn_4-updated@test.com" }
  ]
}
```

<Note>
  Any change to a client's data, or a request to terminate their account, is authenticated by Anchorage Digital Bank with the end client via DocuSign before processing.
</Note>

### Step 10: Submit the account application (if `submit: false`)

**`POST /v2/onboarding/subaccounts/{subaccountId}/submit`**

### Step 11: Check account approval status

**`GET /v2/subaccounts/customers/accounts?subaccountIds={subaccountId}`**

Status values: `PENDING` (received, awaiting approval) → `OPEN` (approved and active). Alternatively, subscribe to the `subaccount.opened` webhook event for asynchronous notification.

```json Example response (approved) theme={null}
{
  "data": {
    "applicationId": "6ba46417-66dc-424e-8e68-4fbd2597d993",
    "entries": [
      { "key": "programSignerGroup", "value": [
          { "programSignerFirstName": "Kevin", "programSignerLastName": "Flynn_5", "programSignerEmail": "kevin.flynn_5@test.com" },
          { "programSignerFirstName": "Kevin", "programSignerLastName": "Flynn_6", "programSignerEmail": "kevin.flynn_6@test.com" }
        ]
      },
      { "key": "programCustomers", "value": [
          { "programCustomerId": "43a37de2dcc326579fe9ab3a187c48b786007bd759802dfa04ef1aa35383a273", "programCustomerRole": "PRIMARY" }
        ]
      },
      { "key": "accountSubtype", "value": "ROLLOVER" },
      { "key": "accountType", "value": "IRA" },
      { "key": "beneficiaryGroup", "value": [
          { "beneficiaryAllocation": "50", "beneficiaryName": "Test beneficiary", "beneficiaryRelation": "Primary", "beneficiaryType": "Spouse" },
          { "beneficiaryAllocation": "50", "beneficiaryName": "Test beneficiary 2", "beneficiaryRelation": "Contingency", "beneficiaryType": "Charity" }
        ]
      },
      { "key": "fees", "value": [
          { "feeRate": "0.1", "feeType": "Advisory" },
          { "feeIsBillable": "Yes", "feeRate": "0.25", "feeType": "Management" }
        ]
      },
      { "key": "documentPreferenceAddressDefaultEmail", "value": "gareth.test_3@test.com" },
      { "key": "legalEntityName", "value": "SubAccount IRA ROLLOVER" }
    ],
    "errors": [],
    "status": "COMPLETE"
  }
}
```

***

## Reliance only: edit client information

RIAs with full or partial KYC reliance have access to a flow in which program customers are auto-approved. For these RIAs, select fields remain editable even after application status is `COMPLETE`.

| **Tag**                               | **Description**                       | **Required**                                      | **Can edit** | **Type** | **Value restrictions**                    |
| :------------------------------------ | :------------------------------------ | :------------------------------------------------ | :----------- | :------- | :---------------------------------------- |
| legalEntityName                       | legal entity name                     | Yes                                               | No           | String   |                                           |
| programCustomer                       | list of end clients                   | Yes                                               | Yes          | Array    | 1 entry                                   |
| programCustomer/firstName             | end client first name                 | Yes                                               | Yes          | String   | limited to 36 characters                  |
| programCustomer/lastName              | end client last name                  | Yes                                               | Yes          | String   | limited to 48 characters                  |
| programCustomer/middleName            | end client middle name                | No                                                | Yes          | String   |                                           |
| programCustomer/dateOfBirth           | end client date of birth              | Yes                                               | No           | Date     | ISO 8601 date (without time)              |
| programCustomer/email                 | end client email address              | Yes                                               | Yes          | String   | valid e-mail address                      |
| programCustomer/ssn                   | end client social security number     | Yes (this or `governmentId` required)             | No           | String   | 9-digit number                            |
| programCustomer/governmentId          | end client government-specific ID     | Yes (this or `ssn` required)                      | No           | String   |                                           |
| programCustomer/physicalCountry       | end client country                    | Yes                                               | Yes          | String   | ISO 3166-1 alpha-2 country code           |
| programCustomer/physicalStreetAddress | end client street address             | Yes                                               | Yes          | String   |                                           |
| programCustomer/physicalCity          | end client city name                  | Yes                                               | Yes          | String   |                                           |
| programCustomer/physicalStateUS       | end client US state                   | Yes, for US country                               | Yes          | String   | 2-character USPS state code               |
| programCustomer/physicalStateOther    | end client non-US state or province   | Yes, for non-US countries                         | Yes          | String   |                                           |
| programCustomer/physicalPostalCode    | end client zip code or postal code    | Yes                                               | Yes          | String   |                                           |
| programCustomer/idType                | end client type of ID uploaded        | Yes                                               | No           | Enum     | `GOVERNMENT_ISSUED_ID_CARD` or `PASSPORT` |
| certifiedW9                           | customer has signed W-9 certification | Yes if `programCustomer/ssn` is provided          | No           | Boolean  | `true` or `false`                         |
| certifiedW8                           | customer has signed W-8 certification | Yes if `programCustomer/governmentId` is provided | No           | Boolean  | `true` or `false`                         |


## Related topics

- [Onboarding examples](/knowledge-base/platform/developers/wealth/wealth-management-onboarding-examples.md)
- [Overview](/knowledge-base/platform/developers/wealth/wealth-management-overview.md)
- [Onboard businesses](/knowledge-base/platform/developers/wealth/wealth-management-onboarding-institutions.md)
- [Onboarding your organization](/knowledge-base/platform/users/onboarding-organization.md)
- [Begin new customer onboarding application](/knowledge-base/porto/api-reference/v2/onboarding/begin-new-customer-onboarding-application.md)
