Documentación de la API

Introducción

La API de Extraer Datos de INE te permite extraer datos de credenciales de elector mexicanas (INE/IFE) de manera programática. Utiliza inteligencia artificial para procesar las imágenes y extraer todos los campos visibles de la credencial.

URL Base: https://extraerdatosdeine.com/api/v1

Para agentes de IA: /llms.txt es el índice del servicio y /llms-full.txt contiene endpoints, campos, precios y preguntas frecuentes en un solo archivo de texto.

Obtén tu API key

Crea tu cuenta aquí mismo, sin salir de esta página, y genera tu API key en menos de un minuto.

20 tokens gratis al crear tu cuenta: suficientes para probar la API con tus propios documentos antes de comprar el primer paquete.

¿Ya tienes cuenta? Ve a tus API keys.

O continúa con

Autenticación

Todas las peticiones a la API requieren autenticación mediante una API key. Incluye tu API key en el header X-API-Key de cada petición.

curl https://extraerdatosdeine.com/api/v1/balance \
  -H "X-API-Key: ine_tu_api_key"

Puedes generar y administrar tus API keys desde el dashboard.

Métodos de Upload

La API soporta múltiples métodos para enviar imágenes. El método se detecta automáticamente del header Content-Type.

MétodoContent-TypeUso recomendado
Recomendado
Multipart
multipart/form-datacurl, Postman, formularios HTML
Base64 JSONapplication/jsonJavaScript, apps moviles
URL Fetchapplication/jsonImágenes hospedadas en la nube
Binarioimage/jpeg, image/png, image/webpCLI tools, streaming

Endpoints

POST/api/v1/extract

Extrae datos de una imagen de credencial INE/IFE.

RecomendadoMultipart Form-Data

Envía archivos directamente. Ideal para curl y Postman.

CampoTipoDescripción
image_frontfileImagen frontal (requerido)
image_backfileImagen trasera (opcional)
curl -X POST https://extraerdatosdeine.com/api/v1/extract \
  -H "X-API-Key: ine_tu_api_key" \
  -F "image_front=@./ine_frente.jpg" \
  -F "image_back=@./ine_reverso.jpg"

Base64 JSON

Envía imágenes codificadas en base64. El prefijo data URL es opcional.

CampoTipoDescripción
image_frontstringBase64 de imagen frontal (requerido)
image_backstringBase64 de imagen trasera (opcional)
IMAGE_FRONT=$(base64 < ./ine_frente.jpg | tr -d '\n')

printf '{"image_front": "%s"}' "$IMAGE_FRONT" | curl -X POST https://extraerdatosdeine.com/api/v1/extract \
  -H "X-API-Key: ine_tu_api_key" \
  -H "Content-Type: application/json" \
  --data-binary @-

URL Fetch

Envía URLs de imágenes hospedadas. Solo se permiten URLs HTTPS.

CampoTipoDescripción
image_front_urlstringURL HTTPS de imagen frontal (requerido)
image_back_urlstringURL HTTPS de imagen trasera (opcional)
curl -X POST https://extraerdatosdeine.com/api/v1/extract \
  -H "X-API-Key: ine_tu_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "image_front_url": "https://storage.example.com/ine_frente.jpg",
    "image_back_url": "https://storage.example.com/ine_reverso.jpg"
  }'

Upload Binario

Envía la imagen como body binario. Solo soporta una imagen por petición.

curl -X POST https://extraerdatosdeine.com/api/v1/extract \
  -H "X-API-Key: ine_tu_api_key" \
  -H "Content-Type: image/jpeg" \
  --data-binary @./ine_frente.jpg

Respuesta exitosa

{
  "success": true,
  "extraction_id": "clx1234567890",
  "data": {
    "nombre": "JUAN",
    "apellidoPaterno": "PEREZ",
    "apellidoMaterno": "GARCIA",
    "curp": "PEGJ850101HDFRRL09",
    "claveElector": "PRGRJN85010109H100",
    "fechaNacimiento": "01/01/1985",
    "sexo": "H",
    "domicilio": "CALLE EJEMPLO 123",
    "colonia": "CENTRO",
    "codigoPostal": "06000",
    "municipio": "CUAUHTEMOC",
    "estado": "CIUDAD DE MEXICO",
    "seccion": "1234",
    "vigencia": "2029",
    "numeroVertical": "1234567890123",
    "ocr": "1234567890123",
    "cic": "123456789",
    "emision": "01"
  },
  "tokens_remaining": 19,
  "upload_method": "multipart"
}

Enviar a un destino (opcional)

Agrega el encabezado X-Destination-Id para que los datos se entreguen a uno de tus destinos antes de responderte. Es opcional y por petición: si no lo mandas, la respuesta es exactamente la misma de siempre, aunque tengas un destino predeterminado configurado.

