# How to use the KYC constructor

Before you begin to configure a custom KYC (Know Your Customer) procedure, consider the following:

* the number of verification levels that clients can obtain (you can use the built-in KYC provider or one of the [supported third-party KYC providers](https://docs.b2core.b2broker.com/integrations/kyc-providers) to run a verification procedure at each level)
* the permissions that clients are granted after obtaining each verification level, as well as possible limits that can be applied to specific permissions
* the documents that clients are required to submit to obtain each verification level.

Moreover, it’s possible to configure separate KYC procedures for clients of different types, such as individual and corporate clients. You can also grant different initial verification levels to clients of different types after they sign up to the B2CORE UI (for details, refer to [How to add and configure the registration wizard](https://docs.b2core.b2broker.com/how-to-articles/manage-system-settings/how-to-set-up-the-registration-wazard/how-to-add-and-configure-the-registration-wizard) and specifically the article about [how to configure the User Registration step](https://docs.b2core.b2broker.com/how-to-articles/manage-system-settings/how-to-set-up-the-registration-wazard/how-to-configure-the-user-registration-step)).

Follow the steps below to create and set up verification levels, define the documents that clients must submit at each level, as well as configure the way the verification levels and their descriptions are displayed to clients in the B2CORE UI.

## How to create document groups

At this step, create document groups, for example, “Proof of ID”, “Proof of residence” and so on. Document groups are used to categorize documents required for verification.

To create a document group:

{% stepper %}
{% step %}
Navigate to **Verification** > **Document Groups**, and then click **+Create** in the upper-right page corner.
{% endstep %}

{% step %}
On the **Create document group** page, fill out the form:

* Set the group **Name**, which will be displayed only in the Back Office.
* Set **Type** to **One**.
* Set **Caption** — the name of the document group in the B2CORE UI. Set localizations if needed.
* Set **Description** — here, you can provide hints to your clients about the verification procedure. This information can be presented in the HTML format. Set localizations if needed.
* Set **Enabled** to **Yes**.
  {% endstep %}

{% step %}
Click **Save** to create the document group.
{% endstep %}
{% endstepper %}

## How to create document types

A KYC document is a formal document such as an ID card, a passport, driver’s license, or bank statement, which can verify the identity and address of a client. At this step, define documents that clients should provide in order to get verified at each level.

To define a document:

{% stepper %}
{% step %}
Navigate to **Verification** > **Document Types**, and then click **+Create** in the upper-right page corner.
{% endstep %}

{% step %}
On the **Create document type** page, fill out the form:

* Set the document **Name**, which will be displayed only in the Back Office.
* Set **Caption** to specify the document name to be displayed in the B2CORE UI. Set localizations if needed.
* Set **Description** — the description can be specified in the HTML format. Set localizations if needed.
* Set **Status** to **Enabled**.
* Set the document **Group** — it should be one of the groups created at the previous step.
* Set **Max files** to indicate how many documents of this type your client can upload.
  {% endstep %}

{% step %}
Click **Save** to define the document type.
{% endstep %}
{% endstepper %}

## How to create verification levels

At this step, create the required verification levels. For each B2CORE instance, `Level 0` is already set up and is used as the default level.

To create a new verification level:

{% stepper %}
{% step %}
Navigate to **Verification** > **Levels**, and then click **+Create** in the upper-right page corner.
{% endstep %}

{% step %}
On the **Create verification level** page, fill out the form:

* Set the level **Index**, this value must be greater than 0.
* Set **Wizard** — select `DocumentsWizard` to use the built-in KYC provider and display in the B2CORE UI a form for uploading required documents based on the specified document type.
* Set **Caption** — the level name to be displayed to clients in the B2CORE UI and mobile app. If required, specify the localization properties for this field by clicking the button located on the right side of the field.
* Set **Next Level** — select the next verification level that clients can obtain after they are granted the level that you currently configure.

  Leave this field empty to allow clients of different types, such as individual and corporate, to obtain different verification levels.

  The next level that a client is proposed to obtain in the B2CORE UI is the level with the next higher index according to the applied client type restrictions (for details, refer to [How to restrict the use of verification levels by client types](#how-to-restrict-the-use-of-verification-levels-by-client-types)).
* Set **Desktop Description** — the level description displayed to clients in the B2CORE UI. For a level description, you can list the permissions granted to clients after obtaining this level.

  The description for the B2CORE UI can be specified in the HTML format (see [Example](#example) below). If required, specify the localization properties for this field.
* Set **Mobile Description** — the level description displayed to clients in the mobile app.

  The description for the mobile app can be specified in the JSON format. If required, specify the localization properties for this field.
* Set **Visible** to:
  * **Yes** — to create the level that will be displayed in the KYC flow to clients in the B2CORE UI.
  * **No** — to create a hidden level (for example, one with specific transaction limits) that can be assigned to clients only manually via the Back Office.
* Set **Default** to **No** (since the default level is always Level 0).
* In the **Assigned Client Right** dropdown, select a permission level defining a set of permissions that you want to grant to your clients after obtaining this verification level (to learn more, refer to [How to create permission levels](#how-to-create-permission-levels)).
* Select a client accreditation test in the **Passed Tests Needed** dropdown if you want to force your clients to pass the selected test before they can submit the documents required to obtain this verification level. The list of available client tests includes all the tests with visibility set to **Yes**, which are displayed on the [Client tests](https://docs.b2core.b2broker.com/back-office-guide/verification/client-tests) page.
* Select **Document Groups** from among those created at [Step 1](#how-to-create-document-groups), which specify the documents required for a client to be granted this verification level. Multiple groups can be selected.
  {% endstep %}

{% step %}
Click **Save** to create the verification level.
{% endstep %}
{% endstepper %}

### Example

The following HTML code example illustrates how to specify a level description for the B2CORE UI:

<details>

<summary>Show example</summary>

```html
<p><strong>Verification Level 0</strong></p>
<br/>
<table class="table table-striped" role="grid">
    <tbody>
        <tr>
            <td style="background-color: #151D24;"><strong>Operations</strong></td>
            <td style="background-color: #151D24;">
                <center><strong>Permissions</strong></center>
            </td>
        </tr>
        <tr>
            <td style="background-color: #3E4E5A;">Crypto Deposits</td>
            <td style="background-color: #3E4E5A;">
                <center><span class="glyphicon glyphicon-error" aria-hidden="true"></span></center>
            </td>
        </tr>
        <tr>
            <td style="background-color: #212E38;">Crypto Withdrawals</td>
            <td style="background-color: #212E38;">
                <center><span class="glyphicon glyphicon-error" aria-hidden="true"></span></center>
            </td>
        </tr>
        <tr>
            <td style="background-color: #3E4E5A;">Fiat Deposits</td>
            <td style="background-color: #3E4E5A;">
                <center><span class="glyphicon glyphicon-error" aria-hidden="true"></span></center>
            </td>
        </tr>
        <tr>
            <td style="background-color: #212E38;">Fiat Withdrawals</td>
            <td style="background-color: #212E38;">
                <center><span class="glyphicon glyphicon-error" aria-hidden="true"></span></center>
            </td>
        </tr>
        <tr>
            <td style="background-color: #212E38;">Trading</td>
            <td style="background-color: #212E38;">
                <center><span class="glyphicon glyphicon-error" aria-hidden="true"></span></center>
            </td>
        </tr>
    </tbody>
</table>
<p><strong>To obtain Verification Level 1, submit the following documents:</strong></p>
<ul>
    <li>A list of documents that a client must submit or other requirements that must be met for receiving Level 1.</li>
</ul>
```

</details>

{% hint style="info" %}
To mark an operation as enabled for this verification level, change `glyphicon glyphicon-error` to `glyphicon glyphicon-success` in the HTML code.
{% endhint %}

The level description will be displayed in the B2CORE UI as follows:

<figure><img src="https://514898401-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGoRxAprhHu1goANW7FXt%2Fuploads%2Fgit-blob-0b1cddc877ad1699349eecb0cdac086b4175d411%2Fhtml-code-for-verification-level-description.png?alt=media" alt="The level description in the B2CORE UI"><figcaption><p>The level description in the B2CORE UI</p></figcaption></figure>

## How to restrict the use of verification levels by client type

To configure separate verification procedures, for example for individual clients and corporate clients, indicate the levels that can be obtained only by clients of a specific type.

To apply client type restrictions to a verification level:

{% stepper %}
{% step %}
Navigate to **Verification** > **Levels**.
{% endstep %}

{% step %}
Select the verification level, and click **Edit**.
{% endstep %}

{% step %}
On the **Update verification level** page, click the **Actions** button, and select **Client type restriction**.
{% endstep %}

{% step %}
In the **Restrictions** popup, fill in the following fields:

* In the **Enabled** dropdown, select **Yes**.
* In the **Type** dropdown, select either of the two options:
  * **Allow only** — to allow the use of the verification level only for a specific client type.
  * **Deny only** — to prohibit the use of the verification level for a specific client type.
* In the **Rule** dropdown, select the client type to which you want to apply the selected rule.
  {% endstep %}

{% step %}
Click **Save** to apply the changes.
{% endstep %}
{% endstepper %}

### Example

Suppose that both *individual* and *corporate* clients are assigned the default `Level 0` after they sign up to the B2CORE UI.

The following levels should be configured to support separate verification procedures for clients, based on **client type**:

* Individual clients: `Level 0` → `Level 1` → `Level 2`

  Client type restriction: **Allow only** = `individual`
* Corporate clients: `Level 0` → `Level 3` → `Level 4`

  Client type restriction: **Allow only** = `corporate`

The next level that a client is allowed to obtain is the level with the next higher index according to the applied restrictions by client type.

This may be useful when you want to use different [KYC providers](https://docs.b2core.b2broker.com/integrations/kyc-providers) for running verification procedures for individual and corporate clients.

## How to restrict the use of verification levels by jurisdiction or country

To configure more specific verification procedures, you can restrict the use of verification levels based on a client’s jurisdiction or country.

To apply such restrictions to a verification level:

{% stepper %}
{% step %}
Navigate to **Verification** > **Levels**.
{% endstep %}

{% step %}
Select the verification level, and click **Edit**.
{% endstep %}

{% step %}
On the **Update verification level** page, click the **Actions** button, and select:

* **Jurisdiction restriction** — to apply the restriction based on the client’s jurisdiction.
* **Country restriction** — to apply the restriction based on the client’s country.
  {% endstep %}

{% step %}
In the **Restrictions** popup, fill in the following fields:

* In the **Enabled** dropdown, select **Yes**.
* In the **Type** dropdown, select either of the two options:
  * **Allow only** — to allow the use of the verification level only for the selected jurisdictions or countries.
  * **Deny only** — to prohibit the use of the verification level for the selected jurisdictions or countries.
* In the **Rule** dropdown, select one or more jurisdictions or countries to which you want to apply the rule.
  {% endstep %}

{% step %}
Click **Save** to apply the changes.
{% endstep %}
{% endstepper %}

### Example

Suppose that both *individual* and *corporate* clients are initially assigned the default `Level 0` after signing up to the B2CORE UI.

The following levels should be configured to support separate verification procedures for clients, based on **client type** and **jurisdiction**:

* Individual clients in the **EU**: `Level 0` → `Level 1` → `Level 2`

  Client type restriction: **Allow only** = `individual` and Jurisdiction restriction: **Allow only** = `EU`

  These levels are accessible only to individual clients from the **EU** jurisdiction.
* Individual clients in **CY** (Cyprus): `Level 0` → `Level 3` → `Level 4`

  Client type restriction: **Allow only** = `individual` and Jurisdiction restriction: **Allow only** = `CY`

  These levels are accessible only to individual clients from the **CY** jurisdiction.
* Corporate clients in the **EU**: `Level 0` → `Level 5` → `Level 6`

  These levels are accessible only to corporate clients from the **EU** jurisdiction.

  Client type restriction: **Allow only** = `corporate` and Jurisdiction restriction: **Allow only** = `EU`
* Corporate clients in **CY** (Cyprus): `Level 0` → `Level 7` → `Level 8`

  Client type restriction: **Allow only** = `corporate` and Jurisdiction restriction: **Allow only** = `CY`

  These levels are accessible only to corporate clients from **CY** jurisdiction.

The next level that a client is allowed to obtain is the level with the next higher index according to the applied restrictions by client type and jurisdiction.

## How to create permission levels

Permission levels are a set of operations that clients are allowed to make in the B2CORE UI. The permission levels are associated with verification levels. When clients obtain a particular verification level, they are granted the permissions associated with this verification level.

To create a permission level:

{% stepper %}
{% step %}
Navigate to **System** > **Client Rights**, and click **+Create** in the upper-right corner of the page.
{% endstep %}

{% step %}
In the **Create role** window that is displayed, fill in the following fields:

* **Name** — specify the name of the verification level, which should not include any capital letters.
* **Caption** — specify the permission level description.
  {% endstep %}

{% step %}
Click **Save** to create the permission level.
{% endstep %}

{% step %}
Click the **Edit** button located in the permission level row.
{% endstep %}

{% step %}
In the **Parent Role** dropdown, select a previous permission level that clients must obtain before they can get this level. This field doesn't apply to the default permission level.
{% endstep %}

{% step %}
Select the permissions that you want to grant to your clients at this level:

* **Verification** — if selected, clients are allowed to obtain a higher verification level in the B2CORE UI.
* **Converter** — if selected, clients can exchange funds in the B2CORE UI.
* **Deposits** — if selected, clients can deposit funds in the B2CORE UI.
* **Withdrawals** — if selected, clients can withdraw funds in the B2CORE UI.
* **Internal Transfers** — if selected, funds can be transferred from one client to another within the same B2CORE system.
  {% endstep %}

{% step %}
Click **Save** to apply the changes.
{% endstep %}
{% endstepper %}

## How to set up deposit, withdrawal, and transfer limits by verification levels

For each verification level, you can limit the amounts that clients who are granted this level can deposit, withdraw, and transfer.

{% hint style="info" %}
All limit values are calculated in USD.
{% endhint %}

To set up limits for a particular level:

{% stepper %}
{% step %}
Navigate to **Verification** > **Levels**.
{% endstep %}

{% step %}
Select a verification level for which you want to set up limits, and then click the **Edit** button located in the level row.
{% endstep %}

{% step %}
On the **Update verification level** page, fill in the fields displayed under the **Limits** section:

* To limit the amount that clients can deposit per day, specify the maximum allowed value in the **Daily deposit** field.
* To limit the amounts that clients can withdraw per day and per month, specify the maximum allowed values in the **Daily withdraw** and **Monthly withdraw** fields.
* To set the minimum amount that clients can transfer from their wallets to trading accounts, specify the **Transfer min.** field. It won’t be allowed to transfer amounts that are less than the assigned limit.
* To allow clients to withdraw certain amounts without obtaining approvals, specify the maximum allowed amount in the **Auto withdraw** field. The amounts that do not exceed the assigned limit can be withdrawn by clients automatically (without the admin approval).
* To set the maximum allowed amount for internal transfer operations per day, specify the **Daily internal transfer** field. If a client wants to make an internal transfer after reaching a specified limit, a request for the internal transfer is created and must be approved by an admin.

{% hint style="info" %}
If a client makes an internal transfer to or from an MT account, the MT platform settings override the **Daily internal transfer** option.

If the **Request required for transfer from** and **Request required for transfer to** options are enabled for the MT platform, the **Daily internal transfer** option is ignored, and requests for internal transfers are always created and must be approved by an admin.
{% endhint %}

To apply no limits, enter **-1** in the corresponding field described above. To prohibit clients from making a specific transaction, enter **0** in the corresponding field described above.
{% endstep %}

{% step %}
Click **Save** to apply the changes.
{% endstep %}
{% endstepper %}

{% hint style="success" %}
**See also**

[How to use SumSub](https://docs.b2core.b2broker.com/how-to-articles/manage-verification-options/how-to-use-sumsubstance)

[How to use ShuftiPro](https://docs.b2core.b2broker.com/how-to-articles/manage-verification-options/how-to-use-shuftipro)
{% endhint %}
