Available via API | Available via SDK | Needs configuration on Veriff’s side | Needs a separate integration | Needs a separate webhook |
|---|---|---|---|---|
✅ | ✅ | ✅ | ❌/✅* | ❌ |
INE Database Verification is a Mexican voter ID verification solution that validates government-issued INE (Instituto Nacional Electoral) cards against the official INE Lista Nominal database. The INE is a national electoral ID card that serves both as proof of identity and as a voting credential. The solution performs real-time validation of voter registration status, ID validity, and electoral eligibility to ensure accurate identity verification for Mexican residents and compliance with local financial regulations.
*INE Database Verification can be:
add-on to your document + selfie IDV or document-only IDV, or
used separately as a stand-alone check. In this case the whole flow is done over the API.
INE Database Verification is available via API and native SDKs.
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 session info page.
If any data was extracted from the document, this data is provided in the webhook payload and GET /decision endpoint’s response payload.
Note: Contact your Solutions Engineer for initial configuration of this feature.
Prerequisites
You have an integration set up with Veriff
The INE 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 INE credential data
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
Key terminology
Term | Description |
|---|---|
INE | Instituto Nacional Electoral (National Electoral Institute). The INE issues ID cards that contain a voter identification number. These cards come in different types ranging from D to H, with each type requiring different input parameters for verification. |
CIC | Código de Identificación de la Credencial (Credential Identification Code). This is the main identification number on the INE card, required for all card types. |
OCR | Optical Character Recognition code found on type D INE cards. |
Identificador Ciudadano | Citizen identifier code found on type E, F, G, and H INE cards. |
Flow overview
The flow is a bit different, depending on the method (SKD or API) you are using to verify your end-users with Veriff.
End-user data sources and requirements
The INE Database Verification requires end-user’s credential data to be provided via initData or document extraction. The specific fields required depend on the INE card type (D through H).
Required parameters
Card Type | Required Fields | Parameters in POST /session payload |
|---|---|---|
Type D | CIC + OCR ( |
|
Type E | CIC + Identificador Ciudadano ( |
|
Type F | CIC + Identificador Ciudadano ( |
|
Type G | CIC + Identificador Ciudadano ( |
|
Type H | CIC + Identificador Ciudadano ( |
|
The system accepts either mxIfe or mxIne parameters, not both at the same time.
Use via SDKs
Generate a verification session using the API keys and the
baseURLof your INE Database Verification integration (see the API Documentation and API Reference how to find these)Capture end-user's document with Veriff's SDKs:
Send the end-user through the verification flow to capture the images (using the preferred Veriff SDK). The SDK automatically extracts the required INE identifiers
You need the session URL generated in step 1 to use the SDKs (found in response payload as
verification.url)
Session will be submitted automatically once the end-user takes and submits necessary images
Receive the results from Veriff via decision webhook or poll them via GET sessions/{sessionId}/decision[↗] endpoint
Use via API
Stand-alone INE verification
Use when you only need to verify an INE credential without collecting document (and selfie) images.
Generate a verification session using the API keys and the
baseURLof your INE Database Verification integration (see the API Documentation and API Reference how to find these)
Make sure to pass the mandatory
document.numberparameter with the CIC value.Include either
document.documentNumberIdentifiers.mxIfeORdocument.documentNumber_identifiers.mxInedepending on the end-user data sources and requirements.
{
"verification": {
"callback": "https://yourwebsite.com/webhook",
"document": {
"number": "123456789M00000000",
"documentNumberIdentifiers": {
"mxIne": "MEX1234567890123"
}
}
}
}
Patch session status to
submittedstatus using PATCH /sessions/{sessionId}[↗] call
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.
INE with document verification
Generate a verification session using the API keys and the
baseURLof your INE Database Verification integration (see the API Documentation and API Reference how to find these)
Make sure to pass the mandatory
document.numberparameter with the CIC value.Include either
document.documentNumberIdentifiers.mxIfeORdocument.documentNumber_identifiers.mxInedepending on the end-user data sources and requirements.Veriff 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
{
"verification": {
"document": {
"number": "123456789M00000000",
"documentNumberIdentifiers": {
"mxIne": "MEX1234567890123"
}
},
"endUserId": "f7a8d3e2-9c5b-4e16-b8f1-3d9a2e7c8f45"
}
}
curl -X POST \
--url '/v1/sessions/' \
-H 'X-AUTH-CLIENT: API-KEY' \
-H 'Content-Type: application/json' \
-d '{
"verification": {
"document": {
"number": "123456789M00000000",
"documentNumberIdentifiers": {
"mxIne": "MEX1234567890123"
}
},
"endUserId": "f7a8d3e2-9c5b-4e16-b8f1-3d9a2e7c8f45"
}
}'
Use your image-capturing method, or prepare previously collected end-user document 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
{
"image": {
"context": "document-front",
"timestamp": "2025-10-01T10:30:00Z"
}
}
curl -X POST \
--url '/v1/sessions/aea9ba6d-1b47-47fc-a4fc-f72b6d3584a7/media' \
-H 'X-AUTH-CLIENT: API-KEY' \
-F 'image=@/path/to/ine-document.jpg' \
-F 'data={"image":{"context":"document-front","timestamp":"2025-10-01T10:30:00Z"}}'
Patch session status to submitted status using PATCH /sessions/{sessionId}[↗] call
Sample request payload
{
"status": "submitted"
}
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 INE validation results are returned in additionalVerifiedData.officialDatabaseVerification.ine within the webhook payload.
The verification performs three checks:
Processing status - Indicates whether the INE verification request was successfully processed
INE card validity - Confirms the INE credential exists and the data matches the official registry
Voting eligibility - Verifies if the credential holder has active voting rights (not suspended or revoked)
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 credentialskipped- The check was not executed
Webhook payload
Below are a sample and an explanation of a decision webhook payload for a minimal INE 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": "f7a8d3e2-9c5b-4e16-b8f1-3d9a2e7c8f45",
"status": "approved",
"additionalVerifiedData": {
"officialDatabaseVerification": {
"ine": {
"matchData": {
"dateOfBirth": "MATCH",
"fullName": "MATCH",
"gender": "NO_INPUT"
},
"validations": {
"processing": {
"result": "success",
"reasons": null
},
"ineCardIsValid": {
"result": "success",
"reasons": null
},
"ineIsValidForVoting": {
"result": "success",
"reasons": null
},
"matching": {
"result": "sucess"
}
},
"registryResponse": {
"electorKey": "GOMZJN89041509H300",
"issueNumber": "3",
"registrationYear": "2010",
"issueYear": "2018",
"validity": "31 de diciembre de 2028",
"ocr": "0876543210987",
"cic": "IDMEX2023456789012",
"federalDistrict": "4"
}
}
}
},
"attemptId": "96d8c583-0855-43c2-b549-bf8824465835"
},
"technicalData": {
"ip": null
}
}
Request properties explained
status:stringStatus of the responseverification:objectVerification request decision object.nullif decision is not available yetid:stringUUID v4 which identifies the verification sessionattemptId:stringUUID v4 of the attempt which received a statusvendorData:string|nullThe unique identifier that you created for your end-user.nullif not specifiedendUserId:string|nullThe UUID that you created for your end-user.nullif not specifiedstatus:stringVerification status, one ofapproved,declined,resubmission_requested,expired,abandoneddecisionTime:string|nullTimestamp of the decision, represented as UTC YYYY-MM-DDTHH:MM:SS.SSS+Timezone Offset (ISO 8601)acceptanceTime:stringTimestamp of the session generation, represented as UTC YYYY-MM-DDTHH:MM:SS.SSS+Timezone Offset (ISO 8601)code:numberVerification code indicating the reason for the decisionadditionalVerifiedData:objectContains the results of all validationsofficialDatabaseVerification:objectContains the results of the database verificationine:objectContains INE verification resultsvalidations:objectContains validation check 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
processing:objectProcessing validation resultresult:stringOne ofsuccess,failure(request processing encountered an error, e.g., system error, communication issue, provider unavailable),not_applicable(processing check was not configured),skippedreasons:arrayAdditional information about the validation result. Not sent ifresult:success.
ineCardIsValid:objectConfirms that the INE credential exists and data matchesresult:stringOne ofsuccess,failure(credential is invalid, the data does not match, or the credential does not exist),not_applicable(processing check was not configured),skippedreasons:arrayAdditional information about the validation result. Not sent ifresult:success.
ineIsValidForVoting:objectVerifies active voting rightsresult:stringOne ofsuccess,failure(voting rights have been suspended or revoked, though the credential may still be valid as an ID),not_applicable(processing check was not configured),skippedreasons: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 (ine.matchDataparameter is included in the payload)result:stringAlwayssuccess, irrespective ofmatchDataresults
registryResponse:objectDetailed information from the Mexican electoral registryelectorKey:stringVoter key (Clave de Elector) assigned to the credential holderissueNumber:stringThe issue/emission number of the credential (1-9 indicating how many times the credential has been reissued)registrationYear:stringYear the person was registered in the electoral systemissueYear:stringYear the current credential was issuedvalidity:stringExpiration date of the credential (format: DD de MMMM de YYYY in Spanish)ocr:stringOCR (Optical Character Recognition) code from the credentialcic:stringCIC (Código de Identificación de la Credencial) aka credential identification codefederalDistrict:stringFederal electoral district number
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 INE 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": "f7a8d3e2-9c5b-4e16-b8f1-3d9a2e7c8f45",
"status": "approved",
"additionalVerifiedData": {
"officialDatabaseVerification": {
"ine": {
"matchData": {
"dateOfBirth": "MATCH",
"fullName": "MATCH",
"gender": "NO_INPUT"
},
"validations": {
"processing": {
"result": "success",
"reasons": null
},
"ineCardIsValid": {
"result": "success",
"reasons": null
},
"ineIsValidForVoting": {
"result": "success",
"reasons": null
},
"matching": {
"result": "sucess"
}
},
"registryResponse": {
"electorKey": "GOMZJN89041509H300",
"issueNumber": "3",
"registrationYear": "2010",
"issueYear": "2018",
"validity": "31 de diciembre de 2028",
"ocr": "0876543210987",
"cic": "IDMEX2023456789012",
"federalDistrict": "4"
}
}
}
},
"attemptId": "96d8c583-0855-43c2-b549-bf8824465835"
},
"technicalData": {
"ip": null
}
}
Response properties explained
status:stringStatus of the responseverification:objectVerification request decision object.nullif decision is not available yetid:stringUUID v4 which identifies the verification sessionattemptId:stringUUID v4 of the attempt which received a statusvendorData:string|nullThe unique identifier that you created for your end-user.nullif not specifiedendUserId:string|nullThe UUID that you created for your end-user.nullif not specifiedstatus:stringVerification status, one ofapproved,declined,resubmission_requested,expired,abandoneddecisionTime:string|nullTimestamp of the decision, represented as UTC YYYY-MM-DDTHH:MM:SS.SSS+Timezone Offset (ISO 8601)acceptanceTime:stringTimestamp of the session generation, represented as UTC YYYY-MM-DDTHH:MM:SS.SSS+Timezone Offset (ISO 8601)code:numberVerification code indicating the reason for the decisionadditionalVerifiedData:objectContains the results of all validationsofficialDatabaseVerification:objectContains the results of the database verificationine:objectContains INE verification resultsvalidations:objectContains validation check 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
processing:objectProcessing validation resultresult:stringOne ofsuccess,failure(request processing encountered an error, e.g., system error, communication issue, provider unavailable),not_applicable(processing check was not configured),skippedreasons:null|arrayAdditional information about the validation result
ineCardIsValid:objectConfirms that the INE credential exists and data matchesresult:stringOne ofsuccess,failure(credential is invalid, the data does not match, or the credential does not exist),not_applicable(processing check was not configured),skippedreasons:null|arrayAdditional information about the validation result
ineIsValidForVoting:objectVerifies active voting rightsresult:stringOne ofsuccess,failure(voting rights have been suspended or revoked, though the credential may still be valid as an ID),not_applicable(processing check was not configured),skippedreasons:null|arrayAdditional information about the validation result
matching:objectOptional, only available when the input data matching validation was enabled for the integration (ine.matchDataparameter is included in the payload)result:stringAlwayssuccess, irrespective ofmatchDataresults
registryResponse:objectDetailed information from the Mexican electoral registryelectorKey:stringVoter key (Clave de Elector) assigned to the credential holderissueNumber:stringThe issue/emission number of the credential (1-9 indicating how many times the credential has been reissued)registrationYear:stringYear the person was registered in the electoral systemissueYear:stringYear the current credential was issuedvalidity:stringExpiration date of the credential (format: DD de MMMM de YYYY in Spanish)ocr:stringOCR (Optical Character Recognition) code from the credentialcic:stringCIC (Código de Identificación de la Credencial) aka credential identification codefederalDistrict:stringFederal electoral district number
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 INE 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)
INE validation result scenarios
Below are the most common scenarios of INE Database Verification validation results.
Scenario |
| Error handling |
|---|---|---|
The INE/IFE is valid as an ID and valid for voting purposes |
|
|
The INE/IFE is invalid due to incorrect or non-existent data |
|
|
The INE/IFE is invalid as an ID and invalid for voting purposes |
|
|
The INE/IFE is valid as an ID but invalid for voting purposes |
|
|
Error in the data sent in the request |
|
|
Invalid CIC format Invalid OCR format Invalid elector key format Invalid issue number format |
|
|
The individual's voting rights have been suspended by court order; the credential is only valid as an ID |
|
|
The OCR entered does not match the one in the INE database |
|
|
Provider unavailable, connection errors, or processing failures |
|
|
Additional information
Best practices
Provide only one identifier: Include either
mxIfeormxInebased on card type to avoid conflictsFormat validation: Validate credential format on your side before submitting:
CIC: 18 characters (alphanumeric)
OCR (
mxIfe): 13 digitsIdentificador Ciudadano (
mxIne): Variable length alphanumeric with "MEX" prefix
Error handling: Implement proper error handling for all possible validation results
Data privacy: Handle registry response data according to Mexican data privacy laws (LFPDPPP)
Webhook security: Secure your webhook endpoint and verify request signatures
User experience:
Provide clear feedback about validation results
For voting rights issues, explain that the card may still be valid for ID purposes
Guide users to correct common input errors
Card type awareness: Inform users which identifiers are needed based on their card type
Validity period: Check the validity field in the registry response to ensure credential has not expired
Dual-purpose consideration: Remember that INE credentials serve both as ID and voting credentials - configure validations based on your use case
FAQ
What are the use cases for registry response data?
The registryResponse object contains complete information retrieved from the Mexican electoral database for:
Identity matching - Compare registry data with user-provided or document-extracted information
Age verification - Calculate age based on registration year
Additional verification - Cross-reference elector key, issue numbers, and districts
Record keeping - Store official government data for compliance purposes
Voting eligibility confirmation - Verify credential validity period and voting rights status
What are common use cases for INE Database Verification?
INE verification with document capture
Combine INE verification with document capture for enhanced verification:
Create session with INE data in
initDataCapture document images through SDK (document extraction will populate fields automatically)
Receive combined verification results with both document verification and database validation
Voting eligibility check
Specifically verify if someone can vote:
Submit INE credential data
Check the
ineIsValidForVotingvalidation resultUse for voter registration, polling applications, or civic participation platforms
Identity verification only
Verify identity without concern for voting rights:
Submit INE credential data
Focus on the
ineCardIsValidvalidation resultUse for KYC, account creation, or general identity verification
Can I integrate this solution with CURP Database Verification?
INE and CURP verifications can be used together for comprehensive Mexican identity verification:
Use CURP for identity data verification: Validates the person's demographic information (name, date of birth, gender, place of birth)
Use INE for credential verification: Validates the physical credential and voting rights
Cross-reference both: The electoral registry may contain CURP information that can be compared with CURP verification results
This dual-verification approach provides the highest level of confidence in Mexican identity verification.
Changelog
Date | Description |
|---|---|
Nov 27, 2025 | Intro section updated |
Nov 19, 2025 |
|
Nov 17, 2025 | API flow steps formatting updated |
Nov 12, 2025 | Documentation published |