> ## Documentation Index
> Fetch the complete documentation index at: https://docs.origoid.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ID Data Extraction (OCR & Geocoding)

> **Credits:** 1 per call.

Performs OCR on the front and back of a Mexican voter ID (INE / IFE) and returns the structured data printed on the credential: full name, CURP, voter key (CIC / OCR), address, photograph metadata, the document model variant (D, E, F, G, H, I — current and recent INE designs), and the MRZ read from the back when present.

What sets this endpoint apart is **integrated address normalization + geocoding**: the address printed on the INE is rarely clean — abbreviations, missing colonia, inconsistent casing. We normalize and enrich it automatically. You get back not only the raw address text, but also:

- **`addressNormalized`**: the printed INE address, normalized and enriched (corrected casing, expanded abbreviations, validated postal code, and neighborhood / municipality / state matched from the official catalog). The `geocodingStatus` field reports the match confidence: `VERIFIED` (house- or street-level match), `PARTIAL` (locality or postal-code match), or `UNVERIFIED` (no confident match).
- **`electoralGeography`**: derived electoral district, federal entity, and polling section — useful for cross-checking with `validateVoterList`.
- **Document model detection** (D, E, F, G, H, I) and per-model security feature validation.
- **MRZ + QR cross-validation**: when the back contains MRZ and QR, we read both and confirm they agree with the printed fields. Mismatches are flagged.

Use this endpoint to digitize voter ID capture without manual transcription, and to obtain a geo-enriched address record in a single call — eliminating a separate geocoding step in your KYC flow.



## OpenAPI

