Documentación de la API
Introducción
La API de Extraer Datos de Pasaporte te permite extraer datos de pasaportes de cualquier país de manera programática. Utiliza inteligencia artificial para procesar las imágenes, extraer todos los campos de la página principal y validar la zona MRZ con los dígitos de control del estándar ICAO 9303.
URL Base: https://extraerdatosdepasaporte.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://extraerdatosdepasaporte.com/api/v1/balance \ -H "X-API-Key: pas_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 la página principal del pasaporte.
RecomendadoMultipart Form-Data
Envía archivos directamente. Ideal para curl y Postman.
| Campo | Tipo | Descripción |
|---|---|---|
image_front | file | Página principal del pasaporte (requerido) |
image_back | file | Página adicional (opcional) |
curl -X POST https://extraerdatosdepasaporte.com/api/v1/extract \ -H "X-API-Key: pas_tu_api_key" \ -F "image_front=@./pasaporte.jpg" \ -F "image_back=@./pasaporte_extra.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 < ./pasaporte.jpg | tr -d '\n')
printf '{"image_front": "%s"}' "$IMAGE_FRONT" | curl -X POST https://extraerdatosdepasaporte.com/api/v1/extract \
-H "X-API-Key: pas_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://extraerdatosdepasaporte.com/api/v1/extract \
-H "X-API-Key: pas_tu_api_key" \
-H "Content-Type: application/json" \
-d '{
"image_front_url": "https://storage.example.com/pasaporte.jpg",
"image_back_url": "https://storage.example.com/pasaporte_extra.jpg"
}'Upload Binario
Envía la imagen como body binario. Solo soporta una imagen por petición.
curl -X POST https://extraerdatosdepasaporte.com/api/v1/extract \ -H "X-API-Key: pas_tu_api_key" \ -H "Content-Type: image/jpeg" \ --data-binary @./pasaporte.jpg
Respuesta exitosa
{
"success": true,
"extraction_id": "clx1234567890",
"data": {
"passportNumber": "G12345678",
"surname": "GOMEZ VELAZQUEZ",
"givenNames": "MARGARITA",
"nationality": "MEXICANA",
"dateOfBirth": "05/07/1980",
"sex": "F",
"placeOfBirth": "COAHUILA",
"dateOfIssue": "05/07/2023",
"dateOfExpiry": "05/07/2033",
"issuingCountry": "MEX",
"issuingAuthority": "SRE",
"personalNumber": "GOVM800705MCLRLR01",
"mrzLine1": "P<MEXGOMEZ<VELAZQUEZ<<MARGARITA<<<<<<<<<<<<<",
"mrzLine2": "G123456786MEX8007050F3307054<<<<<<<<<<<<<<08"
},
"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://extraerdatosdepasaporte.com/api/v1/extract \ -H "X-API-Key: pas_tu_api_key" \ -H "X-Destination-Id: <id de tu destino>" \ -F "image_front=@./pasaporte.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://extraerdatosdepasaporte.com/api/v1/balance \ -H "X-API-Key: pas_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://extraerdatosdepasaporte.com/api/v1/capture-links \
-H "X-API-Key: pas_tu_api_key" \
-H "Content-Type: application/json" \
-d '{
"destinationId": "<id de tu destino>",
"documentType": "passport",
"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://extraerdatosdepasaporte.com/c/…",
"reference": "reserva-8841",
"documentType": "passport",
"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": "passport",
"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)
}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 página principal del pasaporte:
passportNumberNúmero de pasaporte
surnameApellidos
givenNamesNombres
nationalityNacionalidad
dateOfBirthFecha de nacimiento
sexSexo
placeOfBirthLugar de nacimiento
dateOfIssueFecha de expedición
dateOfExpiryFecha de vencimiento
issuingCountryPaís emisor (código ICAO)
issuingAuthorityAutoridad emisora
personalNumberNúmero personal (CURP en México)
mrzLine1Línea 1 de la zona MRZ
mrzLine2Línea 2 de la zona MRZ
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