Flujo: extracción
La extracción toma el output OCR de un documento y devuelve JSON validado según tu schema.
¿Primera vez escribiendo instrucciones y schemas? Lee la Guía de prompts y schemas: reglas, plantillas por tipo de documento y solución de errores.
Resumen
POST /extractions → polling GET /extractions/{id} → GET /extractions/{id}/result
Cada extracción referencia un solo document_id.
Modos de integración
Modo A — Secuencial (recomendado para empezar)
- Subir documento.
- Esperar
status: completed. - Crear extracción.
- Leer resultado.
Modo B — Paralelo (optimizado)
- Subir documento.
- Crear extracción de inmediato.
- La extracción queda en
waiting_for_documenthasta que el OCR termine. - Se encola automáticamente y procesa sin un segundo
POST. - Si el OCR falla o no genera el formato que pediste, la extracción pasa a
failedconextraction_input_unavailable.
1. Crear extracción
POST https://ocr.789.com.mx/v1/extractions — scope extractions:create
Content-Type: application/json
{
"document_id": "doc_01J...",
"custom_instruction": "Factura mexicana. Fechas en formato YYYY-MM-DD. Montos como número decimal sin símbolo de moneda.",
"response_schema": {
"type": "object",
"additionalProperties": false,
"required": ["supplier_name", "invoice_number", "invoice_date", "total"],
"properties": {
"supplier_name": { "type": ["string", "null"], "description": "Nombre o razón social del emisor." },
"invoice_number": { "type": ["string", "null"] },
"invoice_date": { "type": ["string", "null"], "description": "Formato YYYY-MM-DD." },
"total": { "type": ["number", "null"], "description": "Total a pagar con impuestos." }
}
},
"input_result_type": "markdown"
}
| Campo | Requerido | Descripción |
|---|---|---|
document_id |
Sí | Documento creado con la misma API Key; con otra key (aunque sea del mismo proyecto) recibes 404 document_not_found. |
custom_instruction |
Sí | Qué extraer y cómo interpretarlo (1–8000 caracteres). |
response_schema |
Sí | JSON Schema con raíz "type": "object". Keywords soportadas: type, properties, required, items, enum, additionalProperties, description. |
input_result_type |
No | markdown, text o json. Si se omite y el OCR ya terminó, se usa el primero que el documento generó en ese orden; si el OCR sigue en curso, el primero de ese orden que pediste en output_formats (o markdown). |
Headers:
X-API-Key: tu_api_key
Idempotency-Key: 660e8400-e29b-41d4-a716-446655440001
Content-Type: application/json
Idempotency-Key es obligatorio (16–191 caracteres).
Respuesta (202):
{
"data": {
"id": "ext_01J...",
"document_id": "doc_01J...",
"status": "queued",
"input_result_type": "markdown",
"created_at": "2026-06-24T18:01:00+00:00"
},
"meta": { "request_id": "req_01J..." }
}
status es waiting_for_document si el OCR del documento sigue en curso (modo B). Si repites el POST con la misma Idempotency-Key y el mismo payload recibes 200 con la misma extracción y meta.idempotent_replay: true.
Si el schema es inválido recibes 422 validation_error con los problemas en error.details.response_schema.
2. Consultar estado
GET https://ocr.789.com.mx/v1/extractions/{extraction_id} — scope extractions:read
| Estado | Significado |
|---|---|
waiting_for_document |
Esperando que el OCR termine |
queued |
Lista para LLM |
processing |
Llamando al proveedor y validando |
completed |
JSON validado disponible |
validation_failed |
JSON no cumple el schema; revisa failure.validation_errors |
failed |
Error de procesamiento; revisa failure.code |
cancelled |
Reservado; hoy no hay endpoint para cancelar extracciones |
Respuesta (200):
{
"data": {
"id": "ext_01J...",
"document_id": "doc_01J...",
"status": "validation_failed",
"input_result_type": "markdown",
"created_at": "2026-06-24T18:01:00+00:00",
"failure": {
"code": "schema_validation_failed",
"message": "The extraction response could not be validated against the requested schema.",
"validation_errors": ["$.total: is required."]
},
"started_at": "2026-06-24T18:01:02+00:00",
"completed_at": "2026-06-24T18:01:20+00:00"
},
"meta": { "request_id": "req_01J..." }
}
failure es null salvo en failed y validation_failed. validation_errors solo aparece con schema_validation_failed.
failure.code |
Estado | Causa | Qué hacer |
|---|---|---|---|
schema_validation_failed |
validation_failed |
El JSON del modelo no cumplió el schema en ningún intento. | Ajusta instrucción o schema según validation_errors. |
extraction_provider_failed |
failed |
El proveedor LLM falló en todos los intentos. | Reintenta con una Idempotency-Key nueva. |
extraction_provider_unavailable |
failed |
Tu proyecto no tiene proveedor LLM configurado. | Pide al equipo de plataforma que lo configure. |
extraction_input_unavailable |
failed |
El documento no tiene el formato OCR pedido, el contenido supera 256 KB, o el OCR falló (modo B). | Usa otro input_result_type (text suele ser el más compacto). |
document_not_extractable |
failed |
El documento dejó de ser extraíble (expiró, por ejemplo) antes de procesar. | Sube el documento de nuevo. |
extraction_queue_timeout |
failed |
La extracción estuvo en cola demasiado tiempo. | Reintenta; si se repite, reporta el request_id. |
extraction_processing_timeout |
failed |
El procesamiento superó el tiempo máximo. | Reintenta; si se repite, reporta el request_id. |
extraction_unexpected_error |
failed |
Error interno inesperado. | Reintenta; si se repite, reporta el request_id. |
3. Obtener resultado
GET https://ocr.789.com.mx/v1/extractions/{extraction_id}/result — scope extractions:read
Solo cuando status es completed; en cualquier otro estado recibes 409 result_not_ready. El JSON extraído está en data.result:
{
"data": {
"extraction_id": "ext_01J...",
"document_id": "doc_01J...",
"result": {
"supplier_name": "ACME SA DE CV",
"invoice_number": "A-1024",
"invoice_date": "2026-06-24",
"total": 11600.0
},
"completed_at": "2026-06-24T18:01:09+00:00"
}
}
Reglas importantes
- El documento debe haberse creado con la misma API Key.
- Documentos en
failed,cancelled,expiredopurgedno son extraíbles (409 document_not_extractable). Tampoco un documento terminado que no generó elinput_result_typepedido ni ningún otro formato utilizable. - Documentos en
queued,submitting_to_doclingoprocessingsí se aceptan: la extracción espera enwaiting_for_document(modo B). custom_instructiondescribe qué extraer; la plataforma ya agrega reglas de sistema (solo JSON, no inventar,nullsi falta). Ver Guía de prompts y schemas.response_schemadefine la forma exacta del JSON de salida.- Puedes crear varias extracciones sobre el mismo documento (cada una con su
Idempotency-Key).