curl -X POST https://extraerdatosdeine.com/api/v1/extract \
  -H "X-API-Key: ine_tu_api_key" \
  -H "X-Destination-Id: <id de tu destino>" \
  -F "image_front=@./ine_frente.jpg"

La respuesta incluye el resultado del envío. Se intenta una sola vez, sin reintentos ni cola: si falló, los datos siguen en tu respuesta y te toca a ti decidir qué hacer.

{
  "success": true,
  "extraction_id": "...",
  "data": { ... },
  "delivery": {
    "destination_id": "...",
    "succeeded": true,
    "http_status": 200,
    "latency_ms": 312,
    "error_code": null
  }
}

Si el destino no existe, no es tuyo o está pausado, la petición se rechaza con 400 DESTINATION_NOT_FOUND antes de gastar un token.

GET/api/v1/balance

Obtiene el saldo actual de tokens de tu cuenta.

Ejemplo

curl https://extraerdatosdeine.com/api/v1/balance \
  -H "X-API-Key: ine_tu_api_key"

Respuesta

{
  "success": true,
  "balance": 20
}

Enlaces de captura y webhooks

Mándale a tu cliente un enlace de un solo uso: toma la foto de su documento desde su celular y los datos llegan a tu destino (webhook, correo o Telegram), sin que la imagen pase por tu sistema. Disponible para todas las cuentas (beta). Los destinos se configuran en el panel, en Destinos.

POST/api/v1/capture-links
curl -X POST https://extraerdatosdeine.com/api/v1/capture-links \
  -H "X-API-Key: ine_tu_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "destinationId": "<id de tu destino>",
    "documentType": "ine",
    "reference": "reserva-8841",
    "requireBack": true
  }'
  • destinationId y documentType (ine | passport) son requeridos. reference (hasta 80 caracteres) viaja en la entrega. requireBack pide también el reverso. requesterName (hasta 60) es el nombre de negocio que verá tu cliente.
  • Un solo uso: 15 minutos para abrirlo y, ya abierto, 15 minutos para capturar.
  • La url solo se devuelve en esta respuesta; trátala como una credencial y no la guardes en logs.
  • Crear el enlace no cuesta. La captura consume 1 token, que se reembolsa si la extracción o la entrega fallan.
  • Hasta 20 enlaces vivos a la vez (400 TOO_MANY_LIVE_LINKS). Un destino inexistente o pausado: 400 DESTINATION_NOT_FOUND.

Respuesta (201)

{
  "success": true,
  "id": "clx_enlace_456",
  "url": "https://extraerdatosdeine.com/c/…",
  "reference": "reserva-8841",
  "documentType": "ine",
  "requireBack": true,
  "askGuestPersona": false,
  "expiresAt": "2026-09-30T18:15:00.000Z"
}

Webhooks: lo que recibe tu servidor

Cada entrega a un destino de tipo webhook, ya sea de un enlace de captura, de /api/v1/extract con X-Destination-Id o del panel, es un POST firmado. Se intenta una sola vez, sin seguir redirecciones y con 10 segundos de espera; responde 2xx.

POST /tu-webhook
Content-Type: application/json
X-Signature: sha256=5f2b…
X-Signature-Timestamp: 1790000000
X-Idempotency-Key: clx1234567890

{
  "version": "1",
  "event": "extraction.completed",
  "idempotencyKey": "clx1234567890",
  "documentType": "ine",
  "source": "capture-link",
  "captureLinkId": "clx_enlace_456",
  "reference": "reserva-8841",
  "extractedAt": "2026-09-30T18:05:02.000Z",
  "data": { "curp": "…", "nombre": "…" }
}

source es api, web o capture-link. image (front/back en base64) solo llega si el destino tiene activado incluir la imagen. Usa X-Idempotency-Key para descartar duplicados.

Firma: X-Signature es sha256= más el HMAC-SHA256 en hexadecimal, con el secreto del destino (whsec_…), de X-Signature-Timestamp + "." + el cuerpo crudo. Verifica sobre los bytes recibidos (no sobre el JSON re-serializado), compara en tiempo constante y rechaza timestamps de más de 5 minutos. Los SDKs oficiales lo hacen por ti.

import { createHmac, timingSafeEqual } from 'node:crypto'

function verify(secret, rawBody, signature, timestamp) {
  if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false
  const expected = 'sha256=' + createHmac('sha256', secret)
    .update(`${timestamp}.${rawBody}`)
    .digest('hex')
  const a = Buffer.from(expected)
  const b = Buffer.from(signature ?? '')
  return a.length === b.length && timingSafeEqual(a, b)
}

Ejemplos de Integración

