Flujo: documento OCR
Resumen
POST /documents → polling GET /documents/{id} → GET /documents/{id}/result
El procesamiento es asíncrono. Tras el POST recibes 202 con status: queued.
1. Crear documento
POST https://ocr.789.com.mx/v1/documents — scope documents:create
Content-Type: multipart/form-data
| Campo | Requerido | Descripción |
|---|---|---|
file |
Sí | Archivo a procesar (ver tipos y límites abajo). |
profile |
Sí | Perfil de procesamiento (ver tabla abajo). |
output_formats[] |
Sí | Uno o más de markdown, json, text. |
languages[] |
No | Idiomas del documento: es, en. |
external_reference |
No | Tu referencia interna (máx. 191 caracteres). Sirve para filtrar el listado. |
priority |
No | normal (por defecto) o high. |
Tipos de archivo aceptados: PDF, JPEG, PNG, HEIC/HEIF, TXT y XML. La extensión debe coincidir con el contenido real (415 unsupported_media_type si no).
Límites en los perfiles actuales: 50 MB (413 file_too_large) y 100 páginas (422 validation_error). Tu API Key o ambiente pueden tener un límite menor; aplica el más bajo.
Headers:
X-API-Key: tu_api_key
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
Respuesta (202):
{
"data": {
"id": "doc_01J...",
"status": "queued",
"profile": "cfdi_invoice",
"output_formats": ["markdown", "json"],
"external_reference": "pedido-1024",
"created_at": "2026-06-24T18:00:00+00:00"
},
"meta": { "request_id": "req_01J..." }
}
Si repites el POST con la misma Idempotency-Key y el mismo payload recibes 200 con el mismo documento y meta.idempotent_replay: true.
2. Consultar estado
GET https://ocr.789.com.mx/v1/documents/{document_id} — scope documents:read
Repite hasta que status sea terminal:
| Estado | Significado |
|---|---|
queued |
Aceptado, pendiente de procesar. Un corte de red temporal con el motor OCR también lo regresa aquí para reintentar. |
submitting_to_docling |
Enviando a OCR |
processing |
OCR en curso |
completed |
OCR listo |
partial_success |
OCR parcial disponible (revisa warnings) |
failed |
Error definitivo; revisa failure.code |
cancelled |
Cancelado antes de OCR |
expired |
Pasó el periodo de retención (30 días desde la creación en los perfiles actuales); el resultado ya no se puede descargar |
purged |
Archivos eliminados, 7 días después de expirar |
No necesitas vigilar el documento indefinidamente: si se atasca, la plataforma lo pasa a failed sola (ver códigos abajo).
Respuesta (200):
{
"data": {
"id": "doc_01J...",
"status": "completed",
"profile": "cfdi_invoice",
"original_filename": "factura.pdf",
"detected_mime_type": "application/pdf",
"size_bytes": 184320,
"page_count": 2,
"external_reference": "pedido-1024",
"created_at": "2026-06-24T18:00:00+00:00",
"requested_outputs": ["markdown", "json"],
"available_outputs": ["markdown", "json"],
"failure": null,
"warnings": [],
"started_at": "2026-06-24T18:00:02+00:00",
"completed_at": "2026-06-24T18:00:41+00:00",
"expires_at": "2026-07-24T18:00:00+00:00"
},
"meta": { "request_id": "req_01J..." }
}
Cuando status es failed, failure trae { "code": "...", "message": "..." }:
failure.code |
Causa |
|---|---|
document_queue_timeout |
El documento estuvo en cola más de 15 minutos. |
docling_submit_timeout |
El envío al motor OCR no terminó en 10 minutos. |
docling_processing_timeout |
El OCR superó el tiempo máximo del perfil. |
docling_polling_stalled |
El OCR dejó de reportar avance. |
docling_submit_failed, docling_network_error, docling_http_error, docling_client_error |
El motor OCR no aceptó el documento o no respondió tras los reintentos. |
docling_processing_failed, docling_no_outputs, docling_invalid_response |
El motor OCR no pudo procesar el archivo o no generó resultados. |
Ante un failed puedes subir el documento de nuevo con una Idempotency-Key nueva. Si se repite con el mismo archivo, reporta el meta.request_id al equipo de plataforma.
Listar documentos
GET https://ocr.789.com.mx/v1/documents — scope documents:read
Filtros opcionales (query): status, profile, external_reference, created_from, created_to (fechas), page y per_page (por defecto 25, máx. 100). Solo lista los documentos creados con tu API Key, del más reciente al más antiguo. La paginación viene en meta.pagination (page, per_page, total, last_page).
3. Obtener resultado OCR
GET https://ocr.789.com.mx/v1/documents/{document_id}/result — scope results:read
Disponible cuando el documento está en completed o partial_success.
| Query param | Requerido | Descripción |
|---|---|---|
format |
Sí | markdown, json o text; debe ser uno de los output_formats que pediste al crear. |
download |
No | false (por defecto): contenido inline. true: URL firmada de descarga. |
Inline (download=false):
{
"data": {
"document_id": "doc_01J...",
"format": "markdown",
"content": "# Factura ...",
"generated_at": "2026-06-24T18:00:41+00:00"
},
"meta": { "request_id": "req_01J..." }
}
Descarga (download=true): data trae document_id, format, download_url y expires_at (la URL vale 10 minutos).
| HTTP | Código | Causa |
|---|---|---|
| 409 | result_not_ready |
El documento sigue en queued, submitting_to_docling o processing. |
| 404 | result_not_available |
Documento failed, cancelled, expired o purged, o format que no pediste al crear. |
| 413 | result_not_available |
El resultado supera 512 KB inline; pídelo con download=true. |
4. Cancelar (opcional)
POST https://ocr.789.com.mx/v1/documents/{document_id}/cancel — scope documents:create
Solo funciona mientras el documento sigue en queued. Responde 200 con { "id", "status": "cancelled", "cancelled_at" }. Si ya se envió a OCR recibes 409 document_cannot_be_cancelled. No requiere Idempotency-Key.
Perfiles disponibles (México)
code (API) |
Nombre | Cola | Uso |
|---|---|---|---|
ine_document |
Credencial INE / IFE | ocr-high |
Identificación oficial. Nombre, CURP, Clave de Elector, OCR/CIC. |
csf_document |
Constancia de Situación Fiscal | ocr-high |
CP, Régimen, RFC y Nombre (Facturación 4.0 SAT). |
cfdi_invoice |
Factura Electrónica (CFDI) | ocr-default |
PDF factura: UUID, RFCs, montos, uso CFDI. |
curp_document |
Formato CURP | ocr-default |
Identidad personas físicas (SEGOB). |
proof_of_address |
Comprobante de Domicilio | ocr-default |
CFE, Telmex, agua — validación de dirección. |
bank_statement |
Estado de Cuenta Bancario | ocr-default |
CLABE (18 dígitos) e ingresos. |
passport |
Pasaporte Mexicano | ocr-high |
Segunda identificación oficial. |
birth_certificate |
Acta de Nacimiento | ocr-default |
Trámites civiles, formato con QR. |
contract |
Contrato Legal | ocr-default |
Inmobiliarios, créditos, laborales. |
general_document |
Documento General | ocr-default |
Fallback para documentos no clasificados. |
Usa general_document solo si ningún perfil específico aplica.
Siguiente paso
Flujo: extracción — extraer campos estructurados del OCR.