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:

  1. Collection — your app uploads fingerprints to the active session using /omni/add/fingerprints.
  2. 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

ValueFormat
1ANSI
2WSQ
3RAW

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.

IndexFingerHand
1ThumbRight
2IndexRight
3MiddleRight
4RingRight
5PinkyRight
6ThumbLeft
7IndexLeft
8MiddleLeft
9RingLeft
10PinkyLeft

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

Upload 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:

FieldTypeRequiredDescription
typeintegerYesFingerprint format: 1 = ANSI, 2 = WSQ, 3 = RAW
fingerprintsarrayYesArray of fingerprint objects
fingerprints[].indexinteger (1–10)YesWhich finger was scanned
fingerprints[].base64FingerprintstringYesBase64-encoded fingerprint image
fingerprints[].fingerprintMetadata.devicestringNoScanner device identifier
fingerprints[].fingerprintMetadata.resolutionstringNoImage resolution
fingerprints[].fingerprintMetadata.qualityScorestringNoQuality 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 index as 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}

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

Trigger 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:

  1. A matched pair (same finger position, both hands) is preferred over a single finger.
  2. Pairs are evaluated in this order: Index (2/7) → Thumb (1/6) → Middle (3/8) → Ring (4/9) → Pinky (5/10).
  3. If no matched pair is available, the highest-priority single finger is sent.
  4. 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

FieldDescription
governmentRecognitionConfidencePrimary face match score
governmentRecognitionConfidence2Secondary face match score

Comparison Results

INE validates whether the data on the ID card matches its records. Each field returns true or false.

FieldWhat is validated
nombreFirst name
apellidoPaternoPaternal last name
apellidoMaternoMaternal last name
claveElectorVoter key
curpCURP
ocrOCR data
anioRegistroRegistration year
anioEmisionIssuance year
numeroEmisionCredencialCredential emission number

Registral Situation

INE returns the current status of the credential.

tipoSituacionRegistral:

ValueMeaning
VIGENTEID is current and valid
NO_VIGENTEID is no longer valid
DATOS_NO_ENCONTRADOSNo data found

tipoReporteRoboExtravio:

ValueMeaning
nullNo report on file
REPORTE_DE_EXTRAVIOID reported lost
REPORTE_DE_ROBOID reported stolen

Status Codes

Status CodeInternal StatusMeaning
0OKIdentity verified successfully
-1PROCESSING_INEResult pending (async)
112, 113INE_SIGNATURE_ERRORSignature validation error
204INE_CONNECTION_ERRORConnection error to INE
205NOT_ENOUGH_DATAInsufficient data provided
1403USER_NOT_FOUND_IN_INE_DBPerson not found in INE database
1404INE_NOT_CURRENTID card is not current
1405INE_REPORTED_LOSTID reported lost
1406INE_REPORTED_STOLENID reported stolen
1505INE_NOT_VALIDID is not valid
1506PROVIDER_UNAVAILABLEINE provider is unavailable
1507MODULE_NOT_SUPPORTEDModule not supported
2336TRANSACTION_LIMIT_REACHEDRate 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

ConstraintDetail
Max fingers per session10 (one per index)
Max fingers sent to INE2
Supported formatsANSI, WSQ, RAW — cannot mix formats in the same session
Session requirementSession must be active to add fingerprints
Re-upload behaviorRe-uploading the same index replaces the existing fingerprint
INE preferenceMatched pair (same finger, both hands) preferred over single
Inline vs. pre-storedFingerprints passed inline in the validation request take precedence over stored ones