OCR Platform
Admin

URL base API

https://ocr.789.com.mx/v1

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)

  1. Subir documento.
  2. Esperar status: completed.
  3. Crear extracción.
  4. Leer resultado.

Modo B — Paralelo (optimizado)

  1. Subir documento.
  2. Crear extracción de inmediato.
  3. La extracción queda en waiting_for_document hasta que el OCR termine.
  4. Se encola automáticamente y procesa sin un segundo POST.
  5. Si el OCR falla o no genera el formato que pediste, la extracción pasa a failed con extraction_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, expired o purged no son extraíbles (409 document_not_extractable). Tampoco un documento terminado que no generó el input_result_type pedido ni ningún otro formato utilizable.
  • Documentos en queued, submitting_to_docling o processing sí se aceptan: la extracción espera en waiting_for_document (modo B).
  • custom_instruction describe qué extraer; la plataforma ya agrega reglas de sistema (solo JSON, no inventar, null si falta). Ver Guía de prompts y schemas.
  • response_schema define la forma exacta del JSON de salida.
  • Puedes crear varias extracciones sobre el mismo documento (cada una con su Idempotency-Key).