````yaml /openapi.json post /mex/id/v1/voter-id-extractions
openapi: 3.0.3
info:
  title: OrigoID API
  description: >-
    Identity and Background Verification API for Mexico.


    ### Authentication

    The API Gateway supports the following methods. You must send **one** of
    them in the headers:


    1. **API Key**: `x-api-key: YOUR_KEY`

    2. **Bearer Token**: `Authorization: Bearer YOUR_TOKEN`

    3. **Basic Auth**: `Authorization: Basic BASE64`


    ### Standard Format

    All responses follow this structure (HTTP 200). Authentication errors return
    401.

    ```json

    {
      "status": "OK | ERROR",
      "type": "TYPE_CODE",
      "message": "Description",
      "data": { ... },
      "transactionId": "uuid",
      "processedAt": "2026-03-19T10:00:00-06:00",
      "billable": true
    }

    ```


    ### Rate Limiting

    The API enforces per-endpoint rate limits, calculated on a sliding 1-minute
    window. Limits are defined per user, with a global default that can be
    overridden individually or by payment plan.


    When a limit is exceeded, the API returns HTTP `429 Too Many Requests` with
    the following headers:


    - **`Retry-After`**: seconds to wait before retrying.

    - **`X-RateLimit-Limit`**: total requests allowed in the current window.

    - **`X-RateLimit-Remaining`**: requests remaining in the current window.

    - **`X-RateLimit-Reset`**: Unix timestamp (seconds) when the window resets.


    Clients should implement backoff using `Retry-After`. The response body
    follows the standard envelope with `type: RATE_LIMIT_EXCEEDED`.


    ### Language Conventions

    The API follows a strict bilingual contract:


    - **All API-facing copy is in English**: response messages, error codes,
    field names, schema descriptions, summaries, and tag descriptions.

    - **Passthrough fields preserve the original Spanish text** sourced verbatim
    from Mexican regulators (SAT, RENAPO, IMSS, INE). These include:
      - `officialMessage` — official regulator response text.
      - Fields inside `taxRegimes` and `taxObligations` arrays from CSF (`description`, `dueDate`, etc.) — preserved exactly as published by SAT.
      - Address components extracted from documents (street names, neighborhood names) — preserved as printed.
      - Compliance match fields like `position`, `institution` from PEPs — preserved as recorded by the source.

    Do not translate passthrough fields — their value lies in legal traceability
    to the original source.


    ### Image Processing Policy

    Endpoints that accept images follow a **best-effort processing** philosophy:


    - **Hard Limits** (max file size, supported formats) are strictly enforced.
    A request that exceeds them is rejected with `INVALID_REQUEST` before any
    processing occurs.

    - **Recommendations** (resolution, file size for latency, framing, lighting)
    are guidance — not enforced. Suboptimal images that meet the Hard Limits are
    still processed.

    - If extraction fails on a low-quality image, the endpoint returns the
    appropriate type code (`IMAGE_UNREADABLE`, `NO_FACE_DETECTED`,
    `DOCUMENT_NOT_IDENTIFIED`, etc.) with `billable: true` — processing did run
    and consumed resources.


    This policy exists because integrators often cannot control their capture
    SDK output (third-party SDKs, legacy systems, browser-based capture).
    Rejecting suboptimal images would block legitimate use cases. Processing
    best-effort and reporting honest results gives the integrator the
    information needed to decide whether to retry or accept the result.


    ### Date and Time Conventions

    All temporal fields across the API follow standardized formats:


    - **`processedAt`**: ISO 8601 datetime with Mexico City offset (`-06:00`).
    Example: `2026-03-19T10:00:00-06:00`.

    - **Date-only fields** (`dateOfBirth`, `dueDate`, `issueDate`,
    `publicationDate`, `publicationDateSat`, `publicationDateDof`,
    `constitutionDate`, `startDate`, `registrationDate`,
    `lastStatusChangeDate`): ISO 8601 date (`YYYY-MM-DD`). Example:
    `2024-01-10`.

    - **Year-month fields** (`reportPeriod`, `positionEndDate`): ISO 8601
    year-month (`YYYY-MM`). Example: `2026-02`. (`positionEndDate` is normalised
    from the source — the PEP provider publishes the month and year a former
    office-holder left office, e.g. `Septiembre de 2024` becomes `2024-09`.)

    - **Year-only fields** (`year`, `emissionYear`, `registrationYear`,
    `validUntilYear`): returned as 4-digit string (e.g. `"2022"`). Strings
    preserve the raw value sourced from the document; clients may safely parse
    to integer.

    - **Money fields** (`baseSalary`, `amountDue`, `taxAmount`): object `{
    amount: "<decimal-string>", currency: "<ISO 4217>" }`. Amounts are decimal
    strings (not floats) to avoid precision errors. Example: `{ "amount":
    "452.50", "currency": "MXN" }`.


    ---


    # Catalogs


    #### 1. CURP Status (`statusCurp`)


    Status code returned by RENAPO inside `personalInfo.statusCurp` and similar
    fields.


    | `statusCurp` | State | Description |

    | :--- | :--- | :--- |

    | `AN` | Active | Normal registration (Alta Normal). Valid and current. |

    | `AH` | Active | Homonymy alert (Alta con Homonimia). First 16 chars match
    another CURP. |

    | `RCC` | Active | Change affecting CURP (Registro con Cambio). Data
    correction modified the key. |

    | `RCN` | Active | Change not affecting CURP. Minor data correction. |

    | `BAP` | Inactive | Apocryphal document (Baja por documento apócrifo). |

    | `BSU` | Inactive | Unused (Baja sin uso). Requires reactivation at a
    RENAPO module. |

    | `BD` | Inactive | Deceased (Baja por defunción). |

    | `BDM` | Inactive | Administrative cancellation (Baja administrativa). |

    | `BDP` | Inactive | Adoption-related cancellation (Baja por adopción). |

    | `BJD` | Inactive | Judicial cancellation (Baja judicial). |


    #### 2. Probatory Document (`docProbatorio`)


    Code identifying which civil document supports the CURP registration.


    | `docProbatorio` | Document |

    | :--- | :--- |

    | `1` | Birth Certificate (Acta de Nacimiento) |

    | `3` | Migration Document (Documento Migratorio) |

    | `4` | Naturalization Certificate (Carta de Naturalización) |

    | `7` | Mexican Nationality Certificate (Certificado de Nacionalidad
    Mexicana) |

    | `8` | SEGOB Processing (Trámite ante SEGOB) |


    #### 3. Mexican State Codes (`entidad` / `claveEntidad`)


    Two-letter codes used in CURP, RFC composition, INE registration, and
    addresses. State names preserved in Spanish (proper nouns).


    | `entidad` | State | `entidad` | State |

    | :--- | :--- | :--- | :--- |

    | `AS` | Aguascalientes | `QR` | Quintana Roo |

    | `BC` | Baja California | `SP` | San Luis Potosí |

    | `BS` | Baja California Sur | `SL` | Sinaloa |

    | `CC` | Campeche | `SR` | Sonora |

    | `CL` | Coahuila | `TC` | Tabasco |

    | `CM` | Colima | `TS` | Tamaulipas |

    | `CS` | Chiapas | `TL` | Tlaxcala |

    | `CH` | Chihuahua | `VZ` | Veracruz |

    | `DF` | Ciudad de México | `YN` | Yucatán |

    | `DG` | Durango | `ZS` | Zacatecas |

    | `GT` | Guanajuato | `NE` | Born Abroad (Nacido en el Extranjero) |

    | `GR` | Guerrero | `MC` | Estado de México |

    | `HG` | Hidalgo | `MN` | Michoacán |

    | `JC` | Jalisco | `MS` | Morelos |

    | `NT` | Nayarit | `NL` | Nuevo León |

    | `OC` | Oaxaca | `PL` | Puebla |

    | `QT` | Querétaro | | |


    #### 4. IMSS Coverage Modalities (`modalidad`)


    IMSS modality codes describe the worker's affiliation type. Official
    descriptions preserved in Spanish for legal traceability with the institute.


    | `modalidad` | Description |

    | :--- | :--- |

    | `10` | Urban permanent and temporary workers (Trabajadores permanentes y
    eventuales de la ciudad) |

    | `13` | Rural temporary workers (Trabajadores eventuales del campo) |

    | `14` | Rural permanent workers (Trabajadores permanentes del campo) |

    | `17` | Re-entry rural temporary workers (Reingreso de trabajadores
    eventuales del campo) |

    | `18` | Re-entry rural permanent workers (Reingreso de trabajadores
    permanentes del campo) |

    | `30` | Re-entry urban permanent and temporary workers (Reingreso de
    trabajadores permanentes y eventuales de la ciudad) |

    | `31` | Voluntary continuation in the mandatory regime (Continuación
    voluntaria al régimen obligatorio) |

    | `32` | Independent workers (Trabajadores independientes) |

    | `33` | Domestic workers (Trabajadores domésticos) |

    | `34` | Federal or state government workers (Trabajadores del gobierno
    federal o estatal) |

    | `35` | IMSS-affiliated students (Estudiantes afiliados al IMSS) |

    | `36` | Scholarship holders or social programs (Becarios o programas
    sociales) |

    | `40` | Voluntary continuation in the mandatory regime (alternate) |

    | `42` | Individual employer with domestic workers (Patrón persona física
    con trabajadores domésticos) |

    | `43` | International organization workers (Trabajadores de organismos
    internacionales) |

    | `44` | Seasonal or fixed-term workers (Trabajadores por temporada o tiempo
    determinado) |

    | `45` | Re-entered retirees in mandatory regime (Pensionados reincorporados
    al régimen obligatorio) |

    | `46` | Construction temporary workers (Trabajadores eventuales de la
    construcción) |

    | `47` | Trust workers with special regime (Trabajadores de confianza con
    régimen especial) |

    | `48` | Affiliated municipal public servants (Servidores públicos
    municipales afiliados) |

    | `50` | Voluntary continuation with extended coverage (Continuación
    voluntaria con cobertura extendida) |

    | `51` | Voluntary affiliation for students or apprentices (Afiliación
    voluntaria para estudiantes o aprendices) |

    | `60` | Special social incorporation regime — RESICO (Régimen especial de
    incorporación social) |

    | `70` | IMSS-Bienestar or community programs modality |

    | `72` | Inter-agency public agreement with IMSS (Convenio entre
    dependencias públicas y el IMSS) |


    #### 5. SAT Article 69 Sub-lists (`listType`)


    | `listType` | Sub-list (SAT) | Risk Level |

    | :--- | :--- | :--- |

    | <code style="white-space:nowrap">SAT_69_FIRMES</code> | Firmes | MEDIUM |

    | <code style="white-space:nowrap">SAT_69_CANCELADOS</code> | Cancelados
    (Insolvencia, general) | MEDIUM |

    | <code style="white-space:nowrap">SAT_69_CANCELADOS_07_15</code> |
    Cancelados 2007–2015 (Art. 146-A) | MEDIUM |

    | <code style="white-space:nowrap">SAT_69_EXIGIBLES</code> | Exigibles |
    MEDIUM |

    | <code style="white-space:nowrap">SAT_69_NO_LOCALIZADOS</code> | No
    Localizados | HIGH |

    | <code style="white-space:nowrap">SAT_69_CSD_SIN_EFECTOS</code> |
    Certificados de Sello Digital (CSD) sin Efectos | HIGH |

    | <code style="white-space:nowrap">SAT_69_SENTENCIAS</code> | Sentencias |
    CRITICAL |

    | <code style="white-space:nowrap">SAT_69_REDUCCION_74_CFF</code> |
    Reducción Art. 74 CFF | LOW |

    | <code style="white-space:nowrap">SAT_69_CONDONADOS_07_15</code> |
    Condonados 2007–2015 (Decreto) | LOW |

    | <code style="white-space:nowrap">SAT_69_CONDONADOS_146B_CFF</code> |
    Condonados Art. 146-B CFF | LOW |

    | <code style="white-space:nowrap">SAT_69_CONDONADOS_DECRETO</code> |
    Condonados por Decreto | LOW |

    | <code style="white-space:nowrap">SAT_69_CONDONADOS_21_CFF</code> |
    Condonados Art. 21 CFF | LOW |

    | <code style="white-space:nowrap">SAT_69_RETORNO_INVERSIONES</code> |
    Retorno de Inversiones | LOW |

    | <code style="white-space:nowrap">SAT_69_ENTES_PUBLICOS_OMISOS</code> |
    Entes Públicos y de Gobierno Omisos | LOW |


    #### 6. SAT Article 69-B Status (`complianceDetails.status`)


    The SAT 69-B endpoint always returns `listType: SAT_69B`. The granular state
    lives in `complianceDetails.status`:


    | `status` | Description | Risk Level |

    | :--- | :--- | :--- |

    | <code style="white-space:nowrap">PRESUNTO</code> | Currently under
    investigation for simulated operations (EFOS) | HIGH |

    | <code style="white-space:nowrap">DEFINITIVO</code> | Confirmed shell
    company / EFOS | CRITICAL |

    | <code style="white-space:nowrap">DESVIRTUADO</code> | Investigated but
    successfully proved innocence | LOW |

    | <code style="white-space:nowrap">SENTENCIA_FAVORABLE</code> | Won in court
    / cleared by judicial ruling | LOW |


    #### 7. PEPs Categories (`listType`)


    These are OrigoID's stable taxonomy codes. They remain consistent over time
    so client integrations don't need to change when data sources evolve.


    | `listType` | Description | Risk Level |

    | :--- | :--- | :--- |

    | <code style="white-space:nowrap">PEP_ACTIVE</code> | Politically Exposed
    Person — currently in office | HIGH |

    | <code style="white-space:nowrap">PEP_INACTIVE</code> | Politically Exposed
    Person — record marked inactive by the source | MEDIUM |

    | <code style="white-space:nowrap">EX_PEP</code> | Former PEP — held office
    in the past | MEDIUM |

    | <code style="white-space:nowrap">PEP_AFFINITY</code> | Family member or
    close associate of an active PEP | MEDIUM |

    | <code style="white-space:nowrap">EX_PEP_AFFINITY</code> | Family member or
    close associate of a former PEP | LOW |


    #### 8. OFAC Lists (`listType`)


    We query the official OFAC sanctions lists in real time and consolidate them
    under the `listType` codes below. Each entry also exposes
    `complianceDetails.programs[]` (sanction program codes such as CUBA, IRAN,
    RUSSIA, etc. — these evolve continuously and are not statically catalogued)
    and `complianceDetails.entityType` (`INDIVIDUAL` | `ENTITY` | `VESSEL` |
    `AIRCRAFT`).


    | `listType` | Official OFAC list | Risk Level |

    | :--- | :--- | :--- |

    | <code style="white-space:nowrap">OFAC_SDN</code> | Specially Designated
    Nationals & Blocked Persons | CRITICAL |

    | <code style="white-space:nowrap">OFAC_NON_SDN</code> | Consolidated
    Non-SDN List | HIGH |

    | <code style="white-space:nowrap">OFAC_FSE</code> | Foreign Sanctions
    Evaders | CRITICAL |

    | <code style="white-space:nowrap">OFAC_NS_ISA</code> | Non-SDN Iran
    Sanctions Act List | HIGH |

    | <code style="white-space:nowrap">OFAC_SSI</code> | Sectoral Sanctions
    Identifications List | MEDIUM |

    | <code style="white-space:nowrap">OFAC_CAPTA</code> | Foreign Financial
    Institutions subject to Correspondent / Payable-Through Account Sanctions |
    HIGH |

    | <code style="white-space:nowrap">OFAC_NS_PLC</code> | Non-SDN Palestinian
    Legislative Council | LOW |


    #### 9. CFDI Effect (`effect`)


    Fiscal purpose of the invoice as classified by SAT. Each CFDI has exactly
    one effect.


    | `effect` | SAT code | Description |

    | :--- | :--- | :--- |

    | <code style="white-space:nowrap">INCOME</code> | I (Ingreso) | Sales /
    revenue invoice. Issuer received payment for goods or services. |

    | <code style="white-space:nowrap">EXPENSE</code> | E (Egreso) | Refund,
    credit note, or discount. Reverses or reduces a previous income invoice. |

    | <code style="white-space:nowrap">TRANSPORT</code> | T (Traslado) | Goods
    transport waybill (Carta Porte). Does not reflect a sale, only movement of
    goods. |

    | <code style="white-space:nowrap">PAYROLL</code> | N (Nómina) | Payroll
    receipt issued by an employer to an employee. |

    | <code style="white-space:nowrap">PAYMENT</code> | P (Pago) | Payment
    receipt complement (REP) for invoices paid in installments (PPD). |


    #### 10. CFDI Status (`status`)


    Current fiscal status of the CFDI according to SAT's verification service.


    | `status` | Description |

    | :--- | :--- |

    | <code style="white-space:nowrap">VALID</code> | Vigente. The CFDI is
    current and fiscally valid. |

    | <code style="white-space:nowrap">CANCELED</code> | Cancelada. The CFDI has
    been canceled and is no longer fiscally valid. |


    #### 11. CFDI Cancellation Status (`cancellationStatus`)


    Reflects SAT's 2022 cancellation rules ("cancelación con aceptación"), which
    require receiver consent in some scenarios. This field shows both
    pre-cancellation eligibility and post-cancellation outcome.


    | `cancellationStatus` | Description |

    | :--- | :--- |

    | <code style="white-space:nowrap">NOT_CANCELABLE</code> | Cannot be
    canceled (e.g. payment complements, payroll receipts, or invoices linked to
    other active CFDIs). |

    | <code style="white-space:nowrap">CANCELABLE_WITHOUT_ACCEPTANCE</code> |
    The issuer may cancel unilaterally (small amounts, payroll corrections,
    etc.). |

    | <code style="white-space:nowrap">CANCELABLE_WITH_ACCEPTANCE</code> | The
    issuer can request cancellation, but the receiver must accept it within 72
    hours. |

    | <code style="white-space:nowrap">CANCELED_WITHOUT_ACCEPTANCE</code> |
    Already canceled; acceptance was not required. |

    | <code style="white-space:nowrap">CANCELED_WITH_ACCEPTANCE</code> | Already
    canceled; the receiver approved the cancellation. |


    ---

    **Soporte:** contacto@origoid.com
  version: 1.0.0
  contact:
    name: Soporte OrigoId
    email: contacto@origoid.com