SDKs oficiales

Intégralo en minutos: tipos para los 20 campos, enlaces de captura, firma de webhooks y cero dependencias.

JavaScript / TypeScript

Versión en npm de extraer-datos-ineDescargas mensuales en npmEstrellas del repositorio en GitHub
npm install extraer-datos-ine
import { readFile } from 'node:fs/promises'
import { IneExtractorClient } from 'extraer-datos-ine'

const client = new IneExtractorClient({ apiKey: 'ine_tu_api_key' })

const front = await readFile('./ine_frente.jpg')
const back = await readFile('./ine_reverso.jpg') // opcional

const { data, tokensRemaining } = await client.extract({ front, back })
console.log(data.curp, data.claveElector)

// Enlace de captura: tu cliente toma la foto y los datos llegan a tu destino
const { url } = await client.createCaptureLink({ destinationId: 'dst_...', reference: 'reserva-8841' })

// Webhook: verifica la firma con el cuerpo crudo
import { parseWebhook } from 'extraer-datos-ine'
const event = await parseWebhook({ secret, rawBody, signature, timestamp })

Código fuente y documentación completa en GitHub · npm.

Python

Versión en PyPI de extraer-datos-ineVersiones de Python soportadasEstrellas del repositorio en GitHub
pip install extraer-datos-ine
from extraer_datos_ine import IneExtractorClient

client = IneExtractorClient(api_key="ine_tu_api_key")

with open("ine_frente.jpg", "rb") as f:
    front = f.read()

result = client.extract(front=front)
print(result.data["curp"], result.data["claveElector"])

# Enlace de captura: los datos llegan a tu destino
link = client.create_capture_link("dst_...", reference="reserva-8841")
print(link.url)

Código fuente y documentación completa en GitHub · PyPI.

Servidor MCP (Claude, Cursor)

Extrae INEs, consulta tu saldo y crea enlaces de captura desde tu asistente de IA. Los datos extraídos quedan en la conversación con tu proveedor de IA; si eso no es aceptable, usa enlaces de captura con un destino.

{
  "mcpServers": {
    "extraer-datos-ine": {
      "command": "npx",
      "args": ["-y", "extraer-datos-ine-mcp"],
      "env": { "EXTRAER_DATOS_INE_API_KEY": "ine_tu_api_key" }
    }
  }
}

Código fuente en GitHub · npm.

Códigos de error

CódigoHTTPDescripción
MISSING_API_KEY401No se proporcionó API key
INVALID_API_KEY401API key inválida o revocada
MISSING_IMAGE400No se proporcionó imagen frontal
INVALID_IMAGE_FORMAT400Formato no soportado (use JPEG, PNG o WebP)
IMAGE_TOO_LARGE400Imagen excede 10 MB
INVALID_BASE64400Error al decodificar base64
INVALID_MULTIPART400Error al procesar formulario multipart
URL_FETCH_FAILED400No se pudo obtener imagen de la URL
URL_INVALID400URL inválida (debe ser HTTPS)
URL_BLOCKED400URL bloqueada por seguridad
URL_TIMEOUT400Timeout al obtener imagen (10s)
UNSUPPORTED_CONTENT_TYPE415Content-Type no soportado
INSUFFICIENT_TOKENS402Saldo insuficiente de tokens
RATE_LIMITED429Demasiadas solicitudes fallidas o en proceso por minuto; las extracciones exitosas no cuentan (ver header Retry-After)
TOO_MANY_FAILED_EXTRACTIONS429Demasiadas extracciones fallidas consecutivas; revisa la calidad de las imágenes
EXTRACTION_FAILED500Error en la extracción (token reembolsado)
INTERNAL_ERROR500Error interno del servidor

Campos extraídos

La API extrae los siguientes campos de la credencial INE/IFE:

nombre

Nombre(s)

apellidoPaterno

Apellido paterno

apellidoMaterno

Apellido materno

curp

CURP (18 caracteres)

claveElector

Clave de elector

fechaNacimiento

Fecha de nacimiento

sexo

Sexo

domicilio

Domicilio completo

calle

Calle

colonia

Colonia

codigoPostal

Código postal

municipio

Municipio/Alcaldía

estado

Estado

seccion

Sección electoral

anioRegistro

Año de registro

vigencia

Vigencia

numeroVertical

Número vertical

ocr

Código OCR

cic

Código CIC

emision

Número de emisión

Límites y cuotas

  • Cada extracción consume 1 token
  • Tamaño máximo de imagen: 10MB
  • Formatos soportados: JPEG, PNG, WebP
  • Timeout para URL fetch: 10 segundos
  • Si una extracción falla por un error del sistema, el token se reembolsa automáticamente
  • Los tokens no expiran