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.
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étodo | Content-Type | Uso recomendado |
|---|---|---|
| Recomendado Multipart | multipart/form-data | curl, Postman, formularios HTML |
| Base64 JSON | application/json | JavaScript, apps moviles |
| URL Fetch | application/json | Imágenes hospedadas en la nube |
| Binario | image/jpeg, image/png, image/webp | CLI tools, streaming |
Endpoints
/api/v1/extractExtrae datos de una imagen de credencial INE/IFE.
RecomendadoMultipart Form-Data
Envía archivos directamente. Ideal para curl y Postman.
| Campo | Tipo | Descripción |
|---|---|---|
image_front | file | Imagen frontal (requerido) |
image_back | file | Imagen 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.
| Campo | Tipo | Descripción |
|---|---|---|
image_front | string | Base64 de imagen frontal (requerido) |
image_back | string | Base64 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.
| Campo | Tipo | Descripción |
|---|---|---|
image_front_url | string | URL HTTPS de imagen frontal (requerido) |
image_back_url | string | URL 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.
/api/v1/balanceObtiene 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.
/api/v1/capture-linkscurl -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
}'destinationIdydocumentType(ine|passport) son requeridos.reference(hasta 80 caracteres) viaja en la entrega.requireBackpide 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
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
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ódigos de error
| Código | HTTP | Descripción |
|---|---|---|
MISSING_API_KEY | 401 | No se proporcionó API key |
INVALID_API_KEY | 401 | API key inválida o revocada |
MISSING_IMAGE | 400 | No se proporcionó imagen frontal |
INVALID_IMAGE_FORMAT | 400 | Formato no soportado (use JPEG, PNG o WebP) |
IMAGE_TOO_LARGE | 400 | Imagen excede 10 MB |
INVALID_BASE64 | 400 | Error al decodificar base64 |
INVALID_MULTIPART | 400 | Error al procesar formulario multipart |
URL_FETCH_FAILED | 400 | No se pudo obtener imagen de la URL |
URL_INVALID | 400 | URL inválida (debe ser HTTPS) |
URL_BLOCKED | 400 | URL bloqueada por seguridad |
URL_TIMEOUT | 400 | Timeout al obtener imagen (10s) |
UNSUPPORTED_CONTENT_TYPE | 415 | Content-Type no soportado |
INSUFFICIENT_TOKENS | 402 | Saldo insuficiente de tokens |
RATE_LIMITED | 429 | Demasiadas solicitudes fallidas o en proceso por minuto; las extracciones exitosas no cuentan (ver header Retry-After) |
TOO_MANY_FAILED_EXTRACTIONS | 429 | Demasiadas extracciones fallidas consecutivas; revisa la calidad de las imágenes |
EXTRACTION_FAILED | 500 | Error en la extracción (token reembolsado) |
INTERNAL_ERROR | 500 | Error interno del servidor |
Campos extraídos
La API extrae los siguientes campos de la credencial INE/IFE:
nombreNombre(s)
apellidoPaternoApellido paterno
apellidoMaternoApellido materno
curpCURP (18 caracteres)
claveElectorClave de elector
fechaNacimientoFecha de nacimiento
sexoSexo
domicilioDomicilio completo
calleCalle
coloniaColonia
codigoPostalCódigo postal
municipioMunicipio/Alcaldía
estadoEstado
seccionSección electoral
anioRegistroAño de registro
vigenciaVigencia
numeroVerticalNúmero vertical
ocrCódigo OCR
cicCódigo CIC
emisionNú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