servers:
  - url: https://api.origoid.com
security:
  - ApiKeyAuth: []
  - BearerAuth: []
  - BasicAuth: []
tags:
  - name: Authentication
    description: Generation of temporary bearer tokens (JWT).
  - name: RENAPO
    description: Official identity and CURP validation.
  - name: INE
    description: Validation of Nominal Lists and Voter Credentials.
  - name: Social Security
    description: Employment and social security data.
  - name: Biometrics
    description: Facial biometric comparison against identity documents.
  - name: Compliance
    description: 'Sanctions and risk lists: SAT 69, SAT 69-B, OFAC, and PEPs.'
  - name: Email
    description: Email deliverability and fraud risk validation.
  - name: Proof of Address
    description: >-
      Data extraction from utility and proof-of-address documents (CFE, Telmex,
      Telcel, etc.).
  - name: Fiscal
    description: RFC validation and CSF (Constancia de Situación Fiscal) extraction.
  - name: Banking
    description: SPEI / CEP payment validation against Banco de México.
paths:
  /mex/id/v1/voter-id-extractions:
    post:
      tags:
        - INE
      summary: ID Data Extraction (OCR & Geocoding)
      description: >-
        **Credits:** 1 per call.


        Performs OCR on the front and back of a Mexican voter ID (INE / IFE) and
        returns the structured data printed on the credential: full name, CURP,
        voter key (CIC / OCR), address, photograph metadata, the document model
        variant (D, E, F, G, H, I — current and recent INE designs), and the MRZ
        read from the back when present.


        What sets this endpoint apart is **integrated address normalization +
        geocoding**: the address printed on the INE is rarely clean —
        abbreviations, missing colonia, inconsistent casing. We normalize and
        enrich it automatically. You get back not only the raw address text, but
        also:


        - **`addressNormalized`**: the printed INE address, normalized and
        enriched (corrected casing, expanded abbreviations, validated postal
        code, and neighborhood / municipality / state matched from the official
        catalog). The `geocodingStatus` field reports the match confidence:
        `VERIFIED` (house- or street-level match), `PARTIAL` (locality or
        postal-code match), or `UNVERIFIED` (no confident match).

        - **`electoralGeography`**: derived electoral district, federal entity,
        and polling section — useful for cross-checking with
        `validateVoterList`.

        - **Document model detection** (D, E, F, G, H, I) and per-model security
        feature validation.

        - **MRZ + QR cross-validation**: when the back contains MRZ and QR, we
        read both and confirm they agree with the printed fields. Mismatches are
        flagged.


        Use this endpoint to digitize voter ID capture without manual
        transcription, and to obtain a geo-enriched address record in a single
        call — eliminating a separate geocoding step in your KYC flow.
      operationId: extractVoterIdData
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - front
              properties:
                front:
                  type: string
                  description: Front image in Base64 (PNG/JPG)
                back:
                  type: string
                  description: Back image in Base64 (PNG/JPG). Optional.
      responses:
        '200':
          description: Extraction results (Strict Envelope Pattern).
          content:
            application/json:
              examples:
                Success D:
                  summary: 'Success: IFE Type D (pre-2014)'
                  value:
                    status: OK
                    type: SUCCESS
                    message: Document processed successfully
                    data:
                      documentType: IFE
                      model: D
                      personalInfo:
                        givenNames: RAQUEL
                        firstSurname: MIRANDA
                        secondSurname: ARAUJO
                        dateOfBirth: '1979-02-19'
                        sex: M
                        gender: null
                        selfIdentification: null
                        curp: MXAR790219MSLRRQ00
                        electorKey: MRARRQ79021925M800
                      address:
                        addressLine1: C EL CAPULE 392
                        addressLine2: FRACC JARDINES DE LA SIERRA 80019
                        addressLine3: CULIACAN, SIN.
                      addressNormalized:
                        geocodingStatus: VERIFIED
                        street: Calle El Capule
                        exteriorNumber: '392'
                        interiorNumber: null
                        neighborhood: Fraccionamiento Jardines de la Sierra
                        zipCode: '80019'
                        municipality: Culiacán
                        state: Sinaloa
                        country: Mexico
                      electoralGeography:
                        stateCode: '25'
                        stateName: SINALOA
                        municipalityCode: '006'
                        municipalityName: CULIACAN
                        section: '1218'
                        locality: '0001'
                      validity:
                        registrationYear: '1999'
                        emissionNumber: '03'
                        emissionYear: '2014'
                        validUntilYear: '2024'
                      security:
                        cic: '119195412'
                        ocr: '1218079288742'
                        citizenIdentifier: '079288742'
                        barCode: '119195412'
                        qr: >-
                          http://qr.ife.org.mx/121807928874203119195412/20140626/S/006176
                        mrz: >-
                          IDMEX1191954121<<12180792887427902192M2412311MEX<03<<10110<1MIRANDAARAUJO<<RAQUEL
                      mrzValidation:
                        dateOfBirth: true
                        sex: true
                        validity: true
                        emission: true
                        cic: true
                        name: false
                      qrValidation:
                        cic: true
                        ocr: true
                        citizenIdentifier: true
                      files:
                        - kind: face
                          contentType: image/jpeg
                          sizeBytes: 8421
                          content: >-
                            /9j/4AAQSkZJRgABAQEAYABgAAD...TRUNCATED_BASE64.../9k=
                    billable: true
                    transactionId: 550e8400-e29b-41d4-a716-446655440000
                    processedAt: '2026-03-15T19:23:00-06:00'
                Success E:
                  summary: 'Success: INE Type E (2014)'
                  value:
                    status: OK
                    type: SUCCESS
                    message: Document processed successfully
                    data:
                      documentType: INE
                      model: E
                      personalInfo:
                        givenNames: ANA SOFIA
                        firstSurname: GONZALEZ
                        secondSurname: SILVA
                        dateOfBirth: '1988-07-18'
                        sex: M
                        gender: null
                        selfIdentification: null
                        curp: GOSA880718MNLNLN07
                        electorKey: GNSLAN88071819M500
                      address:
                        addressLine1: AV LAGO ALBERTO 320 TORRE CENTRAL 503
                        addressLine2: COL ANAHUAC 11320
                        addressLine3: MIGUEL HIDALGO, CDMX
                      addressNormalized:
                        geocodingStatus: VERIFIED
                        street: Avenida Lago Alberto
                        exteriorNumber: '320'
                        interiorNumber: Torre Central 503
                        neighborhood: Anáhuac
                        zipCode: '11320'
                        municipality: Miguel Hidalgo
                        state: Ciudad de México
                        country: Mexico
                      electoralGeography:
                        stateCode: '09'
                        stateName: CIUDAD DE MÉXICO
                        municipalityCode: '016'
                        municipalityName: MIGUEL HIDALGO
                        section: '5156'
                        locality: '0001'
                      validity:
                        registrationYear: '2006'
                        emissionNumber: '02'
                        emissionYear: '2019'
                        validUntilYear: '2029'
                      security:
                        cic: '190272757'
                        ocr: '5156075473604'
                        citizenIdentifier: '075473604'
                        barCode: null
                        qr: null
                        mrz: >-
                          IDMEX1902727572<<51560754736048807180M2912316MEX<02<<17573<4GONZALEZ<SILVA<<ANA<SOFIA
                      mrzValidation:
                        dateOfBirth: true
                        sex: true
                        validity: true
                        emission: true
                        cic: false
                        name: true
                      qrValidation: null
                      files:
                        - kind: face
                          contentType: image/jpeg
                          sizeBytes: 8421
                          content: >-
                            /9j/4AAQSkZJRgABAQEAYABgAAD...TRUNCATED_BASE64.../9k=
                    billable: true
                    transactionId: 5f3e2a1b-8c7d-4e6f-9a0b-1c2d3e4f5a6b
                    processedAt: '2026-03-15T19:24:12-06:00'
                Success G:
                  summary: 'Success: INE Type G (2019+)'
                  value:
                    status: OK
                    type: SUCCESS
                    message: Document processed successfully
                    data:
                      documentType: INE
                      model: G
                      personalInfo:
                        givenNames: ANGEL LUIS
                        firstSurname: ORTEGA
                        secondSurname: OSORIO
                        dateOfBirth: '1983-09-06'
                        sex: H
                        gender: null
                        selfIdentification: null
                        curp: OEOA830906HVZRSN07
                        electorKey: OROSAN83090630H100
                      address:
                        addressLine1: C ZARAGOZA 3
                        addressLine2: LOC NAOLINCO 91400
                        addressLine3: NAOLINCO, VER
                      addressNormalized:
                        geocodingStatus: VERIFIED
                        street: Calle Zaragoza
                        exteriorNumber: '3'
                        interiorNumber: null
                        neighborhood: Centro
                        zipCode: '91400'
                        municipality: Naolinco
                        state: Veracruz de Ignacio de la Llave
                        country: Mexico
                      electoralGeography:
                        stateCode: null
                        stateName: null
                        municipalityCode: null
                        municipalityName: null
                        section: '2596'
                        locality: null
                      validity:
                        registrationYear: '2002'
                        emissionNumber: '02'
                        emissionYear: '2023'
                        validUntilYear: '2033'
                      security:
                        cic: '256434491'
                        ocr: '2596017401625'
                        citizenIdentifier: '017401625'
                        barCode: null
                        qr: >-
                          http://qr.ine.mx/259601740162502256434491/20231205/P/003977
                        mrz: >-
                          IDMEX2564344912<<25960174016258309064H3312315MEX<02<<08317<3ORTEGAKOSORIO<<ANGEL<LUIS
                      mrzValidation:
                        dateOfBirth: true
                        sex: true
                        validity: true
                        emission: true
                        cic: false
                        name: true
                      qrValidation:
                        cic: true
                        ocr: true
                        citizenIdentifier: true
                      files:
                        - kind: face
                          contentType: image/jpeg
                          sizeBytes: 8421
                          content: >-
                            /9j/4AAQSkZJRgABAQEAYABgAAD...TRUNCATED_BASE64.../9k=
                    billable: true
                    transactionId: 7a1b2c3d-4e5f-4a6b-8c9d-0e1f2a3b4c5d
                    processedAt: '2026-03-15T19:25:47-06:00'
                Success I:
                  summary: 'Success: INE Type I (2026+, self-identification)'
                  value:
                    status: OK
                    type: SUCCESS
                    message: Document processed successfully
                    data:
                      documentType: INE
                      model: I
                      personalInfo:
                        givenNames: ALEX
                        firstSurname: VARGAS
                        secondSurname: IBARRA
                        dateOfBirth: '1994-11-23'
                        sex: H
                        gender: NB
                        selfIdentification: INDÍGENA
                        curp: VAIA941123HDFRGX05
                        electorKey: VRGBRL94112309H300
                      address:
                        addressLine1: AV REFORMA 210
                        addressLine2: COL JUAREZ 06600
                        addressLine3: CUAUHTEMOC, CDMX
                      addressNormalized:
                        geocodingStatus: VERIFIED
                        street: Avenida Paseo de la Reforma
                        exteriorNumber: '210'
                        interiorNumber: null
                        neighborhood: Juárez
                        zipCode: '06600'
                        municipality: Cuauhtémoc
                        state: Ciudad de México
                        country: Mexico
                      electoralGeography:
                        stateCode: null
                        stateName: null
                        municipalityCode: null
                        municipalityName: null
                        section: '1487'
                        locality: null
                      validity:
                        registrationYear: '2016'
                        emissionNumber: '02'
                        emissionYear: '2026'
                        validUntilYear: '2036'
                      security:
                        cic: '418223057'
                        ocr: '1487022417538'
                        citizenIdentifier: '022417538'
                        barCode: null
                        qr: >-
                          http://qr.ine.mx/148702241753802418223057/20260710/S/012844
                        mrz: >-
                          IDMEX4182230571<<14870224175389411231H3612311MEX<02<<12844<7VARGAS<IBARRA<<ALEX
                      mrzValidation:
                        dateOfBirth: true
                        sex: true
                        validity: true
                        emission: true
                        cic: true
                        name: true
                      qrValidation:
                        cic: true
                        ocr: true
                        citizenIdentifier: true
                      files:
                        - kind: face
                          contentType: image/jpeg
                          sizeBytes: 8421
                          content: >-
                            /9j/4AAQSkZJRgABAQEAYABgAAD...TRUNCATED_BASE64.../9k=
                    transactionId: 7c4a9e21-3b8f-4d6a-9e02-1f5c8a2b6d04
                    processedAt: '2026-07-14T10:32:00-06:00'
                    billable: true
                Unreadable:
                  summary: 'Error: Unreadable Image'
                  value:
                    status: OK
                    type: IMAGE_UNREADABLE
                    message: Image is too blurry or obscured to extract data
                    data: null
                    transactionId: e1f2a3b4-5c6d-7e8f-9a0b-123456789012
                    processedAt: '2026-03-15T21:25:00-06:00'
                    billable: true
                Unsupported:
                  summary: 'Error: Unsupported Document'
                  value:
                    status: OK
                    type: DOCUMENT_NOT_IDENTIFIED
                    message: Document is not a supported Mexican voter ID
                    data: null
                    transactionId: a1b2c3d4-e5f6-7a8b-9c0d-123456789013
                    processedAt: '2026-03-15T21:26:00-06:00'
                    billable: true
                Validation Error:
                  summary: Validation Error
                  value:
                    status: ERROR
                    type: INVALID_REQUEST
                    message: Validation failed
                    data: null
                    transactionId: b2c3d4e5-f6a7-8b9c-0d1e-123456789014
                    processedAt: '2026-03-15T21:27:00-06:00'
                    billable: false
                    errors:
                      - field: front
                        code: MISSING_REQUIRED_FIELD
                        message: must have required property 'front'
                      - field: front
                        code: PAYLOAD_TOO_LARGE
                        message: front exceeds 12 MB base64 length
                      - field: back
                        code: PAYLOAD_TOO_LARGE
                        message: back exceeds 12 MB base64 length
                      - field: body
                        code: PAYLOAD_TOO_LARGE
                        message: Request body exceeds 28 MB
                      - field: front
                        code: INVALID_FORMAT
                        message: front must be a valid base64-encoded image
                      - field: back
                        code: INVALID_FORMAT
                        message: back must be a valid base64-encoded image
                Internal Error:
                  summary: Internal Error
                  value:
                    status: ERROR
                    type: INTERNAL_ERROR
                    message: Unexpected internal error
                    data: null
                    transactionId: c3d4e5f6-a7b8-9c0d-1e2f-123456789015
                    processedAt: '2026-03-15T21:28:00-06:00'
                    billable: false
              schema:
                $ref: '#/components/schemas/Envelope'
        '401':
          description: Unauthorized
          content:
            application/json:
              examples:
                Unauthorized:
                  summary: Unauthorized
                  value:
                    status: ERROR
                    type: UNAUTHORIZED
                    message: Invalid credentials
                    data: null
                    transactionId: 71d64fd8-8a54-4792-a844-7e2466eb01f7
                    processedAt: '2026-05-21T10:00:00-06:00'
                    billable: false
              schema:
                $ref: '#/components/schemas/Envelope'
        '429':
          description: Too Many Requests — endpoint rate limit exceeded.
          headers:
            Retry-After:
              schema:
                type: integer
              description: Seconds to wait before retrying.
            X-RateLimit-Limit:
              schema:
                type: integer
              description: >-
                Total requests allowed in the current window (per minute, per
                endpoint, per user/plan).
            X-RateLimit-Remaining:
              schema:
                type: integer
              description: Requests remaining in the current window.
            X-RateLimit-Reset:
              schema:
                type: integer
              description: Unix timestamp (seconds) when the rate limit window resets.
          content:
            application/json:
              examples:
                Rate Limit:
                  summary: Rate Limit Exceeded
                  value:
                    status: ERROR
                    type: RATE_LIMIT_EXCEEDED
                    message: >-
                      API rate limit exceeded for this endpoint. Retry after the
                      duration specified in the Retry-After header.
                    data: null
                    transactionId: fbb9d46f-53b2-4e6b-b07c-d9ed4ff4b3c9
                    processedAt: '2026-04-26T10:00:00-06:00'
                    billable: false
              schema:
                $ref: '#/components/schemas/Envelope'
      x-codeSamples:
        - lang: cURL
          source: >-
            curl -X POST https://api.origoid.com/mex/id/v1/voter-id-extractions
            \
              -H "x-api-key: YOUR_API_KEY" \
              -H "content-type: application/json" \
              -d '{"front": "<base64 image (JPG or PNG)>"}'
        - lang: JavaScript
          source: >-
            const response = await
            fetch("https://api.origoid.com/mex/id/v1/voter-id-extractions", {
              method: "POST",
              headers: {
                "x-api-key": process.env.ORIGOID_API_KEY,
                "content-type": "application/json",
              },
              body: JSON.stringify({
                "front": "<base64 image (JPG or PNG)>"
              }),
            });


            if (!response.ok) {
              throw new Error(`HTTP ${response.status}`);
            }


            const result = await response.json();

            console.log(result);
        - lang: Python
          source: |-
            import os
            import requests

            response = requests.post(
                "https://api.origoid.com/mex/id/v1/voter-id-extractions",
                headers={
                    "x-api-key": os.environ["ORIGOID_API_KEY"],
                    "content-type": "application/json",
                },
                json={
                    "front": "<base64 image (JPG or PNG)>"
                },
                timeout=30,
            )
            response.raise_for_status()
            result = response.json()
            print(result)
        - lang: Java
          source: |-
            import java.net.URI;
            import java.net.http.HttpClient;
            import java.net.http.HttpRequest;
            import java.net.http.HttpResponse;
            import java.time.Duration;

            public class Example {
                public static void main(String[] args) throws Exception {
                    String payload = "{\"front\": \"<base64 image (JPG or PNG)>\"}";

                    HttpClient client = HttpClient.newBuilder()
                        .connectTimeout(Duration.ofSeconds(10))
                        .build();

                    HttpRequest request = HttpRequest.newBuilder()
                        .uri(URI.create("https://api.origoid.com/mex/id/v1/voter-id-extractions"))
                        .header("x-api-key", System.getenv("ORIGOID_API_KEY"))
                        .header("content-type", "application/json")
                        .timeout(Duration.ofSeconds(30))
                        .POST(HttpRequest.BodyPublishers.ofString(payload))
                        .build();

                    HttpResponse<String> response = client.send(
                        request, HttpResponse.BodyHandlers.ofString()
                    );

                    System.out.println(response.statusCode());
                    System.out.println(response.body());
                }
            }
        - lang: PHP
          source: >-
            <?php

            $payload = '{"front": "<base64 image (JPG or PNG)>"}';


            $ch =
            curl_init('https://api.origoid.com/mex/id/v1/voter-id-extractions');

            curl_setopt_array($ch, [
                CURLOPT_POST => true,
                CURLOPT_POSTFIELDS => $payload,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTPHEADER => [
                    'x-api-key: ' . getenv('ORIGOID_API_KEY'),
                    'content-type: application/json',
                ],
            ]);


            $response = curl_exec($ch);

            $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

            curl_close($ch);


            if ($status >= 400) {
                throw new Exception("HTTP $status");
            }


            $result = json_decode($response, true);

            print_r($result);
        - lang: Go
          source: "package main\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"time\"\n)\n\nfunc main() {\n\tpayload := []byte(`{\"front\": \"<base64 image (JPG or PNG)>\"}`)\n\treq, err := http.NewRequest(\"POST\", \"https://api.origoid.com/mex/id/v1/voter-id-extractions\", bytes.NewBuffer(payload))\n\tif err != nil { log.Fatal(err) }\n\treq.Header.Set(\"x-api-key\", os.Getenv(\"ORIGOID_API_KEY\"))\n\treq.Header.Set(\"content-type\", \"application/json\")\n\n\tclient := &http.Client{Timeout: 30 * time.Second}\n\tresp, err := client.Do(req)\n\tif err != nil { log.Fatal(err) }\n\tdefer resp.Body.Close()\n\n\tvar result map[string]any\n\tif err := json.NewDecoder(resp.Body).Decode(&result); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println(result)\n}"
        - lang: C#
          source: |-
            using System;
            using System.Net.Http;
            using System.Text;
            using System.Threading.Tasks;

            class Program
            {
                static async Task Main()
                {
                    using var client = new HttpClient { Timeout = TimeSpan.FromSeconds(30) };
                    client.DefaultRequestHeaders.Add("x-api-key",
                        Environment.GetEnvironmentVariable("ORIGOID_API_KEY"));

                    var payload = "{\"front\": \"<base64 image (JPG or PNG)>\"}";
                    var content = new StringContent(payload, Encoding.UTF8, "application/json");

                    var response = await client.PostAsync("https://api.origoid.com/mex/id/v1/voter-id-extractions", content);
                    response.EnsureSuccessStatusCode();

                    var body = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(body);
                }
            }
