Available via API | Available via SDK | Needs configuration on Veriff’s side | Needs a separate integration | Needs a separate webhook |
|---|---|---|---|---|
✅ | ✅ | ✅ | ❌/✅* | ❌ |
CURP Database Verification is a Mexican identity verification solution that validates government-issued CURP (Clave Única de Registro de Población or Unique Population Registry Code) numbers against the official Mexican government database.
CURP is an 18-character unique identification code assigned to all Mexican citizens and residents, containing encoded information about the person's name, birthdate, gender, and place of birth. The solution performs real-time validation of demographic data including names, birth date, gender, and birth state to ensure accurate identity verification for Mexican residents and compliance with local regulations.
CURP Database Verification is available via API, native SDKs and web SDK (aka webflow).
*CURP Database Verification can be:
an add-on to your document + selfie IDV or document-only IDV, or
used separately as a stand-alone check, in which case the whole flow is performed via API.
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, on sessions details page.
If any data was extracted from the document, this data is provided in the webhook payload and GET /decision endpoint’s response payload.
Contact your solutions engineer for info and configuration.
Prerequisites
You have an integration set up with Veriff
The CURP 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 CURP number
If using the API:
Veriff strongly recommends you collect and send additional device/session data for improved fraud mitigation
Veriff strongly recommends that you create and send us the endUserId or vendorData
Flow overview
The flow is a bit different, depending on the method (API or SDK) you are using to verify your end-users with Veriff.
End-user data sources
The CURP verification requires the CURP number to be provided via initData only. The CURP is passed through the person.idNumber parameter during session creation.
initData
This means that the checks are completed using the data you input during the session creation, i.e., the parameters you specify in the POST /sessions request.
Required parameter
verification.person.idNumber - the 18-character CURP number
CURP Format
Length: 18 characters
Structure: AAAA######AAAAAA##
First 4 letters: surname and name initials
6 digits: date of birth (YYMMDD)
1 letter: gender (H=Male, M=Female)
2 letters: state of birth code
Next 3 letters: first internal consonants of surnames and name
2 digits: verification digits
Example: VISH560427MSRLNL06
Use via API
Stand-alone CURP verification
Use when you only need to verify an CURP credential without collecting document (and selfie) images.
Generate a verification session using the API keys and the
baseURLof your CURP Database Verification integration (see the API Documentation and API Reference[↗] how to find these)Ensure that you send end-user’s CURP number in
person.idNumberparameter
Sample request payload
curl -X POST \
--url '/v1/sessions/' \
-H 'X-AUTH-CLIENT: API-KEY' \
-H 'Content-Type: application/json' \
-d '{
"verification": {
"person": {
"idNumber": "VISH560427MSRLNL06"
}
}
}'
Patch session status to
submittedstatus using PATCH /sessions/{sessionId}[↗] call
Sample request payload
curl -X PATCH \
--url '/v1/sessions/fd5c1563-1d23-4b1a-ae46-7ba429927ed8' \
-H 'X-AUTH-CLIENT: API-KEY' \
-H 'Content-Type: application/json' \
-d '{
"status": "submitted"
}'
Check the decision data and/or session related info from the decision webhook and/or query the data from the GET sessions/{sessionId}/decision[↗] endpoint.
CURP with document verification
Generate a verification session using the API keys and the
baseURLof your CURP Database Verification integration (see the API Documentation and API Reference[↗] how to find these)
Ensure that you send end-user’s CURP number in
person.idNumberparameterVeriff strongly recommends you create and send the
endUserIdorvendorData.’Veriff strongly recommends you collect and send additional session/device data via POST sessions/{sessionid}/collected-data[↗] for improved fraud detection.
Minimal request payload sample
curl -X POST \
--url '/v1/sessions/' \
-H 'X-AUTH-CLIENT: API-KEY' \
-H 'Content-Type: application/json' \
-d '{
"verification": {
"person": {
"idNumber": "VISH560427MSRLNL06"
},
"endUserId": "a1b2c35d-e8f7-6d5e-3cd2-a1b2c35db3d4"
}
}'
Use your image-capturing method, or prepare previously collected end-user document / selfie image(s)
Upload the end-user's media via POST /sessions/{sessionId}/media[↗] call
The types of photos you need to send depends on if you are doing document-only IDV or document + selfie IDV.
Ensure that you pass correct image context type for the
image.contextparameter (see Context types (image, video) for more info about image context types).
Sample request payload
curl -X POST \
--url '/v1/sessions/aea9ba6d-1b47-47fc-a4fc-f72b6d3584a7/media' \
-H 'X-AUTH-CLIENT: API-KEY' \
-H 'Content-Type: application/json' \
-d '{
"image": {
"data": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEA...",
"context": "document-front"
}
}'
Patch session status to
submittedstatus using PATCH /sessions/{sessionId}[↗] call
Sample request payload
curl -X PATCH \
--url '/v1/sessions/fd5c1563-1d23-4b1a-ae46-7ba429927ed8' \
-H 'X-AUTH-CLIENT: API-KEY' \
-H 'Content-Type: application/json' \
-d '{
"status": "submitted"
}'
Check the decision data and/or session related info from the decision webhook and/or query the data from the GET sessions/{sessionId}/decision[↗] endpoint.
→ Solution-specific overview of what to expect is provided below in Find decision and/or session related info section.
Find decision and/or session related info
You can get the data from three sources:
Receive the decision webhook
Query the results via GET sessions/{sessionId}/decision[↗]
View the session in Veriff Customer Portal
All the CURP Database Verification results are returned in additionalVerifiedData.officialDatabaseVerification.curp.validations within the webhook payload.
The verification includes three validation checks:
Processing - confirms the CURP verification request was successfully processed
CURP is valid - validates that the CURP exists in the official Mexican registry and is properly formatted
CURP has risk factors - checks for any risk indicators associated with the CURPWebhook payload
Each check returns one of the following results:
success- the check passed successfullyfailure- the check did not passnot_applicable- the check is not relevant for this CURP
Webhook payload
Below are a sample and an explanation of a decision webhook payload for a minimal CURP Database Verification.
Depending on your solution, the payload may contain additional parameters. To find more info about it, see the decision webhook documentation.
Sample request
{
"status": "success",
"verification": {
"acceptanceTime": "2025-10-21T13:12:32.520216Z",
"decisionTime": "2025-10-21T13:12:43.125995Z",
"code": 9001,
"id": "96d8c583-0855-43c2-b549-bf8824465835",
"vendorData": null,
"endUserId": null,
"status": "approved",
"additionalVerifiedData": {
"officialDatabaseVerification": {
"curp": {
"matchData": {
"dateOfBirth": "MATCH",
"fullName": "MATCH",
"gender": "NO_INPUT"
},
"validations": {
"processing": {
"result": "success"
},
"curpIsValid": {
"result": "success"
},
"curpHasRiskFactors": {
"result": "not_applicable"
},
"matching": {
"result": "sucess"
}
},
"registryResponse": {
"curp": "VISH560427MSRLNL06",
"paternalSurname": "VILLA",
"maternalSurname": "SANCHES",
"names": "GLORIA",
"gender": "MUJER",
"dob": "27/04/1956",
"nationality": "MEXICO",
"supportingDocument": "1",
"registrationEntity": "SONORA",
"registrationStateNumber": null,
"registrationMunicipalityKey": null,
"page": null,
"tome": null,
"book": null,
"minutesNumber": "02203",
"crip": "string",
"registrationEntity2": "HERMOSILLO",
"registrationYear": "1956",
"foreignRegistrationNumber": "string",
"letterFolio": "string",
"birthStateKey": "SONORA",
"issueEntityKey": "SONORA",
"curpStatus": "RNC",
"certificateFolio": "string"
}
}
}
},
"attemptId": "96d8c583-0855-43c2-b549-bf8824465835"
},
"technicalData": {
"ip": null
}
}Request properties explained
status:stringOverall verification status , one ofapproved,declined,resubmission_requested,expired,abandoned)verification:objectContains all details of the verification sessionid:stringUnique session identifierattemptId:stringUUID v4 of the attempt which received a status (as. shown inverification.statusfield)code:numberDecision code (e.g., 9001 for approved)reason:stringornullHuman-readable decline reason if applicablereasonCode:stringornullMachine-readable decline code if applicabledecisionTime:stringISO timestamp when the decision was madeacceptanceTime:stringISO timestamp when the session was acceptedadditionalVerifiedData:objectContains the results of all validationsofficialDatabaseVerification:objectContains the results of the database verificationcurp:objectContains CURP verification resultsmatchData:objectOptional, available only when matching validation is enabled for the integration. Shows how different end-user data types that were sent as initData or extracted from the document match the data in the registry.dateOfBirth:stringIndicates if the date of birth data matches gender data in registryfullName:stringIndicates if the full name data matches gender data in registrygender:stringIndicates if the gender data matches gender data in registry
validations:objectContains validation check resultsprocessing: Indicates processing validation resultresult:stringindicates if the request was properly processed, one ofsuccess,failure(there was an error when processing the request) ornot_applicable(processing check was not configured).reasons:arrayAdditional information about the validation result. Not sent ifresult:success.
curpIsValid: CURP validity validation resultresult:stringstatus of the validity validation check, one ofsuccess,failure(CURP does not exist, has a formatting issue, or is invalid) ornot_applicable(validity check not configured).reasons:arrayAdditional information about the validation result. Not sent ifresult:success.
curpHasNoRiskFactors: risk factors validation resultresult:stringstatus of the validation, one ofsuccess,failure(risk factors were detected) ornot_applicable(no risk factors were found).reasons:arrayAdditional information about the validation result. Not sent ifresult:success.
matching:objectOptional, only available when the input data matching validation was enabled for the integration (curp.matchDataparameter is included in the payload)result:stringAlwayssuccess, irrespective ofmatchDataresults
registryResponseObject containing detailed information retrieved from the Mexican government registry. Fields below are optional and might not be present if the data isnullfrom the provider.curp:stringThe validated CURP numberpaternalSurname:stringPerson's paternal surname from registrymaternalSurname:stringPerson's maternal surname from registrynames:stringPerson's given name(s) from registrygender:stringGender indicator (H=Male, M=Female)dob:stringDate of birth from registrynationality:stringNationality codesupportingDocument:stringType of supporting document used for CURP registrationregistrationEntity:stringEntity where the person was registeredregistrationStateNumber:stringState indicator where the person was registeredregistrationMunicipalityKey:stringMunicipality indicator where the person was registeredpage:stringPage number from birth certificate (if applicable)tome:stringTome number from birth certificate (if applicable)book:stringBook number from birth certificate (if applicable)minutesNumber:stringMinutes number from civil registrycrip:stringCRIP identifierregistrationEntity2:stringSecondary registration entityregistrationYear:stringYear of registrationforeignRegistrationNumber:stringForeign registration indicatorletterFolio:stringLetter folio from registrationbirthStateKey:string- State of birth codeissueEntityKey:string- Entity that issued the CURPcurpStatus:stringCurrent status of the CURPcertificateFolio:stringCertificate information
technicalData:objectTechnical data objectip:string | nullIP of the device from which the verification was made
API call
Below are a sample and an explanation of a GET /decision API call payload for a minimal CURP Database Verification.
Depending on your solution, the payload may contain additional parameters. To find more info about it, see the GET sessions/{sessionId}/decision[↗] documentation.
Sample response
{
"status": "success",
"verification": {
"acceptanceTime": "2025-10-21T13:12:32.520216Z",
"decisionTime": "2025-10-21T13:12:43.125995Z",
"code": 9001,
"id": "96d8c583-0855-43c2-b549-bf8824465835",
"vendorData": null,
"endUserId": null,
"status": "approved",
"additionalVerifiedData": {
"officialDatabaseVerification": {
"curp": {
"matchData": {
"dateOfBirth": "MATCH",
"fullName": "MATCH",
"gender": "NO_INPUT"
},
"validations": {
"processing": {
"result": "success"
},
"curpIsValid": {
"result": "success"
},
"curpHasRiskFactors": {
"result": "not_applicable"
},
"matching": {
"result": "sucess"
}
},
"registryResponse": {
"curp": "VISH560427MSRLNL06",
"paternalSurname": "VILLA",
"maternalSurname": "SANCHES",
"names": "GLORIA",
"gender": "MUJER",
"dob": "27/04/1956",
"nationality": "MEXICO",
"supportingDocument": "1",
"registrationEntity": "SONORA",
"registrationStateNumber": null,
"registrationMunicipalityKey": null,
"page": null,
"tome": null,
"book": null,
"minutesNumber": "02203",
"crip": "string",
"registrationEntity2": "HERMOSILLO",
"registrationYear": "1956",
"foreignRegistrationNumber": "string",
"letterFolio": "string",
"birthStateKey": "SONORA",
"issueEntityKey": "SONORA",
"curpStatus": "RNC",
"certificateFolio": "string"
}
}
}
},
"attemptId": "96d8c583-0855-43c2-b549-bf8824465835"
},
"technicalData": {
"ip": null
}
}Response properties explained
status:stringOverall verification status , one ofapproved,declined,resubmission_requested,expired,abandoned)verification:objectContains all details of the verification sessionid:stringUnique session identifierattemptId:stringUUID v4 of the attempt which received a status (as. shown inverification.statusfield)code:numberDecision code (e.g., 9001 for approved)reason:stringornullHuman-readable decline reason if applicablereasonCode:stringornullMachine-readable decline code if applicabledecisionTime:stringISO timestamp when the decision was madeacceptanceTime:stringISO timestamp when the session was acceptedadditionalVerifiedData:objectContains the results of all validationsofficialDatabaseVerification:objectContains the results of the database verificationcurp:objectContains CURP verification resultsmatchData:objectOptional, available only when matching validation is enabled for the integration. Shows how different end-user data types that were sent as initData or extracted from the document match the data in the registry.dateOfBirth:stringIndicates if the date of birth data matches gender data in registryfullName:stringIndicates if the full name data matches gender data in registrygender:stringIndicates if the gender data matches gender data in registry
validations:objectContains validation check resultsprocessing: Indicates processing validation resultresult:stringindicates if the request was properly processed, one ofsuccess,failure(there was an error when processing the request) ornot_applicable(processing check was not configured).reasons:arrayAdditional information about the validation result. Not sent ifresult:success.
curpIsValid: CURP validity validation resultresult:stringstatus of the validity validation check, one ofsuccess,failure(CURP does not exist, has a formatting issue, or is invalid) ornot_applicable(validity check not configured).reasons:arrayAdditional information about the validation result. Not sent ifresult:success.
curpHasNoRiskFactors: risk factors validation resultresult:stringstatus of the validation, one ofsuccess,failure(risk factors were detected) ornot_applicable(no risk factors were found).reasons:arrayAdditional information about the validation result. Not sent ifresult:success.
matching:objectOptional, only available when the input data matching validation was enabled for the integration (curp.matchDataparameter is included in the payload)result:stringAlwayssuccess, irrespective ofmatchDataresults
registryResponseObject containing detailed information retrieved from the Mexican government registry. Fields below are optional and might not be present if the data isnullfrom the provider.curp:stringThe validated CURP numberpaternalSurname:stringPerson's paternal surname from registrymaternalSurname:stringPerson's maternal surname from registrynames:stringPerson's given name(s) from registrygender:stringGender indicator (H=Male, M=Female)dob:stringDate of birth from registrynationality:stringNationality codesupportingDocument:stringType of supporting document used for CURP registrationregistrationEntity:stringEntity where the person was registeredregistrationStateNumber:stringState indicator where the person was registeredregistrationMunicipalityKey:stringMunicipality indicator where the person was registeredpage:stringPage number from birth certificate (if applicable)tome:stringTome number from birth certificate (if applicable)book:stringBook number from birth certificate (if applicable)minutesNumber:stringMinutes number from civil registrycrip:stringCRIP identifierregistrationEntity2:stringSecondary registration entityregistrationYear:stringYear of registrationforeignRegistrationNumber:stringForeign registration indicatorletterFolio:stringLetter folio from registrationbirthStateKey:string- State of birth codeissueEntityKey:string- Entity that issued the CURPcurpStatus:stringCurrent status of the CURPcertificateFolio:stringCertificate information
technicalData:objectTechnical data objectip:string | nullIP of the device from which the verification was made
Note about matchData
MATCHmeans that the input data matches registry dataNO_MATCHmeans the input data does not match registry dataNO_INPUTmeans no data was provided for the fieldNO_DATAmeans the registry did not contain any info for this field
Veriff Customer Portal
You can find the verification session related info, including the decision, in the Veriff Customer Portal, under the webhooks tab.
→ See Review verification in Veriff Customer Portal about how to view the session info in the Veriff Customer portal
Status and reason codes
For an approved session, see:
verification.codeabout verification session decision code, one of9001,9102,9103,9104,9121verification.statusabout verification status, one ofapproved,declined,resubmission_requested,expired,abandoned
If the CURP Database Verification session was declined or resubmission_requested, you can find additional information by checking:
verification.reasonfor the reason why the verification failedverification.reasonCodefor reason code of the failed verification and cross-reference it with Granular reason codes (table)
Additional information
Best practices
CURP format validation: validate the CURP format on your side before submitting to reduce API calls
Error handling: Implement proper error handling for all possible validation results
Webhook security: Secure your webhook endpoint and verify request signatures
User experience: Provide clear feedback to users about validation results
FAQ
What can I use the registryResponse data for?
registryResponse data for?The curpValidation.registryResponse object contains the complete information retrieved from the Mexican government database. This data can be used for:
Identity matching - Compare the registry data with information provided by your end-user
Additional verification - Use fields like date of birth, gender, and name to perform additional checks
Record keeping - Store the official government data for compliance purposes
What are common use cases for CURP Database Verification?
CURP verification with document capture
Combine CURP verification with document capture for enhanced verification:
Create session with CURP in initData
Capture document images through SDK
Receive combined verification results
Validating user-provided information
Use the registryResponse data to validate information your user provided:
User provides name, date of birth, and CURP
Verify CURP through Veriff
Compare
registryResponsefields with user-provided dataMake decision based on match level
How to handle validation errors?
If the CURP verification encounters issues, the validation results will reflect the problem:
Processing failed: System error occurred during verification
Check CURP format
Verify API credentials
Fallback to another verification process
Contact Veriff support if issue persists
CURP is invalid: The CURP does not exist or is malformed
Verify the CURP was entered correctly
Confirm with the user
Request a different identity document
Risk factors detected: The CURP has associated risk indicators
Review your risk tolerance policies
Consider requesting additional verification
Follow your compliance procedures
Changelog
Date | Description |
|---|---|
Nov 27, 2025 | Intro section updated |
Nov 26, 2025 | Some missing payload parameters added |
Nov 19, 2025 |
|
Nov 17, 2025 | Webhook and API payload hierarchy updated API flow steps formatting changed |
Nov 13, 2025 | Payload indentation updated |
Nov 12, 2025 | Documentation published |