Spain Official Census And Utility Services

Spain eKYC non-doc verification leverages Spain's source of truth to validate individuals. It is essential in eKYC processes for ensuring identity authenticity, regulatory compliance, and enhanced security. It helps prevent fraud, boosts user trust, and streamlines operations through automated and efficient verification methods.

Integration

User Input Flow

eKYC module configuration gives various options to specify different search criteria with various sources of truth for each country (eg. US has multiple via Telco, Credit Bureau, and Driver's License). User data can be collected via a user input flow by using pre-selected fields where users can type in their name or date of birth, etc. See an example below:

eKYC user input flow example

Module configuration

The module configuration can be leveraged to select the applicable fields for the input data you would like to collect from the end user.

eKYC module configuration

Direct API Approach

All module configurations and user data can be forwarded directly in the request for performing an eKYC search. This will override existing configuration and data collected about the user.

📘

API Authentication

All endpoints require authentication headers to be specified as stated in Incode API Documentation

POST /omni/externalVerification/kyc

This endpoint performs an eKYC check for the individual specified. Note: Endpoint can have empty body {} and in that case information will be pulled from module configuration and session details.

  • country: (mandatory) String. Two letter Alpha-2 country code. (Must be ES).
  • taxID: (mandatory) This can be optional, but we want to keep idNum as mandatory on Incode side as it is a logical requirement for KYC. In Spain, ID is 9-characters, consisting of 8 digits followed by a letter.
  • firstName:: (mandatory) String. First name of the individual.
  • middleName:: (optional) String.
  • surName: (mandatory) String. Last name of the individual.
  • houseNo: (optional) String. House number (address2 recommended value house no.)
  • street: (optional) String. Address1 recommended value street name.
  • city: (optional) String. City of the individual's address. (eg. Madrid).
  • state: (optional) String. (eg. Comunidad de Madrid)
  • postalCode: (optional) String. postalCode formatted based on per-country postalCode basis.
  • dateOfBirth: (optional) String. Format: yyyy-mm-dd (eg. 1980-06-01)
  • phone: (optional) String.

Example Incode request:

{
    "plugins": "kyc", // mandatory
	  "source": "ES_1" ,//new eKYC source that routes to ES2 for IDMerit //mandatory
    "firstName": "Iker", //mandatory first_name refers to Nombre (First Name).
    "middleName": "", //optional - middle_name refers to Apellido1 (Father's last name).
    "surName": "Casillas ", //mandatory last_name refers to Apellido2 (Mother's last name).
    "houseNo": "45", //optional
    "street": "Calle de Alcalá", // optional
    "city" : "Madrid", // optional
    "state" : "Comunidad de Madrid", // optional
    "postalCode": "94014", // optional
    "country": "ES", //mandatory 
    "dateOfBirth" : "1991-08-02", // optional
    "phone": "612345678", // optional
    "idNum": "12345678Z" // mandatory DNI 
}

Direct API Response

📘

API Authentication

All endpoints require authentication headers to be specified as stated in Incode API Documentation

Note: Endpoint can have empty body {} and in that case information will be pulled from module configuration and session details.


Example Incode response:

{
    "kyc": [
        {
            "key": "firstNameMatch",
            "status": "Exact"; 
        },
        {
            "key": "middleNameMatch",
            "status": "Exact"
        },
        {
            "key": "lastNameMatch",
            "status": "Approximate Match"
        },
        {
            "key": "fullNameMatch",
            "status": "Fuzzy"
        },
        {
            "key": "dobMatch",
            "status": "Exact"
        },
        {
            "key": "streetMatch",
            "status": "Exact"
        },
        {
            "key": "cityMatch",
            "status": "Exact"
        },
        {
            "key": "stateMatch",
            "status": "Exact"
        },
        {
            "key": "postalCodeMatch",
            "status": "Exact"
        },
        {
            "key": "fullAddressMatch",
            "status": "Fuzzy"
        },
        {
            "key": "idNumMatch",
            "status": "Exact"
        },
        {
            "key": "phoneMatch",
            "status": "No Match"
        },
        {
            "key": "overallLevel",
            "status": "Low"
        }
    ]
}

Please refer to error response to see conventional HTTP response codes to indicate the success or failure of an API request. For Spain, custom 400 error messages if taxId, or country is “ “ or null:

message: taxId, and country are minimum required fields.


Incode API Key

Status

Definition

firstNameMatch

exact, fuzzy, nomatch

Matches first name submitted against the name associated to the value in the source of truth.

middleNameMatch

exact, fuzzy, nomatch, nodata [NEW]

Matches middle name submitted against the name associated to the value in the source of truth.

lastNameMatch [NEW]

exact, fuzzy, nomatch

Matches last name submitted against the name associated to the value in the source of truth.

fullNameMatch [NEW] (first_name, last_name, middle_name)

exact, fuzzy, nomatch

Matches full name (first_name, last_name, middle_name) submitted against the full name associated to the value in the source of truth.

dobMatch [NEW]

exact, fuzzy, nomatch, nodata [NEW]

Matches date of birth submitted against the date of birth associated to the value in the source of truth

streetMatch [NEW]

exact, fuzzy, nomatch, nodata [NEW]

Matches street submitted against the street associated to the value in the source of truth (address1)

houseNoMatch [NEW]

exact, fuzzy, nomatch, nodata [NEW]

Matches house number submitted against the house number associated to the value in the source of truth (address2)

streetAddressMatch [NEW] (address1, address2)

exact, fuzzy, nomatch, nodata [NEW]

Matches address1, address2 submitted against the address1, address2 associated to the value in the source of truth

cityMatch [NEW]

exact, fuzzy, nomatch, nodata [NEW]

Matches city submitted against the city associated to the value in the source of truth

stateMatch [NEW]

exact, fuzzy, nomatch, nodata [NEW]

Matches state submitted against the state associated to the value in the source of truth

postalCodeMatch [NEW]

exact, fuzzy, nomatch, nodata [NEW]

Matches postal code submitted against the postal code associated to the value in the source of truth

fullAddressMatch [NEW] (StreetAddressMatch, cityMatch, postalCodeMatch)

exact, fuzzy, nomatch, nodata [NEW]

Matches full address (address1, address2, city, zip) submitted against the full address associated to the value in the source of truth

idNumMatch [NEW]

exact, fuzzy, nomatch, nodata [NEW]

Matches id number submitted against the id number associated to the value in the source of truth

phoneMatch

exact, fuzzy, nomatch, nodata [NEW]

Matches phone submitted against the phone associated to the value in the source of truth

overallLevel

low, medium, high

Overall Risk Level is focused on the risk associated to the submitted full name and id number

See context below for more information around how low, medium, and high are calculated


overallLevel

Overall Risk Level is focused on the risk associated to the submitted full name and id number. The fields low, medium, and high are mapped to a proprietary fuzzy matching algorithm.The overall level is "low" if the full name and identification number match the values ​​for the full name and identification number found in the source of truth.


Single Session Dashboard Result

eKYC Single Session Dashboard result