Available via API | Available via SDK | Needs configuration on Veriff's side | Needs a separate integration | Needs a separate webhook |
|---|---|---|---|---|
Metadata Database Verification validates end-user identity data (name, DOB, address, national ID, phone, document numbers, etc) against authoritative external government, consumer, credit bureau, utility, and phone registry databases across via the DataZoo aggregation platform. It returns field-level validation statuses for granular, programmable decision-making.
*This solution can be:
an add-on to your document-based Identity Verification (IDV), or
used separately as a stand-alone check. In this case a separate integration is needed, the whole flow is done over the API and you need to input all the data in initData.
All session-related info is returned via decision webhook and can be polled from different API endpoints. The results of the verification can also be viewed in the Veriff Customer Portal, in the Webhook tab.
Contact your solutions engineer for info and configuration.
Prerequisites
You have an integration set up with Veriff
The database check is configured for that integration by your Solutions Engineer
You have configured the decision webhook to get responses from Veriff (see the how-to in webhooks' Set up webhooks section)
If using the API, you are ready to collect and send Veriff your end-user's data
The data you need to send when creating a session depends on the database. Check regional databases' documentation for the exact list of fields.
Key terminology
Term | Description |
|---|---|
DataZoo | Third-party registry aggregation platform that Veriff uses to query government and commercial databases worldwide |
Registry | A specific external database source (e.g., "Australia Consumer", "Chile National ID") |
Registry Key | The identifier for each registry result in the webhook, formatted as In the examples below, indicated as placeholder |
initData | The data object sent by the customer in the |
End-user data sources
The "end-user data sources" refer to the origins from which the end-user's information can be collected for database verification. This solution is performed using initData.
InitData
This is data that you provide when creating a verification session, i.e. the parameters you specify in the POST /sessions request. Includes information like names, date of birth, address, phone number, ID number, gender etc.
General overview of the parameters sent via initData:
person.firstName:stringEnd-user's first nameperson.lastName:stringEnd-user's last nameperson.fullName:stringEnd-user’s first and last nameperson.dateOfBirth:stringDate of birth inYYYY-MM-DDformatperson.middleName:stringMiddle nameperson.gender:stringGender (M/F)person.email:stringEmail addressperson.phoneNumber:stringMobile phone numberperson.landLinePhoneNumber:stringLandline phone numberperson.idNumber:stringNational ID numberperson.partnerFirstName:stringPartner’s first nameperson.partnerLastName:stringPartner’s last nameperson.marriageDateOfEvent:stringMarriage dateperson.secondLastName:stringSecond last namedocument.number:stringDocument numberdocument.country:stringDocument issuing country (ISO 3166-1 alpha-2)document.validFrom:stringDocument issue/valid-from datedocument.validUntil:stringDocument expiry datedocument.cardNumber:stringPhysical card numberdocument.cardType:stringCard typedocument.stateOfIssue:stringState of issuedocument.referenceNumber:stringReference numberdocument.registrationNumber:stringRegistration numberdocument.version:stringDocument versionaddress.fullAddress:stringFull address stringaddress.street:stringStreet nameaddress.neighbourhood:stringUsually an unofficial neighbourhood nameaddress.city:stringCity nameaddress.state:stringA first-level administrative divisionaddress.postcode:stringPostcode numberconsents:arrayList of consent objectstype:stringConsent type (generalordvs)approved:booleanWhether consent was obtained
The data you need to send when creating a session depends on the database. Check regional databases' documentation for the exact list of fields.
Flow overview
Database flow
Step 1: you input end-user's data (initData) in POST /sessions API call
Step 2: system queries the appropriate database(s) based on country/region
Step 3: validation analysis, aka field-by-field comparison between input data and registry data, leading to validation of multiple data points (name, DOB, address, etc.)
Step 4: validation decision
Step 5: webhook is sent, containing:
Validation conclusion per field sent and supported by registry
Info about decision influence based on selected compared fields
Session flow
This solution is available only via API. You are responsible for gathering and passing all required initData.
Use via API
Generate a verification session using the
API keysand thebaseURLof your integration (see the API Documentation and API Reference[↗] how to find these)Check each database's documentation to see which initData parameters are required and allowed to be sent.
Patch session status to
submittedstatus using PATCH /sessions/{sessionId}[↗] callThis endpoint requires endpoint level authentication via
x-hmac-signatureheader. See HMAC Authentication and Endpoint Security article for general info about signature creation.
Sample request payload
curl -X PATCH 'https://stationapi.veriff.com/v1/sessions/fd5c1563-1d23-4b1a-ae46-7ba429927ed8' \
-H 'Content-Type: application/json' \
-H 'X-AUTH-CLIENT: your-api-key' \
-H 'x-hmac-signature: 034c6da2bb31fd9e6892516c6d7b90ebe10f79b47cfb3d155d77b4d9b66e1d53' \
-d '{
"verification": {
"status": "submitted"
}
}'
Database checks are run
Check the decision data and/or session related info from the decision webhook and/or query the data from the GET /decisions endpoint. Check each database's documentation to see an example of the webhook and API response payload.
Find decision and/or session related info
You can get the data from three sources:
Receive the decision webhook webhook (check each database's documentation to see an example)
Query the results via GET sessions/{sessionId}/decision[↗] (payload is identical to webhook’s, check each database's documentation to see an example)
View the session in Veriff Customer Portal > All Verifications > Webhooks tab
The data you see in the webhook / API response payload depends on the database. Check regional databases' documentation for the exact list of fields.
Note about object and field visibility
Some objects and fields within the registryValidations are optional.
You should expect that any key may be omitted from the payload or return a null value.
A field is included in the response only when it is not skipped. If a validation was configured but skipped, it is omitted from the webhook.
Because the response schema is dynamic and based on both your specific configuration and the quality of the initData provided, your application logic must account for omitted keys and null values as a standard part of the verification workflow.
Note on session outcomes
An approved session is identified by a verification.status of approved. Depending on your configuration, a "clean" result may also include:
All configured validations returned
successornot_applicable
If a validation is not enabled, it is omitted from the payload and do not impact the approved status.
Webhook/API response general structure
The example below uses placeholder data to show only the part that is relevant to Metadata Database Verification solution.
{
"status": "success",
"verification": {
"registryValidations": {
"<REGISTRY_KEY>": {
"status": "success | failure | error",
"data": { ... } | null,
"error": null | {
"code": "enum string",
"message": "string"
},
"timestamp": "ISO-8601 string" | null,
"validations": {
"<validation_code>": {
"result": "enum string",
"reason": "string | null"
}
}
}
}
}
}Parameters explained
verification: Parent container for verification resultsregistryValidations: Metadata Database Verification results container<REGISTRY_KEY>: Combination of country code and registry name. Parent container for the specific registry resultsstatus:stringOverall result. Enum:success,failure, orerrordata:object|nullData returned from the registry (e.g., visa details, person status).nullif registry only performs matching without returning dataerror:object|nullStructured error when<REGISTRY_KEY>.statusiserror.nullotherwisetimestamp:string|nullISO-8601 timestamp of registry response, represented asUTC YYYY-MM-DDTHH:MM:SS.SSS+Timezone Offset.nullwhen validation could not be performed.validations:object|nullMap of<validation_code>to the validations matching outcome as shown inresult.nullwhen<REGISTRY_KEY>.statusiserror
Available validation_code values
Note that only non-skipped validations appear in webhook.
processingSystem-level execution statusis_input_validWhether end-user data passed format validation (Note: hasdetailsarray on failure)consent_obtainedWhether required consent was providedidentity_is_validWhether the person was found/verified in the registryfirst_name_matchFirst name comparison resultmiddle_name_matchMiddle name comparison resultlast_name_matchLast name comparison resultfull_name_matchFull name comparison resultfirst_partner_name_matchPartner’s first name comparison resultlast_partner_name_matchPartner’s last name comparison resultdate_of_birth_matchDate of birth comparison resultgender_matchGender comparison resultemail_matchEmail comparison resultphone_number_matchPhone number comparison resultland_line_phone_number_matchLandline phone comparison resultid_number_matchNational ID number comparison resultmarriage_date_of_event_matchMarriage date comparison resultaddress_full_address_matchFull address comparison resultaddress_street_matchStreet comparison resultaddress_city_matchCity comparison resultaddress_state_matchState comparison resultaddress_postcode_matchPostcode comparison resultaddress_neighbourhood_matchNeighbourhood comparison resultdocument_number_matchDocument number comparison resultdocument_card_number_matchCard number comparison resultdocument_version_matchDocument version comparison resultdocument_reference_number_matchReference number comparison resultdocument_valid_from_matchDocument valid-from date comparison result
validation_code.result statuses and meanings
successThe submitted value matches the registry recordfailurewithreason:value_mismatchThe submitted value does not match the registry recordnot_applicablewith:reason: input_not_providedThe input value was not provided for this validationreason: output_not_receivedThe registry did not return data for this field
validation_code.reason values
nullOn successvalue_mismatchProvided value does not match registryinput_not_providedInput value was not providedoutput_not_receivedRegistry didn't return the data pointperson_not_foundPerson not found in registryconsent_not_obtainedRequired consent was not giveninput_invalidInput data failed format validationregistry_unavailableRegistry could not be reachedtechnical_issuesInternal error occurredvalidation_disabledValidation was not configured (these are omitted from webhook)
error.code and error.message values
Note that:
These appear when
statusiserrorerrorisnullwhen registrystatusissuccessorfailure
|
|
|---|---|
| Provider returned unexpected response |
| Internal error occurred |
| Registry request timed out |
Databases by regions
Australia and Oceania
🇦🇺 Australia Residential (AU_RESIDENTIAL)
Source | Input parameters | POST /sessions example |
|---|---|---|
Australia Residential (AU_RESIDENTIAL) | Mandatory
Optional
| With date of birth and other optional data With parsed address fields and other optional data With |
Note that you should send EITHER the date of birth info OR the address info.
To send address info, you can send the data using EITHER parsed
address.street+address.city+address.postcodeparameters OR the full address viafullAddressparameter.Do not sent both date of birth data and address data.
Do not send both parsed address data AND the full address data.
Sample response payload
The following info can be found in decision webhook payload and GET /decision endpoint's payload, in verifications.registryValidations object. Note that the payloads contain more parameters; to find info about them see the decision webhook and GET /decision endpoint's documentation.
{
"AU_RESIDENTIAL": {
"status": "success",
"data": {
"addressElement1": "42 George Street",
"addressElement3": "Sydney",
"addressElement4": "NSW",
"addressElement5": "2000",
"dataSourceScore": 0.95,
"emailAddress": "james.wilson@example.com",
"firstName": "James",
"lastName": "Wilson",
"middleName": "Robert"
},
"validations": {
"processing": {"result": "success", "reason": null},
"is_input_valid": {"result": "success", "reason": null},
"identity_is_valid": {"result": "success", "reason": null},
"first_name_match": {"result": "success", "reason": null},
"last_name_match": {"result": "success", "reason": null},
"middle_name_match": {"result": "success", "reason": null},
"date_of_birth_match": {"result": "success", "reason": null},
"address_full_address_match": {"result": "success", "reason": null},
"email_match": {"result": "not_applicable", "reason": "output_not_received"},
"phone_number_match": {"result": "not_applicable", "reason": "output_not_received"}
},
"error": null,
"timestamp": "2026-04-01T10:00:00Z"
}
}🇦🇺 Australia Citizens (AU_CITIZENS)
Source | Input parameters | POST /sessions example |
|---|---|---|
Australia Citizens (AU_CITIZENS) | Mandatory
Conditionally required in addition to mandatory data
Optional
| Group A Group B with parsed address fields Group B with |
To send address info, you can send the data using EITHER parsed
address.street+address.postcodeparameters OR the full address viafullAddressparameter.Do not send both parsed address data AND the full address data.
Sample response payload
The following info can be found in decision webhook payload and GET /decision endpoint's payload, in verifications.registryValidations object.
{
"AU_CITIZENS": {
"status": "success",
"data": {
"addressElement1": "15 Queen Street",
"addressElement3": "Brisbane",
"addressElement4": "QLD",
"addressElement5": "4000",
"dataSourceScore": 0.92,
"documentNo": true,
"firstName": "Sarah",
"lastName": "Thompson",
"middleName": "Jane"
},
"validations": {
"processing": {"result": "success", "reason": null},
"is_input_valid": {"result": "success", "reason": null},
"identity_is_valid": {"result": "success", "reason": null},
"first_name_match": {"result": "success", "reason": null},
"last_name_match": {"result": "success", "reason": null},
"date_of_birth_match": {"result": "success", "reason": null},
"address_full_address_match": {"result": "success", "reason": null}
},
"error": null,
"timestamp": "2026-04-01T10:10:00Z"
}
}🇦🇺Australia Consumer (AU_CONSUMER)
Source | Input parameters | POST /sessions example |
|---|---|---|
Australia Consumer (AU_CONSUMER) | Mandatory
Optional
| With parsed address elements With |
To send address info, you can send the data using EITHER parsed
address.street+address.neighbourhood+address.city+address.state+address.postcodeparameters OR the full address viafullAddressparameter.Do not send both parsed address data AND the full address data.
Sample response payload
The following info can be found in decision webhook payload and GET /decision endpoint's payload, in verifications.registryValidations object.
"AU_CONSUMER": {
"status": "success",
"data": {
"addressElement1": "8 Pitt Street",
"addressElement3": "Sydney",
"addressElement4": "NSW",
"dateOfBirth": "1975-06-20",
"emailAddress": "m.brown@example.com",
"firstName": "Michael",
"lastName": "Brown"
},
"validations": {
"processing": {"result": "success", "reason": null},
"is_input_valid": {"result": "success", "reason": null},
"first_name_match": {"result": "success", "reason": null},
"last_name_match": {"result": "success", "reason": null},
"date_of_birth_match": {"result": "success", "reason": null}
},
"error": null,
"timestamp": "2026-04-01T10:15:00Z"
}
}🇦🇺 Australia ASIC Personal Name Register (AU_ASIC_PERSONAL_NAME_REGISTER)
Source | Input parameters | POST /sessions example |
|---|---|---|
Australia ASIC Personal Name Register (AU_ASIC_PERSONAL_NAME_REGISTER) | Mandatory
Optional
| |
Sample response payload
The following info can be found in decision webhook payload and GET /decision endpoint's payload, in verifications.registryValidations object.
{
"status": "success",
"verification": {
"registryValidations": {
"AU_ASIC_PERSONAL_NAME_REGISTER": {
"status": "success",
"data": {
"firstName": "Sarah",
"lastName": "Thompson",
"middleName": "Jane",
"dateOfBirth": "1985-07-14"
},
"validations": {
"processing": { "result": "success", "reason": null },
"consent_obtained": { "result": "success", "reason": null },
"is_input_valid": { "result": "success", "reason": null },
"identity_is_valid": { "result": "success", "reason": null },
"first_name_match": { "result": "success", "reason": null },
"last_name_match": { "result": "success", "reason": null },
"date_of_birth_match": { "result": "success", "reason": null },
"middle_name_match": { "result": "not_applicable", "reason": "input_not_provided" }
},
"error": null,
"timestamp": "2026-04-07T09:30:00.000Z"
}
}
}
}🇦🇺 Australia TICA Tenancy Register (AU_TICA_TENANCY_REGISTER)
Source | Input parameters | POST /sessions example |
|---|---|---|
Australia TICA Tenancy Register (AU_TICA_TENANCY_REGISTER) | Mandatory
Optional
| |
Sample response payload
The following info can be found in decision webhook payload and GET /decision endpoint's payload, in verifications.registryValidations object.
{
"status": "success",
"verification": {
"registryValidations": {
"AU_TICA_TENANCY_REGISTER": {
"status": "success",
"data": {
"firstName": "Tom",
"lastName": "Evans",
"middleName": "Michael",
"dateOfBirth": "1984-02-24"
},
"validations": {
"processing": { "result": "success", "reason": null },
"consent_obtained": { "result": "success", "reason": null },
"is_input_valid": { "result": "success", "reason": null },
"identity_is_valid": { "result": "success", "reason": null },
"first_name_match": { "result": "success", "reason": null },
"last_name_match": { "result": "success", "reason": null },
"date_of_birth_match": { "result": "success", "reason": null },
"middle_name_match": { "result": "not_applicable", "reason": "input_not_provided" }
},
"error": null,
"timestamp": "2026-04-07T09:30:00.000Z"
}
}
}
}South America
🇨🇱 Chile National ID (CL_NATIONAL_ID)
Source | Input parameters | POST /sessions example |
|---|---|---|
Chile National ID (CL_NATIONAL_ID) | Mandatory
Optional
| |
Sample response payload
The following info can be found in decision webhook payload and GET /decision endpoint's payload, in verifications.registryValidations object.
"CL_NATIONAL_ID": {
"status": "success",
"data": {
"dateOfBirth": "1991-07-14",
"firstName": "Carlos",
"lastName": "Gonzalez",
"middleName": "Andrés",
"nationalIdNo": "12345678-9",
"nationalIdNoStatus": "VALID"
},
"validations": {
"processing": {"result": "success", "reason": null},
"is_input_valid": {"result": "success", "reason": null},
"identity_is_valid": {"result": "success", "reason": null},
"first_name_match": {"result": "success", "reason": null},
"last_name_match": {"result": "success", "reason": null},
"date_of_birth_match": {"result": "success", "reason": null},
"id_number_match": {"result": "success", "reason": null}
},
"error": null,
"timestamp": "2026-04-01T11:00:00Z"
}
}🇨🇱 Chile Residential (CL_RESIDENTIAL)
Source | Input parameters | POST /sessions example |
|---|---|---|
Chile Residential (CL_RESIDENTIAL) | Mandatory
Optional
| |
Sample response payload
The following info can be found in decision webhook payload and GET /decision endpoint's payload, in verifications.registryValidations object.
{
"CL_RESIDENTIAL": {
"status": "failure",
"data": {
"addressElement1": "Av Libertador Bernardo O'Higgins 1234",
"firstName": "Valentina",
"lastName": "Muñoz",
"middleName": "Isabel"
},
"validations": {
"processing": {"result": "success", "reason": null},
"is_input_valid": {"result": "success", "reason": null},
"identity_is_valid": {"result": "failure", "reason": "person_not_found"},
"first_name_match": {"result": "not_applicable", "reason": "output_not_received"},
"last_name_match": {"result": "not_applicable", "reason": "output_not_received"}
},
"error": null,
"timestamp": "2026-04-01T11:05:00Z"
}
}EMEIA
🇬🇧 United Kingdom Residential (GB_RESIDENTIAL)
Source | Input parameters | POST /sessions example |
|---|---|---|
United Kingdom Residential (GB_RESIDENTIAL) | Mandatory
Optional
| |
Sample response payload
The following info can be found in decision webhook payload and GET /decision endpoint's payload, in verifications.registryValidations object.
{
"GB_RESIDENTIAL": {
"status": "success",
"data": {
"addressElement1": "10 Downing Street",
"addressElement2": "Westminster",
"addressElement3": "London",
"addressElement4": "England",
"addressElement5": "SW1A 2AA",
"dateOfBirth": "1982-01-30",
"emailAddress": null,
"firstName": "William",
"landlineNumber": "+442071234567",
"lastName": "Davies",
"matchedAddress": "10 Downing Street"
},
"validations": {
"processing": {"result": "success", "reason": null},
"is_input_valid": {"result": "success", "reason": null},
"identity_is_valid": {"result": "success", "reason": null},
"first_name_match": {"result": "success", "reason": null},
"last_name_match": {"result": "success", "reason": null},
"date_of_birth_match": {"result": "success", "reason": null},
"address_full_address_match": {"result": "success", "reason": null},
"phone_number_match": {"result": "success", "reason": null},
"land_line_phone_number_match": {"result": "success", "reason": null}
},
"error": null,
"timestamp": "2026-04-01T11:10:00Z"
}
}🇬🇧 United Kingdom Consumer (GB_CONSUMER)
Source | Input parameters | POST /sessions example |
|---|---|---|
United Kingdom Consumer (GB_CONSUMER) | Mandatory
Optional
| |
Sample response payload
The following info can be found in decision webhook payload and GET /decision endpoint's payload, in verifications.registryValidations object.
{
"GB_CONSUMER": {
"status": "success",
"data": {
"addressElement1": "25 Baker Street",
"addressElement3": "London",
"addressElement4": "Greater London",
"addressElement5": "W1U 8EW",
"dateOfBirth": "1995-04-18",
"emailAddress": "emma.clark@example.co.uk",
"firstName": "Emma",
"lastName": "Clark"
},
"validations": {
"processing": {"result": "success", "reason": null},
"is_input_valid": {"result": "success", "reason": null},
"first_name_match": {"result": "success", "reason": null},
"last_name_match": {"result": "success", "reason": null},
"date_of_birth_match": {"result": "success", "reason": null}
},
"error": null,
"timestamp": "2026-04-01T11:15:00Z"
}
}Status and reason codes
For info about the session, see:
verification.codeabout verification session decision code, one of9001,9102,9103,9104,9121.verification.statusabout verification status, one ofapproved,declined,resubmission_requested,expired,abandoned.
If the Metadata Database Verification session was declined or resubmission_requested, you can find additional information by checking:
verification.reasonfor the reason why the verification failed.verification.reasonCodefor reason code of the failed verification and cross-reference it with Granular reason codes (table).
|
|
| What does it mean? |
|---|---|---|---|
| 529 | Unable to validate National Id data | The registry check failed. The person was not found or data did not match. Check |
| 9102 | Declined | Generic decline. Check |
The table above aims to list the most common reasons why you may see the decline or resubmission_requested reason for a Metadata Database Verification session. However, the session may be declined due to a reason that is not inherently related to this solution's flow (e.g. uploaded document's quality is low). In that case, to find info about the codes you are seeing, refer to:
Additional data
Best practices
In API flow, ensure that initData is present, especially the mandatory fields.
Ensure correct data formats to reduce the possibility of session going to
resubmission_requested.Document image quality: ensure that end-user's document image is of good quality. This will reduce the possibility of session going to
resubmission_requested.Person's ID number is always sent in the
document.numberparameter (notperson.idNumber).Error handling: implement proper error handling for all possible validation results.
Session declined due to third-party provider issues: implement proper session handling flow when possibly legitimate end-user's session is declined due to the third-party service provider having issues, as indicated by session code
registry_unavailable,technical_issue, orregistry_timeout.Webhook security: secure your webhook endpoint and verify request signatures.
User experience: provide clear feedback to users about validation results.
Ensure backwards compatibility for webhooks and API connections.
FAQ
Can I query multiple registries in a single session?
Yes. The workflow can be configured with multiple Metadata Database Verification steps, each targeting a different registry. Results for each registry appear under their respective keys in registryValidations.
What happens if I send a field that the registry does not support?
Extra fields are ignored. Only the fields relevant to the configured registry are used.
How do I know which fields are mandatory for a specific registry?
See the per-registry documentation in the Databases by Regions section. Mandatory fields are listed for each database.
What if the registry returns data about the person?
Returned data appears in the data object of the registry result. Not all registries return data, some only perform matching.
Changelog
Date | Description |
|---|---|
Apr 8, 2026 | Documentation published |