# 06-Verify-Names



06-Verify-Names [#06-verify-names]

General Rules [#general-rules]

* General rule for name is to separate the surname and given name when entering the name of a natural person.
* Use PascalCase for the following objects: `Originator`, `Beneficiary`, `OriginatorVASP`, and `BeneficiaryVASP`. All other fields should follow camelCase.
* The field `primaryIdentifier` must always be present with a value, whereas `secondaryIdentifier` must always be present but may be left empty.
* Unless otherwise specified, all field values are case-insensitive.
* When validating names, whitespace should be removed before comparison.
* All field values must be expressed as UTF-8 encoded strings, including booleans, integers, and floats.
* Unless Korean is explicitly allowed, all values must be entered in English.
* If there is no official English name, the Korean name must be transliterated according to the official [Korean Romanization](https://www.korean.go.kr/front_eng/roman/roman_01.do).

1\. Separating the First Name & Last Name [#1-separating-the-first-name--last-name]

<Mermaid
  chart="flowchart TD
    subgraph Example [&#x22;Example: Eugene Lee&#x22;]
        direction LR
        User((User Icon))
        Data[&#x22;<b>Name: Eugene Lee</b><br/>VASP A: first name: 'LeeEugene', last name: ''<br/>VASP B: first name: 'EugeneLee', last name: ''<br/>VASP C: first name: 'Eugene', last name: 'Lee'&#x22;]
        User --- Data
    end

    subgraph Comparison [&#x22;Comparison Results&#x22;]
        direction TB
        
        %% Table Headers
        H_Empty[&#x22; &#x22;]
        H_FL[&#x22;<b>First → Last</b>&#x22;]
        H_LF[&#x22;<b>Last → First</b>&#x22;]

        %% Row 1: A vs B
        Row1_Label[&#x22;<b>Fix A examine B</b>&#x22;]
        R1C1[&#x22;LeeEugene vs EugeneLee<br/>(🔴 Mismatch)&#x22;]
        R1C2[&#x22;LeeEugene vs EugeneLee<br/>(🔴 Mismatch)&#x22;]

        %% Row 2: A vs C
        Row2_Label[&#x22;<b>Fix A examine C</b>&#x22;]
        R2C1[&#x22;LeeEugene vs EugeneLee<br/>(🔴 Mismatch)&#x22;]
        R2C2[&#x22;LeeEugene vs LeeEugene<br/>(🟢 Match)&#x22;]

        %% Layout Connections (Grid simulation)
        H_FL --- R1C1 --- R2C1
        H_LF --- R1C2 --- R2C2
        Row1_Label --- R1C1
        Row2_Label --- R2C1
    end

    %% Styling
    style R2C2 fill:#d2e9e9,stroke:#5fb8b8,stroke-width:2px
    style R1C1 fill:#f9d7d7,stroke:#f0a8a8
    style R1C2 fill:#f9d7d7,stroke:#f0a8a8
    style R2C1 fill:#f9d7d7,stroke:#f0a8a8
    style Comparison fill:#fcfcfc,stroke:#333
    style Example fill:#fcfcfc,stroke:#333"
/>

Since the components and order of names vary by country, VASPs (Virtual Asset Service Providers) often have different verification policies. Therefore, separating the surname and given name allows for flexibility in combining them in different orders, which can improve verification accuracy. If the surname and given name are treated as a single field, it becomes difficult to verify the name in cases where the order differs, as in the example above.

Therefore, if you are using an external KYC solution, it is recommended to verify how the user's name data is being handled, ensure that the surname and given name are separated, and, if applicable, also store the user's Local name.

2\. Name Normalization [#2-name-normalization]

1. Split surname and given name
2. Convert all alphabetic characters to lowercase
3. Remove special characters, numbers, and whitespace
4. Reverse the order of surname and given name

> \[!NOTE]
> **Example** — Name: `Jean-Luc O'Connor`
>
> | Step                   | Surname                                                                                 | Given Name |
> | ---------------------- | --------------------------------------------------------------------------------------- | ---------- |
> | Original               | `O'Connor`                                                                              | `Jean-Luc` |
> | Lowercase              | `o'connor`                                                                              | `jean-luc` |
> | Remove special chars   | `oconnor`                                                                               | `jeanluc`  |
> | Combined (both orders) | `jeanluc` + `oconnor&#x60; → &#x2A;*`jeanlucoconnor`*&#x2A; & &#x2A;*`oconnorjeanluc`** |            |

Name verification may fail when communicating with certain Korean exchanges if names contain special characters, numbers, or spaces. To avoid any potential issues, it is recommended to remove all special characters, numbers, and spaces from names before processing.

3\. Name Notation as an Originating VASP [#3-name-notation-as-an-originating-vasp]

3-1. Natural Person [#3-1-natural-person]

<Mermaid
  chart="graph TD
%% Global Styling
    classDef Array fill:#d1ecf1,stroke:#0c5460,color:#000;
    classDef String fill:#f8d7da,stroke:#842029,color:#000;
    classDef Decision fill:#eeeeee,stroke:#999999,color:#000,border-radius:20px;

    Root[&#x22;User Name&#x22;]
    MainDecision[&#x22;Is Beneficiary VASP Registered in Korea?<br/>('countryOfRegistration' = 'KR')&#x22;]

    Root --> MainDecision

%% Left Branch: Not Registered in Korea (No)
    subgraph Not_In_Korea [Beneficiary VASP Not in Korea]
        L_NameId[&#x22;'nameIdentifier'<br/>= English Name&#x22;]

        L_Req[&#x22;'primaryIdentifier': '',<br/>'secondaryIdentifier': ''&#x22;]

        L_Dec1[&#x22;Is the surname separated from the given name?&#x22;]
        L_Opt1_No[&#x22;'primaryIdentifier': 'Full Name',<br/>'secondaryIdentifier': ''&#x22;]
        L_Opt1_Yes[&#x22;'primaryIdentifier': 'Last Name',<br/>'secondaryIdentifier': 'First Name'&#x22;]

        L_LocalId[&#x22;'localNameIdentifier'<br/>= Local Name&#x22;]

        L_Dec2[&#x22;Is the surname separated from the given name?&#x22;]
        L_Opt2_No[&#x22;'primaryIdentifier': 'Full Name',<br/>'secondaryIdentifier': ''&#x22;]
        L_Opt2_Yes[&#x22;'primaryIdentifier': 'Last Name',<br/>'secondaryIdentifier': 'First Name'&#x22;]
    end

%% Right Branch: Registered in Korea (Yes)
    subgraph In_Korea [Beneficiary VASP In Korea]
        R_NameId[&#x22;'nameIdentifier'<br/>= Local Name&#x22;]

        R_Req[&#x22;'primaryIdentifier': '',<br/>'secondaryIdentifier': ''&#x22;]

        R_Dec1[&#x22;Is the surname separated from the given name?&#x22;]
        R_Opt1_No[&#x22;'primaryIdentifier': 'Full Name',<br/>'secondaryIdentifier': ''&#x22;]
        R_Opt1_Yes[&#x22;'primaryIdentifier': 'Last Name',<br/>'secondaryIdentifier': 'First Name'&#x22;]

        R_LocalId[&#x22;'localNameIdentifier'<br/>= English Name&#x22;]

        R_Dec2[&#x22;Is the surname separated from the given name?&#x22;]
        R_Opt2_No[&#x22;'primaryIdentifier': 'Full Name',<br/>'secondaryIdentifier': ''&#x22;]
        R_Opt2_Yes[&#x22;'primaryIdentifier': 'Last Name',<br/>'secondaryIdentifier': 'First Name'&#x22;]
    end

%% Flow Connections
    MainDecision -- &#x22;No (Red Path)&#x22; --> L_NameId
    MainDecision -- &#x22;Yes (Blue Path)&#x22; --> R_NameId

%% Not In Korea Flow
    L_NameId -- &#x22;No&#x22; --> L_Req
    L_NameId -- &#x22;Yes&#x22; --> L_Dec1
    L_Dec1 -- &#x22;No&#x22; --> L_Opt1_No
    L_Dec1 -- &#x22;Yes&#x22; --> L_Opt1_Yes

    L_Req -- &#x22;Required&#x22; --> L_LocalId
    L_Opt1_No -- &#x22;Optional&#x22; --> L_LocalId
    L_Opt1_Yes -- &#x22;Optional&#x22; --> L_LocalId

    L_LocalId --> L_Dec2
    L_Dec2 -- &#x22;No&#x22; --> L_Opt2_No
    L_Dec2 -- &#x22;Yes&#x22; --> L_Opt2_Yes

%% In Korea Flow
    R_NameId -- &#x22;No&#x22; --> R_Req
    R_NameId -- &#x22;Yes&#x22; --> R_Dec1
    R_Dec1 -- &#x22;No&#x22; --> R_Opt1_No
    R_Dec1 -- &#x22;Yes&#x22; --> R_Opt1_Yes

    R_Req -- &#x22;Required&#x22; --> R_LocalId
    R_Opt1_No -- &#x22;Optional&#x22; --> R_LocalId
    R_Opt1_Yes -- &#x22;Optional&#x22; --> R_LocalId

    R_LocalId --> R_Dec2
    R_Dec2 -- &#x22;No&#x22; --> R_Opt2_No
    R_Dec2 -- &#x22;Yes&#x22; --> R_Opt2_Yes

%% Applying Classes
    class L_NameId,L_LocalId,R_NameId,R_LocalId Array;
    class L_Req,L_Opt1_No,L_Opt1_Yes,L_Opt2_No,L_Opt2_Yes String;
    class R_Req,R_Opt1_No,R_Opt1_Yes,R_Opt2_No,R_Opt2_Yes String;
    class MainDecision,L_Dec1,L_Dec2,R_Dec1,R_Dec2 Decision;"
/>

3-1-1. Language Rule [#3-1-1-language-rule]

* Enter 'nameIdentifier' in English.
* If the beneficiary's name is in Korean(other than English) enter the name in the 'localNameIdentifier' element. However, even in this case, it is recommended to provide a 'nameIdentifier' with a legal English name.
* If there is no English name, enter `""` for `nameIdentifier` as shown below.

```json
{
  "name": {
    "nameIdentifier": [
      {
        "primaryIdentifier": "",
        "secondaryIdentifier": "",
        "nameIdentifierType": "LEGL"
      }
    ],
    "localNameIdentifier": [
      {
        "primaryIdentifier": "로버트 반스",
        "secondaryIdentifier": "",
        "nameIdentifierType": "LEGL"
      }
    ]
  }
}
```

3-1-2. When Names can be Separated [#3-1-2-when-names-can-be-separated]

* Enter the last name in 'primaryIdentifier'.
* Enter the first name in 'secondaryIdentifier'.

3-1-3. When Names can NOT be Separated [#3-1-3-when-names-can-not-be-separated]

* Enter the full name in 'primaryIdentifier' based on VASP DB. For English, enter the name in the order of first name and last name. For Korean, enter the name in the order of last name and first name. If you cannot identify first name and last name, then enter the same value as the value in the DB.
* Do not enter anything in 'secondaryIdentifier'.

3-2. Legal Person [#3-2-legal-person]

For legal entities, it is necessary to provide both the entity's name and the name of its representative(The CEO). This requirement applies to both the sending and receiving of virtual assets.

The IVMS101 standard does not include a dedicated element for the representative's information within the 'legalPerson'. Therefore, the representative's information should be recorded as follows:

* The 'originatorPersons' or 'beneficiaryPersons' fields are arrays of the Person type. The first element of the array must always contain the information of the legal person.
* From the second element onwards, enter the personal information of the representative ('naturalPerson').
* Even if there are multiple representatives, all the information of representatives should be entered.

4\. Verifying Names as a Beneficiary VASP [#4-verifying-names-as-a-beneficiary-vasp]

4-1. Comparing Natural Person Names [#4-1-comparing-natural-person-names]

<Mermaid
  chart="graph TD
%% Node Definitions
    Start[&#x22;'nameIdentifier' of 'Beneficiary'&#x22;]
    Retrieve[&#x22;Retrieve Users Data&#x22;]

    Step1[&#x22;❶ Concatenate 'primaryIdentifier' & 'secondaryIdentifier'&#x22;]
    Step2[&#x22;❷ Concatenate User's First Name & Last Name&#x22;]

    Comp1[&#x22;Compare ❶ & ❷&#x22;]

    Step3[&#x22;❸ Reverse User's First Name & Last Name&#x22;]
    Comp2[&#x22;Compare ❶ & ❸&#x22;]

    LocalID[&#x22;'localNameIdentifier' of 'Beneficiary'&#x22;]
    Step4[&#x22;❹ Concatenate 'primaryIdentifier' & 'secondaryIdentifier'&#x22;]

    Comp3[&#x22;Compare ❹ & ❷&#x22;]
    Comp4[&#x22;Compare ❹ & ❸&#x22;]

    Proceed[&#x22;Proceed to next step&#x22;]
    Mismatch[&#x22;Name Mismatch&#x22;]

%% Flow Connections
    Start --> Retrieve
    Retrieve --> Step1
    Step1 --> Step2
    Step2 --> Comp1

    Comp1 -- &#x22;Yes&#x22; --> Proceed
    Comp1 -- &#x22;No&#x22; --> Step3

    Step3 --> Comp2
    Comp2 -- &#x22;Yes&#x22; --> Proceed
    Comp2 -- &#x22;No&#x22; --> LocalID

    LocalID --> Step4
    Step4 --> Comp3

    Comp3 -- &#x22;Yes&#x22; --> Proceed
    Comp3 -- &#x22;No&#x22; --> Comp4

    Comp4 -- &#x22;Yes&#x22; --> Proceed
    Comp4 -- &#x22;No&#x22; --> Mismatch

%% Styling based on original image legend
    classDef requestData fill:#d1ecf1,stroke:#0c5460,color:#000;
    classDef databaseData fill:#f8d7da,stroke:#842029,color:#000;
    classDef logicStep fill:#e9ecef,stroke:#495057,color:#000,border-radius:20px;

    class Start,Step1,LocalID,Step4 requestData;
    class Retrieve,Step2,Step3 databaseData;
    class Comp1,Comp2,Comp3,Comp4 logicStep;

%% Explanatory Comments
%% Blue Arrows represent the 'Yes' path in the original image.
%% Red Arrows represent the 'No' path in the original image."
/>

When verifying an individual's name, both the 'nameIdentifier' and 'localNameIdentifier' objects must be validated. First, compare the 'nameIdentifier'. If it does not match, then compare the 'localNameIdentifier'.
※Note: The 'localNameIdentifier' may contain user information, so there could be cases where the 'nameIdentifier' is blank.

The verifying VASP queries the user information in its database based on the wallet address provided in the request and compares it with the name of the actual owner of that address.

For accurate comparison, combining the 'primaryIdentifier' and 'secondaryIdentifier' (first name and last name) and comparing all possible combinations are recommended. In some cases, the counterpart VASP may not separate the name into first name and last name, and might send the entire name in the 'primaryIdentifier'. In this scenario, since the counterpart's data will not change regardless of the order, 'we' should separate the user's name into first name and last name and compare it in different orders. This comparison should be performed as a single UTF-8 string, ignoring spaces (' ') and case differences.
※If the names are not separated, assume the order is surname first and given name second for Korean names, and given name first and surname second for English names.

4-2. Comparing Legal Person Names [#4-2-comparing-legal-person-names]

The originating VASP sends both the legal entity's name and the name of one representative. Therefore, the beneficiary VASP must compare both the legal entity's name and the individual's name, ensuring that both match.

The legal entity's name should be entered as it appears in official registration. Using a service name or any other name might result in verification(A legal name mismatch stored in beneficiary's database can lead to rejection). In case of failure, adding a process to remove specific strings like "Inc." or "Ltd." and retry verification is recommended.

The process of comparing the representative's name is just the same as comparing natural person's name.
