INE Fingerprint Validation
Incode's INE Fingerprint Validation lets you verify a user's identity against Mexico's Instituto Nacional Electoral (INE) using fingerprint biometrics captured at a branch or kiosk. You supply fingerprint scans from your existing hardware; Incode forwards them to INE for matching and returns a per-finger confidence score alongside the standard government validation result.
This feature must be enabled for your account before use. Contact your Incode representative if you are interested in this feature.
How It Works
Fingerprint validation is a two-step flow:
- Collection — your app uploads fingerprints to the active session using
/omni/add/fingerprints. - Validation — your app calls
/omni/process/government-validation. Incode selects the best available fingerprints, sends them to INE alongside face and ID data, and returns a combined result.
Fingerprints can also be passed inline in the validation request instead of pre-uploading them. See Sample Request below.
Supported Fingerprint Formats
| Value | Format |
|---|---|
1 | ANSI |
2 | WSQ |
3 | RAW |
All formats submitted in a single session must use the same type. If you upload fingerprints with a different type than what is already stored in the session, all previously stored fingerprints are deleted before the new ones are saved.
The most common format in production is WSQ (type: 2).
Finger Index Mapping
Use the index field to identify which finger was scanned.
| Index | Finger | Hand |
|---|---|---|
| 1 | Thumb | Right |
| 2 | Index | Right |
| 3 | Middle | Right |
| 4 | Ring | Right |
| 5 | Pinky | Right |
| 6 | Thumb | Left |
| 7 | Index | Left |
| 8 | Middle | Left |
| 9 | Ring | Left |
| 10 | Pinky | Left |
The most common submission in production is the right index finger (index: 2) in WSQ format.
If a user cannot provide a specific finger, submit whichever finger is available. A single fingerprint is sufficient — there is no minimum beyond one.
API Reference
POST /omni/add/fingerprints
/omni/add/fingerprintsUpload one or more fingerprints to the active session.
Request body:
{
"type": 2,
"fingerprints": [
{
"index": 2,
"base64Fingerprint": "<base64-encoded image>",
"fingerprintMetadata": {
"device": "scanner_device",
"resolution": "500x500",
"qualityScore": "95"
}
}
]
}Fields:
| Field | Type | Required | Description |
|---|---|---|---|
type | integer | Yes | Fingerprint format: 1 = ANSI, 2 = WSQ, 3 = RAW |
fingerprints | array | Yes | Array of fingerprint objects |
fingerprints[].index | integer (1–10) | Yes | Which finger was scanned |
fingerprints[].base64Fingerprint | string | Yes | Base64-encoded fingerprint image |
fingerprints[].fingerprintMetadata.device | string | No | Scanner device identifier |
fingerprints[].fingerprintMetadata.resolution | string | No | Image resolution |
fingerprints[].fingerprintMetadata.qualityScore | string | No | Quality score reported by the scanner |
Response:
{ "success": true }Behavior notes:
- The session must be active. Fingerprints cannot be added to a completed or expired session.
- Submitting a fingerprint with the same
indexas one already stored in the session overwrites the previous one. Use this to replace a low-quality scan. - You may upload up to 10 fingerprints per session (one per index).
GET /omni/get/fingerprints?interviewId={id}
/omni/get/fingerprints?interviewId={id}Retrieve the fingerprints stored for a session. Returns the same structure as the add request, with base64Fingerprint populated from storage.
POST /omni/process/government-validation
/omni/process/government-validationTrigger INE identity validation. Incode selects the best available fingerprints from the session and sends them to INE alongside face and ID data.
Fingerprints can be passed inline in this request using the fingerprintsData field, or omitted entirely if they were already uploaded via /omni/add/fingerprints — the service retrieves them from storage automatically. Inline fingerprints take precedence over stored ones.
See the Sample Request section for a full example.
Finger Selection Logic
INE accepts a maximum of 2 fingerprints per validation request. Incode automatically selects the best available fingerprints from the session before forwarding to INE.
Selection priority:
- A matched pair (same finger position, both hands) is preferred over a single finger.
- Pairs are evaluated in this order: Index (2/7) → Thumb (1/6) → Middle (3/8) → Ring (4/9) → Pinky (5/10).
- If no matched pair is available, the highest-priority single finger is sent.
- If no fingerprints are available, the request proceeds without fingerprint data.
Example: If the session contains fingers 2, 5, and 7 — the selector sends fingers 2 and 7 (right index + left index, highest-priority pair).
Sample Request
Full example calling /omni/process/government-validation with fingerprints passed inline:
curl -X POST "https://<host>/omni/process/government-validation?interviewId=<interviewId>" \
-H "Content-Type: application/json" \
-H "X-Incode-Hardware-Id: <apiKey>" \
-H "Authorization: Bearer <token>" \
-d '{
"cic": "1234567890",
"claveElector": "ABCDEF123456789012",
"nombre": "JUAN",
"apellidoPaterno": "GARCIA",
"apellidoMaterno": "LOPEZ",
"curp": "GALJ800101HDFRCN09",
"anioRegistro": "2010",
"anioEmision": "2020",
"numeroEmisionCredencial": "01",
"base64Image": "<base64-encoded face template>",
"fingerprintsData": {
"type": 2,
"fingerprints": [
{
"index": 2,
"base64Fingerprint": "<base64-encoded fingerprint image>",
"fingerprintMetadata": {
"device": "Suprema BioMini",
"resolution": "500x500",
"qualityScore": "92"
}
},
{
"index": 7,
"base64Fingerprint": "<base64-encoded fingerprint image>",
"fingerprintMetadata": {
"device": "Suprema BioMini",
"resolution": "500x500",
"qualityScore": "88"
}
}
]
}
}'Sample Success Response
{
"governmentValidationStatus": "OK",
"governmentRecognitionConfidence": 97.3,
"governmentRecognitionConfidence2": 95.1,
"governmentFingerprintConfidence": {
"finger1": null,
"finger2": 98.5,
"finger3": null,
"finger4": null,
"finger5": null,
"finger6": null,
"finger7": 96.2,
"finger8": null,
"finger9": null,
"finger10": null
},
"comparisonResults": {
"nombre": true,
"apellidoPaterno": true,
"apellidoMaterno": true,
"claveElector": true,
"curp": true,
"ocr": true,
"anioRegistro": true,
"anioEmision": true,
"numeroEmisionCredencial": true
},
"registralSituation": {
"tipoSituacionRegistral": "VIGENTE",
"tipoReporteRoboExtravio": null
}
}null values for fingers not submitted are expected. INE only scores the fingers it received.
Response Fields
Fingerprint Confidence
governmentFingerprintConfidence contains per-finger similarity scores returned by INE. Scores range from 0–100. Only fingers included in the request will have non-null values.
Incode applies a pass/fail threshold to each finger's score internally before returning the result.
Face Confidence
| Field | Description |
|---|---|
governmentRecognitionConfidence | Primary face match score |
governmentRecognitionConfidence2 | Secondary face match score |
Comparison Results
INE validates whether the data on the ID card matches its records. Each field returns true or false.
| Field | What is validated |
|---|---|
nombre | First name |
apellidoPaterno | Paternal last name |
apellidoMaterno | Maternal last name |
claveElector | Voter key |
curp | CURP |
ocr | OCR data |
anioRegistro | Registration year |
anioEmision | Issuance year |
numeroEmisionCredencial | Credential emission number |
Registral Situation
INE returns the current status of the credential.
tipoSituacionRegistral:
| Value | Meaning |
|---|---|
VIGENTE | ID is current and valid |
NO_VIGENTE | ID is no longer valid |
DATOS_NO_ENCONTRADOS | No data found |
tipoReporteRoboExtravio:
| Value | Meaning |
|---|---|
null | No report on file |
REPORTE_DE_EXTRAVIO | ID reported lost |
REPORTE_DE_ROBO | ID reported stolen |
Status Codes
| Status Code | Internal Status | Meaning |
|---|---|---|
0 | OK | Identity verified successfully |
-1 | PROCESSING_INE | Result pending (async) |
112, 113 | INE_SIGNATURE_ERROR | Signature validation error |
204 | INE_CONNECTION_ERROR | Connection error to INE |
205 | NOT_ENOUGH_DATA | Insufficient data provided |
1403 | USER_NOT_FOUND_IN_INE_DB | Person not found in INE database |
1404 | INE_NOT_CURRENT | ID card is not current |
1405 | INE_REPORTED_LOST | ID reported lost |
1406 | INE_REPORTED_STOLEN | ID reported stolen |
1505 | INE_NOT_VALID | ID is not valid |
1506 | PROVIDER_UNAVAILABLE | INE provider is unavailable |
1507 | MODULE_NOT_SUPPORTED | Module not supported |
2336 | TRANSACTION_LIMIT_REACHED | Rate limit exceeded |
Dashboard
When fingerprint validation is enabled, the Gov Verification section in the single session view displays:
- Fingerprint images for each finger submitted
- Which finger was captured (index 1–10)
- Individual confidence score per finger
- Pass/fail status per finger
- Overall verification result
- Device metadata
- Timestamp and INE response details
Only fingers that were actually submitted appear in the dashboard — all 10 slots are not shown by default.
Flow / Workflow Configuration
Fingerprint validation behavior is configured per Flow or Workflow within the Government Record Verification module. The following fingerprint-specific options are available when Mexico is selected as a validation country:
- Fingerprint Validation: Enables fingerprint capture and biometric matching as part of the government identity verification flow.
- Minimum Passing Fingerprints: Sets the minimum number of fingerprints that must return a passing match score for the verification to succeed.
- Fingerprint Match Override Score: When enabled, a successful fingerprint match overrides a failed face or data comparison, and the verification is approved based on the fingerprint result alone.
Key Constraints
| Constraint | Detail |
|---|---|
| Max fingers per session | 10 (one per index) |
| Max fingers sent to INE | 2 |
| Supported formats | ANSI, WSQ, RAW — cannot mix formats in the same session |
| Session requirement | Session must be active to add fingerprints |
| Re-upload behavior | Re-uploading the same index replaces the existing fingerprint |
| INE preference | Matched pair (same finger, both hands) preferred over single |
| Inline vs. pre-stored | Fingerprints passed inline in the validation request take precedence over stored ones |
Updated about 20 hours ago
