curl -X POST https://verification.didit.me/v3/database-validation/ \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"issuing_state": "BRA",
"services": ["bra_cpf"],
"identification_number": "12345678900",
"first_name": "John",
"last_name": "Doe",
"date_of_birth": "1980-01-01",
"vendor_data": "user-1234"
}'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.database_validation.validate(
issuing_state="BRA",
services=["bra_cpf"],
identification_number="12345678900",
first_name="John",
last_name="Doe",
date_of_birth="1980-01-01",
vendor_data="user-1234",
)
print(result)import Didit from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.databaseValidation.validate({
issuing_state: "BRA",
services: ["bra_cpf"],
identification_number: "12345678900",
first_name: "John",
last_name: "Doe",
date_of_birth: "1980-01-01",
vendor_data: "user-1234",
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.DatabaseValidation.Validate(ctx, didit.DatabaseValidationValidateParams{
IssuingState: "BRA",
Services: didit.Some([]string{"bra_cpf"}),
IdentificationNumber: didit.String("12345678900"),
FirstName: didit.String("John"),
LastName: didit.String("Doe"),
DateOfBirth: didit.String("1980-01-01"),
VendorData: didit.String("user-1234"),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)import java.time.LocalDate;
import java.util.List;
import me.didit.Didit;
import me.didit.types.DatabaseValidationValidateParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.databaseValidation().validate(DatabaseValidationValidateParams.builder()
.issuingState("BRA")
.services(List.of("bra_cpf"))
.identificationNumber("12345678900")
.firstName("John")
.lastName("Doe")
.dateOfBirth(LocalDate.parse("1980-01-01"))
.vendorData("user-1234")
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->databaseValidation->validate([
'issuing_state' => 'BRA',
'services' => ['bra_cpf'],
'identification_number' => '12345678900',
'first_name' => 'John',
'last_name' => 'Doe',
'date_of_birth' => '1980-01-01',
'vendor_data' => 'user-1234',
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.database_validation.validate(
issuing_state: "BRA",
services: ["bra_cpf"],
identification_number: "12345678900",
first_name: "John",
last_name: "Doe",
date_of_birth: "1980-01-01",
vendor_data: "user-1234"
)
puts result.to_husing System;
using System.Text.Json;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var result = await client.DatabaseValidation.ValidateAsync(new DatabaseValidationValidateParams
{
IssuingState = "BRA",
Services = new string[] { "bra_cpf" },
IdentificationNumber = "12345678900",
FirstName = "John",
LastName = "Doe",
DateOfBirth = "1980-01-01",
VendorData = "user-1234",
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"request_id": "7f9a1c0e-1f2b-4f6e-9d3a-2b1c0e7f9a1c",
"database_validation": {
"status": "Approved",
"issuing_state": "BRA",
"validation_type": "one_by_one",
"screened_data": {
"tax_number": "12345678900",
"first_name": "John",
"last_name": "Doe",
"date_of_birth": "1980-01-01"
},
"match_type": "full_match",
"validations": [
{
"validation": {
"full_name": "full_match",
"date_of_birth": "full_match",
"identification_number": "full_match"
},
"outcome_code": "MATCH",
"outcome_detail": "200",
"service_id": "bra_cpf",
"service_name": "Brazil - CPF status check",
"source_data": {
"identification_number": "12345678900",
"first_name": "JOHN",
"last_name": "DOE",
"date_of_birth": "1980-01-01",
"lgpd_minor": false,
"minor_under_16": false,
"minor_under_18": false
}
}
],
"warnings": []
},
"vendor_data": "user-1234",
"metadata": null,
"created_at": "2026-06-11T10:30:00.000000+00:00"
}数据库核验 API:国家身份证匹配
Didit 数据库核验 API:通过 POST /v3/database-validation/ 对接 100+ 国家及全球权威数据源,支持 1x1 和 2x2 瀑布式匹配,按次计费。
curl -X POST https://verification.didit.me/v3/database-validation/ \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"issuing_state": "BRA",
"services": ["bra_cpf"],
"identification_number": "12345678900",
"first_name": "John",
"last_name": "Doe",
"date_of_birth": "1980-01-01",
"vendor_data": "user-1234"
}'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.database_validation.validate(
issuing_state="BRA",
services=["bra_cpf"],
identification_number="12345678900",
first_name="John",
last_name="Doe",
date_of_birth="1980-01-01",
vendor_data="user-1234",
)
print(result)import Didit from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.databaseValidation.validate({
issuing_state: "BRA",
services: ["bra_cpf"],
identification_number: "12345678900",
first_name: "John",
last_name: "Doe",
date_of_birth: "1980-01-01",
vendor_data: "user-1234",
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.DatabaseValidation.Validate(ctx, didit.DatabaseValidationValidateParams{
IssuingState: "BRA",
Services: didit.Some([]string{"bra_cpf"}),
IdentificationNumber: didit.String("12345678900"),
FirstName: didit.String("John"),
LastName: didit.String("Doe"),
DateOfBirth: didit.String("1980-01-01"),
VendorData: didit.String("user-1234"),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)import java.time.LocalDate;
import java.util.List;
import me.didit.Didit;
import me.didit.types.DatabaseValidationValidateParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.databaseValidation().validate(DatabaseValidationValidateParams.builder()
.issuingState("BRA")
.services(List.of("bra_cpf"))
.identificationNumber("12345678900")
.firstName("John")
.lastName("Doe")
.dateOfBirth(LocalDate.parse("1980-01-01"))
.vendorData("user-1234")
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->databaseValidation->validate([
'issuing_state' => 'BRA',
'services' => ['bra_cpf'],
'identification_number' => '12345678900',
'first_name' => 'John',
'last_name' => 'Doe',
'date_of_birth' => '1980-01-01',
'vendor_data' => 'user-1234',
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.database_validation.validate(
issuing_state: "BRA",
services: ["bra_cpf"],
identification_number: "12345678900",
first_name: "John",
last_name: "Doe",
date_of_birth: "1980-01-01",
vendor_data: "user-1234"
)
puts result.to_husing System;
using System.Text.Json;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var result = await client.DatabaseValidation.ValidateAsync(new DatabaseValidationValidateParams
{
IssuingState = "BRA",
Services = new string[] { "bra_cpf" },
IdentificationNumber = "12345678900",
FirstName = "John",
LastName = "Doe",
DateOfBirth = "1980-01-01",
VendorData = "user-1234",
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"request_id": "7f9a1c0e-1f2b-4f6e-9d3a-2b1c0e7f9a1c",
"database_validation": {
"status": "Approved",
"issuing_state": "BRA",
"validation_type": "one_by_one",
"screened_data": {
"tax_number": "12345678900",
"first_name": "John",
"last_name": "Doe",
"date_of_birth": "1980-01-01"
},
"match_type": "full_match",
"validations": [
{
"validation": {
"full_name": "full_match",
"date_of_birth": "full_match",
"identification_number": "full_match"
},
"outcome_code": "MATCH",
"outcome_detail": "200",
"service_id": "bra_cpf",
"service_name": "Brazil - CPF status check",
"source_data": {
"identification_number": "12345678900",
"first_name": "JOHN",
"last_name": "DOE",
"date_of_birth": "1980-01-01",
"lgpd_minor": false,
"minor_under_16": false,
"minor_under_18": false
}
}
],
"warnings": []
},
"vendor_data": "user-1234",
"metadata": null,
"created_at": "2026-06-11T10:30:00.000000+00:00"
}基于地址的服务
对于验证居住地址或公用事业地址的服务,您可以只发送一个address,Didit 会在处理核验前将其拆分。为获得最佳匹配率,请直接发送 Didit 的结构化地址字段:
| 字段 | 含义 |
|---|---|
address_element_1 | 街道地址,包括门牌号和街道类型 |
address_element_2 | 可选,单元、楼栋、楼层或其他地址行 |
address_element_3 | 郊区、地区或社区 |
address_element_4 | 城市、城镇、州、省或地区 |
address_element_5 | 邮政编码 |
address 值。postal_code 可作为 address_element_5 的别名使用。
同意
部分数据库服务要求终端用户明确同意后,才能向服务提供方发起查询。服务目录会在这些服务的行中标记requires_consent=true。
当用户同意适用于所选服务时,请发送 consent=true。
如果所选服务需要同意而您未发送该参数,Didit 会在调用任何服务提供方之前、且未产生任何计费事件时拒绝该请求。
文件上传
数据库核验使用multipart/form-data。需要 selfie 的生物识别服务会在 API 调试台中将其显示为文件上传字段,您可以直接选择图片,无需粘贴路径或 base64 字符串。
在代码中,请使用标准的 multipart 语法上传文件:
-F "selfie=@./selfie.jpg"
验证错误
Didit 会在调用服务提供方之前,先核验必填字段、地址结构以及特定服务的格式。例如,chn_national_id 和 chn_passport_verification 等中国登记服务要求 full_name 使用原始中文字符。其中,chn_national_id 还要求提供有效的 15 位或 18 位中国居民身份证号码,且校验位必须正确。
如果请求无法执行,API 会返回明确的字段错误,并且不产生任何费用。如果服务提供方在预检后失败,响应会包含 validation_errors,而已保存的 API 请求会将这些错误存储在数据库核验结果中。
被拒绝的输入与不可用的结果
如果没有任何服务返回可用结果,请先检查每个validation_errors 条目,再决定是否重试。仅凭 HTTP 状态码无法判断重试是否合适。
返回 400、且 code: "provider_rejected_input" 和 retryable: false 表示每次未得到应答的尝试都明确拒绝了该输入。请先更正所提供的数据,再重新尝试。这些尝试不计费。
返回 502、且 code: "empty_provider_response" 和 retryable: true 表示服务因其他原因无法生成可用结果。这包括输入被拒绝后又遇到不可用的备用服务,或备用服务未给出任何说明的情况。请稍后重试;该响应并不表明输入有误。如果某个数据库持续失败,一旦中断持续存在,Didit 会向近期使用过该数据库的企业发送一次邮件;当真实核验确认其已恢复应答时,还会再次发送邮件。参见 可用性通知。
当只有部分所选服务失败时,请求仍会成功:响应为 200,失败的服务会列在 database_validation.errors[] 中,每项都包含相同的 code 和 retryable 字段。此时,database_validation.status 会依据已应答的服务给出结果,并且可以为 Approved。因此,请检查每个响应中的 errors[],而不要只检查 4xx 或 5xx 响应。列在其中的服务不会出现在 validations 和 services_used 中,也不计费。请单独重试该服务。
其他 502 错误可能需要更正输入。例如,provider_invalid_input 和 provider_validation_error 表示数据源拒绝了该输入,切勿在不做修改的情况下重试,即使旧版响应中省略了 retryable 也是如此。empty_provider_response 的重试指引不适用于这些错误代码。明确的无匹配结果属于已完成的核验,而非可用性故障。授权
您的应用 API 密钥,可在 Business Console 的“开发者 -> API 密钥”中获取。主密钥拥有完整访问权限。指定名称的密钥可设置作用域:针对每个资源设为无权限、只读或读写,限定于特定工作流或已通过的会话、限定于 IP 地址列表,以及设置到期日期。401 表示密钥错误、已撤销或已过期;403 表示未发送密钥、密钥无权访问该资源或操作,或请求来自其 IP 列表之外的地址;在会话路由上返回 404 表示该会话不在该密钥允许的工作流或状态范围内。没有媒体访问权限的密钥获取到的图片、视频和 PDF URL 将为 null;没有会话写入权限的密钥获取到的会话链接和 token 将为 null。请参阅 https://docs.didit.me/console/api-keys。
请求体
用于验证的目标登记处的 ISO 3166-1 alpha-3 国家/地区代码(例如 BRA、ESP、COL)。决定哪些服务可用。不受支持的代码将返回 400 及有效选项的完整列表。
"BRA"
针对此国家/地区要运行的目录 service_id 列表(例如 ["bra_cpf"])。也接受单个字符串或以逗号分隔/JSON 编码的字符串。如果省略或为空,将仅运行一个默认服务 — 即该国家/地区上线时间最长的生产环境服务;较新的、生物识别及按量计费的服务必须显式指定。发送 services 会将响应切换为扩展形式(添加 services_used 和 match_score)。每个 ID 必须存在且对该 issuing_state 处于可用状态;需要入驻的服务在为您的组织激活前将返回 400。可通过 GET /v1/organization/database-validation-countries/(本规范中未记载的目录 endpoint)或 Business Console 工作流编辑器发现每个国家/地区的可用服务。
["bra_cpf"]
已弃用。为向后兼容而接受但会被忽略,响应中的 validation_type 现在取决于完全匹配的服务数量。使用 services 可固定指定的服务。
当终端用户明确同意所选验证服务时设为 true。目录中标记为 requires_consent=true 的服务必须提供 — 若未提供,这些服务将返回 400 以及 services_requiring_consent。
通用身份识别号,自动映射到特定国家/地区的正确字段,因此您可以用来代替 personal_number/tax_number/document_number:ARG→document_number (DNI)、BOL→document_number (CI)、BRA→tax_number (CPF,11 位数字)、CHL→personal_number (RUT)、COL→personal_number (Cédula)、CRI→personal_number (Cédula)、DOM→personal_number (Cédula,11 位数字)、ECU→personal_number (Cédula,10 位数字)、ESP→personal_number (DNI/NIE)、GTM→document_number (DPI)、HND→document_number (DNI)、MEX→personal_number (CURP,18 位字符)、PAN→personal_number (Cédula)、PER→personal_number (DNI,8 位数字)、PRY→document_number (CI)、SLV→document_number (DUI)、URY→personal_number (CI)、VEN→document_number (Cédula)。它绝不会覆盖显式提供的特定国家/地区字段。
个人的名字。某些服务/国家/地区要求必填。
"John"
个人的姓氏。某些服务/国家/地区要求必填。
"Doe"
中间名,由部分国家/地区服务使用(澳大利亚、新西兰等)。
姓名 — 部分服务接受以此代替名/姓(例如 CHN 服务,用于比对原生文字系统中的姓名)。
出生日期,YYYY-MM-DD。许多服务均要求提供。
"1980-01-01"
政府签发的唯一个人身份标识。适用地区:CHL (RUT)、COL (Cédula)、CRI、DOM、ECU、ESP (DNI/NIE)、MEX (CURP)、PAN (Cédula)、PER (DNI)、URY。建议改用 identification_number。
税号。适用地区:BRA(CPF,11 位数字)。建议改用 identification_number。
证件号码。适用于:ARG (DNI)、BOL (CI)、GTM (DPI)、HND (DNI)、PRY (CI)、SLV (DUI)、VEN (Cédula)。建议改用 identification_number。
正在核验的证件类型:P 护照、DL 驾驶证、ID 国民身份证、RP 居留许可(以及 SSC、HIC、WP、TC、VISA、PSC、BC、OTHER)。某些服务需要此字段(例如 ESP)。
P, DL, ID, RP, SSC, HIC, WP, TC, VISA, PSC, BC, OTHER 证件到期日期,YYYY-MM-DD。ESP(西班牙)核验必填。
"2030-01-15"
证件签发日期,YYYY-MM-DD(fecha de expedición)。COL(哥伦比亚)身份证(cédula)核验必填。
"2015-06-20"
ISO 3166-1 alpha-3 格式的国籍。某些服务需要此字段。
性别:M、F 或 X(其他/未知)。阿根廷的 RENAPER 核验(arg_renaper)必填。
M, F, X 居住地址。建议使用结构化对象 {"street_1":"123 Main St","street_2":"Apt 4B","city":"Springfield","region":"IL","postal_code":"62701","country":"US"};仍接受完整的单行字符串。地址验证服务要求必填;当某项服务定义了地址要求时,缺少部分将返回 400 以及 address_fields_required_by。
Show child attributes
Show child attributes
街道地址,包括门牌号和道路类型。如果省略,则从 address 推导。
公寓、单元、楼栋、楼层或补充地址行。仅在明确掌握该信息时发送。
城市、郊区、区、地方或街区。如果省略,则从 address 派生。
州、省、地区或城镇。如果省略,则从 address 推导。
邮政编码。接受 postal_code 作为别名。
基于地址的服务的邮政编码(address_element_5 的别名)。
用于政府证件验证服务(AUS、NZL、IND)的驾照号码。
实体驾照卡号,当与驾照号码(澳大利亚)分开要求时使用。
驾照签发州或领地(AUS)。
驾照版本代码(NZL)。
用于政府护照核验服务(澳大利亚 AUS、新西兰 NZL、印度 IND、中国 CHN)的护照号码。
护照到期日期,格式为 YYYY-MM-DD,用于护照核验服务。
护照文件编号(IND)。
护照验证服务所使用的护照签发国家/地区(ISO 3166-1 alpha-3)。
Medicare 卡号(澳大利亚)。
澳大利亚 ImmiCard 号码。
澳大利亚 ImmiCard 到期日期。
公民身份证书编号(澳大利亚)。
出生证明登记号(澳大利亚)。
出生证明登记日期(澳大利亚)。
出生证明登记州(澳大利亚)。
结婚证明编号(澳大利亚)。
更名证明编号(澳大利亚)。
结婚证上配偶的名(澳大利亚)。
结婚证上配偶的姓氏(澳大利亚)。
选民登记号(IND EPIC、IRL)。
印度 EPIC 选民卡号。
印度 PAN(永久账号)。
国民身份证号(CHN、MYS、KEN、KHM、NGA、ZAF、……)。
墨西哥 INE/IFE 凭证识别码(CIC,Código de Identificación de Credencial),9 位数字。由墨西哥 INE 凭据有效性核验服务(mex_ine_vigencia)使用。
墨西哥 INE 公民标识符(Identificador del Ciudadano,9 位数字)。在 mex_ine_vigencia 中与 cic 一起用于现代 INE 型号(E/F/G/H)。
墨西哥 INE OCR 编号(13 位数字,卡片背面)。在 mex_ine_vigencia 中与 cic 一起用于 D 型号。
墨西哥 INE 选民识别码(Clave de Elector,18 位字符)。在 mex_ine_vigencia 中与 emission_number 一起用于旧版 IFE 型号(A/B/C)。
墨西哥 INE 签发编号(Número de Emisión)。在 mex_ine_vigencia 中与 voter_number 一起用于旧版 IFE 型号(A/B/C)。
尼日利亚银行验证号码(BVN)。
银行卡号(中国银行卡验证)。
公司登记机构签发的企业注册号:如巴西的 CNPJ(例如 11222333000181)、南非的注册号(例如 1936/007721/06)。公司登记和企业董事服务(bra_company_registry、bra_company_directors、zaf_company_registry、zaf_company_directors)需要此参数。
注册公司名称,与登记条目进行交叉比对。对于 zaf_company_registry 可选。
证件上印制的该人员姓名首字母缩写。zaf_drivers_license 必需;zaf_bank_account_holder 可接受。
卡片上印制的驾照号码,适用于 zaf_drivers_license。省略时,使用 document_number。
南非内政部签发的难民档案号。zaf_refugee 所需。
开户银行名称。zaf_bank_account_holder 必填。
银行账号。zaf_bank_account_holder 必填;zaf_fraud_prevention 可接受。
zaf_bank_account_holder 的银行账户类型:current、savings、transmission、subscriptionShare 或 notKnown,不区分大小写。任何其他值返回 400。未知类型时请省略:账户类型交叉比对随后将报告为未确认。
联系手机号码,用于交叉核验可联络性的服务(zaf_bank_account_holder、zaf_fraud_prevention、zaf_refugee)。
用于 zaf_dha_fingerprint_match 的 Base64 编码右手拇指指纹,可与 left_thumb 一起提供或单独提供。
用于 zaf_dha_fingerprint_match 的 Base64 编码左手拇指指纹,可与 right_thumb 一起提供或单独提供。
zaf_criminal_face_screening 的最低生物识别评分等级。默认为 3。
zaf_criminal_face_screening 返回的候选匹配项最大数量。默认值为 1。
车辆登记编号。zaf_vehicle_ownership 必需此字段,且须与 vehicle_licence_plate 和 vin 一同提供。
车辆号牌号码。zaf_vehicle_ownership 必需此字段,且须与 vehicle_register_number 和 vin 一同提供。
车辆识别代号(VIN 或车架号)。zaf_vehicle_ownership 必需此字段,且须与 vehicle_register_number 和 vehicle_licence_plate 一同提供。
社会安全号码(美国)。
用于电话验证服务的电话号码。
用于电话验证服务的座机号码。
用于身份验证服务的邮箱地址。
居住国家/地区的 ISO 3166-1 alpha-2 代码。供全球身份信息增强服务(例如 glb_identity_enrichment)用于限定查询范围。
"US"
partial_match 对 database_validation.status 的影响。默认值为 NO_ACTION(状态保持为 Approved,并附带警告)。
DECLINE, NO_ACTION no_match 对 database_validation.status 的影响。默认值为 DECLINE。
DECLINE, NO_ACTION 将核验持久化为会话(控制台可见性、决策 endpoint、status.updated Webhook)。同时会改变 validations 响应的格式:为 true(默认)时按服务返回对象,为 false 时返回合并的字段映射。
您为已核验用户指定的标识符;将原样返回并与会话一起存储。
随请求一同存储并回显的自由格式 JSON。
响应
核验已完成:至少有一个选定的服务返回了可用结果。请查看 database_validation.match_type 获取汇总结果,查看 validations 获取按服务划分的字段比对和 outcome_codes,以及查看 errors(若存在)获取失败的服务信息。