Skip to main content
POST
/
v3
/
database-validation
/
curl -X POST "https://verification.didit.me/v3/database-validation/" \
  -H "x-api-key: YOUR_API_KEY" \
  -F "issuing_state=ESP" \
  -F "services=esp_consumer_2" \
  -F "vendor_data=user-1234" \
  -F "first_name=John" \
  -F "last_name=Doe" \
  -F "date_of_birth=1990-01-01" \
  -F 'address={"street_1":"123 Sample Street","street_2":"Unit 4","city":"Sample City","region":"Sample State","postal_code":"10001","country":"US"}'
{
  "request_id": "req_01H…",
  "status": "Approved",
  "issuing_state": "ESP",
  "match_type": "full_match",
  "validations": [
    {
      "outcome_code": "MATCH",
      "service_id": "esp_consumer_2",
      "service_name": "Spain Consumer 2",
      "source_data": {
        "address": "123 Sample Street",
        "address_match_score": "1.000",
        "first_name": "John",
        "full_name": "John Doe",
        "last_name": "Doe",
        "name_match_score": "1.000",
        "postal_code": "10001",
        "street": "sample_value",
        "verifications": {
          "address": true,
          "date_of_birth": true,
          "full_name": true
        }
      },
      "validation": {
        "address": "full_match",
        "date_of_birth": "full_match",
        "full_name": "full_match"
      }
    }
  ]
}
Input is verified against a source comprising multiple datasets from consumer, telephone and utility records. Didit exposes this service through POST /v3/database-validation/ so you can verify the submitted data against the authoritative source and receive normalized match results.

Coverage

  • Coverage: ~ 35%
  • Country: Spain
  • Service ID: esp_consumer_2
  • Data domain: Address
  • Category: Residential

Inputs

FieldRequiredExample
first_nameYesJohn
last_nameYesDoe
date_of_birthYes1990-01-01
address.street_1Yes123 Sample Street
address.postal_codeYes10001
phoneNo+15550101000
emailNojohn.doe@example.com
address.street_2NoUnit 4
address.cityNoSample City
address.regionNoSample State
vendor_dataNouser-1234
  • Required inputs: first_name, last_name, date_of_birth, address.street_1, address.postal_code
  • Optional inputs: phone, email, address.street_2, address.city, address.region, vendor_data
  • Consent: Not required
  • Workflow availability: Available in workflow
  • Coverage: ~ 35%
  • Price: $0.08 per successful query

Body parameters

issuing_state
string
default:"ESP"
required
ISO 3166-1 alpha-3 country code for this database service.Example: ESP
services
string
default:"esp_consumer_2"
required
Array containing this service ID. Pinning the service keeps the request scoped to this exact database.Example: esp_consumer_2
first_name
string
default:"John"
required
Given name to validate.Example: John
last_name
string
default:"Doe"
required
Family name to validate.Example: Doe
date_of_birth
string
default:"1990-01-01"
required
Date of birth in YYYY-MM-DD format.Example: 1990-01-01
address
object
required
Structured residential address object. Use street_1, street_2, city, region, postal_code, and country. A complete legacy address string is still accepted but not recommended.Example: {"street_1":"123 Sample Street","street_2":"Unit 4","city":"Sample City","region":"Sample State","postal_code":"10001","country":"US"}
phone
string
default:"+15550101000"
Phone number in international format.Example: +15550101000
email
string
default:"john.doe@example.com"
Email address.Example: john.doe@example.com
vendor_data
string
default:"user-1234"
Your stable user reference for this person, such as your internal user ID. Didit uses it to link standalone checks to the same end user and reduce duplicate-detection noise.Example: user-1234

Input rules & validation notes

  • For address services, send structured address fields instead of a single address string when possible.
  • address.street_1 is the street address, including street number and street type.
  • address.street_2 is apartment, unit, building, floor, or extra address line. Send it only when you have it.
  • address.city is city, suburb, district, locality, or neighborhood.
  • address.region is state, province, region, or town.
  • address.postal_code is postcode or postal code.
  • Address-based database services require at least street address and postal code; requests rejected before source lookup are not charged.

How to call it

curl -X POST "https://verification.didit.me/v3/database-validation/" \
  -H "x-api-key: YOUR_API_KEY" \
  -F "issuing_state=ESP" \
  -F "services=esp_consumer_2" \
  -F "vendor_data=user-1234" \
  -F "first_name=John" \
  -F "last_name=Doe" \
  -F "date_of_birth=1990-01-01" \
  -F 'address={"street_1":"123 Sample Street","street_2":"Unit 4","city":"Sample City","region":"Sample State","postal_code":"10001","country":"US"}'
Every successful call returns HTTP 200. The outcome_code field tells you what actually happened — distinguishing, for example, a real biometric mismatch (BIOMETRIC_NO_MATCH) from a selfie that could not be read (BIOMETRIC_IMAGE_UNUSABLE). The status shown is the default feature status; your configured Partial Match / No Match actions can override it.

Returned data

The exact fields surfaced in source_data depend on what the registry returns. The generated example for esp_consumer_2 currently documents this normalized shape:
  • address
  • address_match_score
  • first_name
  • full_name
  • last_name
  • name_match_score
  • postal_code
  • street

Pricing & SLAs

Spain Consumer 2 queries are billed only when Didit receives a conclusive result from the validation source.
  • Per-call price: $0.08 USD.
  • Billing: per successful query. You are not charged when the registry is unreachable, when required fields are missing, or when the request is rejected before reaching the source.
  • Latency: typical p95 < 2 s.
  • Availability: 99.9% per quarter on Didit’s side; downstream source availability varies by country and dataset.

Continue reading