components:
  schemas:
    Envelope:
      type: object
      required:
        - status
        - type
        - message
        - transactionId
        - processedAt
        - billable
      properties:
        status:
          type: string
          enum:
            - OK
            - ERROR
          description: >-
            High-level outcome. `OK` means the request was successfully
            processed (regardless of business result). `ERROR` means the request
            was rejected or could not be processed.
        type:
          type: string
          description: >-
            Stable result type code. Includes generic codes (`SUCCESS`,
            `INVALID_REQUEST`, `UNAUTHORIZED`, `SERVICE_UNAVAILABLE`,
            `INTERNAL_ERROR`, `RATE_LIMIT_EXCEEDED`) plus endpoint-specific
            result codes — see this endpoint's response examples.
        message:
          type: string
          description: >-
            Human-readable summary of the result. Always in English (per
            Language Conventions in the API overview).
        data:
          type: object
          nullable: true
          description: >-
            Response payload. `null` on error responses. Shape depends on the
            endpoint — see each operation's response schema.
        errors:
          type: array
          description: >-
            Per-field error details. Present only on `INVALID_REQUEST`
            responses.
          items:
            $ref: '#/components/schemas/ErrorDetail'
        transactionId:
          type: string
          format: uuid
          description: >-
            Unique identifier of this request, generated by the API Gateway.
            Propagated end-to-end for traceability.
        processedAt:
          type: string
          format: date-time
          description: >-
            ISO 8601 datetime with Mexico City offset (`-06:00`). Always set by
            the API Gateway when the response leaves the system.
        billable:
          type: boolean
          description: >-
            Whether this request will be charged against the client's plan.
            Typically `true` for successful business results and `false` for
            validation errors or system errors that prevented processing.
    ErrorDetail:
      type: object
      required:
        - field
        - code
        - message
      properties:
        field:
          type: string
          description: >-
            JSON path or field name where the validation failed. For body-level
            errors (malformed JSON, payload exceeds size limit, oneOf with all
            alternatives present) use `body`. For field-specific errors use the
            dotted path (e.g. `rfc`, `personalInfo.curp`, `front`).
        code:
          type: string
          description: >-
            Machine-readable error code. Standard catalog (non-exhaustive):
            `MISSING_REQUIRED_FIELD`, `INVALID_TYPE`, `INVALID_FORMAT`,
            `INVALID_ENUM_VALUE`, `INVALID_LENGTH`, `OUT_OF_RANGE`,
            `INVALID_ARRAY`, `UNKNOWN_FIELD`, `SCHEMA_MISMATCH`,
            `MISSING_DEPENDENT_FIELD`, `MALFORMED_JSON`, `PAYLOAD_TOO_LARGE`,
            `INVALID_SCOPE`, `INVALID_VALUE`. Some operations also emit
            endpoint-specific codes documented in each operation's spec (e.g.
            `INVALID_RFC_FORMAT`, `NAME_TOO_SHORT`, `QR_NOT_FOUND`).
        message:
          type: string
          description: Human-readable description of the field-level error.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
    BasicAuth:
      type: http
      scheme: basic

````