ENTRAR  login to app
Cumplimiento

Procesamiento GDPR-compliant

Servidores UE, auto-borrado 30 min, DPA bajo solicitud. Para empresas europeas.

Leer guía de cumplimiento →
API v1

Documentación de la API de myocr.app

Una API REST sencilla para convertir PDF e imágenes en Excel limpio y estructurado. Te autenticas con una cabecera, envías un archivo y recibes una hoja de cálculo.

Visión general

La API de myocr.app convierte archivos de documentos (PDF, JPG, PNG) en Excel estructurado, CSV, texto o JSON. Envías un archivo y el nombre de un modelo; ejecutamos OCR y análisis de diseño y devolvemos un resultado limpio.

Cada solicitud se autentica con una API key en la cabecera X-API-Key. Las respuestas usan un envoltorio JSON predecible y cada llamada devuelve un request_id útil para soporte y depuración.

Usa el endpoint síncrono para archivos pequeños que necesitas al instante, y el endpoint asíncrono de trabajos (con webhook opcional) para archivos grandes o gran volumen.

URL base: https://api.myocr.app Autenticación: X-API-Key

Autenticación

Autentica cada solicitud con la cabecera X-API-Key. Crea y gestiona las claves desde tu panel en /account/api. Para emitir una clave se requiere una tarjeta de pago verificada (antiabuso).

Existen dos tipos de clave: las de prueba (prefijo sk_test_) usan la misma canalización sin consumir cuota de pago cuando aplica, y las live (prefijo sk_live_) para producción. Mantén las claves en secreto y en el servidor — nunca las incluyas en código del cliente.

Los endpoints de gestión de claves (/v1/keys) usan la sesión web de tu inicio de sesión, no la API key.

curl https://api.myocr.app/v1/status \
  -H "X-API-Key: sk_live_xxxxxxxxxxxx"
from myocr_client import MyOCRClient

client = MyOCRClient(api_key="sk_live_xxxxxxxxxxxx")
print(client.status())
const res = await fetch("https://api.myocr.app/v1/status", {
  headers: { "X-API-Key": "sk_live_xxxxxxxxxxxx" }
});
console.log(await res.json());

Inicio rápido

Convierte tu primer documento en menos de un minuto. Consigue una clave en el panel y envía una solicitud multipart con tu archivo y el modelo que quieras.

El ejemplo siguiente convierte cualquier PDF o imagen con tablas en una hoja .xlsx y la guarda en out.xlsx.

curl -X POST https://api.myocr.app/v1/convert \
  -H "X-API-Key: sk_live_xxxxxxxxxxxx" \
  -F "file=@invoice.pdf" \
  -F "model=tables" \
  -o out.xlsx
from myocr_client import MyOCRClient

client = MyOCRClient(api_key="sk_live_xxxxxxxxxxxx")
result = client.convert("invoice.pdf", model="tables")
result.save("out.xlsx")
import fs from "node:fs";

const form = new FormData();
form.append("file", new Blob([fs.readFileSync("invoice.pdf")]), "invoice.pdf");
form.append("model", "tables");

const res = await fetch("https://api.myocr.app/v1/convert", {
  method: "POST",
  headers: { "X-API-Key": "sk_live_xxxxxxxxxxxx" },
  body: form,
});
fs.writeFileSync("out.xlsx", Buffer.from(await res.arrayBuffer()));

Conversión síncrona

Método: POST /v1/convert Auth requerida: Límite de tasa: 60/min

POST /v1/convert acepta un único archivo (máx. 5 MB, máx. 10 páginas) y devuelve el archivo resultante directamente en el cuerpo de la respuesta — un .xlsx por defecto, o texto/JSON/CSV si defines el parámetro output.

Es el mejor endpoint cuando necesitas la respuesta de inmediato. Para archivos grandes o lotes, usa trabajos asíncronos.

Parámetros

NombreTipoObligatorioDescripción
filefileThe document to convert (PDF, JPG, PNG). Multipart field.
modelstringOne of: tables, text, invoice, receipt, bank_statement, business_card.
outputstringNoxlsx (default), txt, json or csv.

Trabajos asíncronos

Método: POST /v1/jobs Auth requerida: Límite de tasa: 120/min

Para archivos de hasta 50 MB (y PDFs de hasta 500 páginas) o mayor rendimiento, crea un trabajo con POST /v1/jobs. La llamada devuelve un request_id de inmediato; el archivo se procesa en segundo plano. Los PDFs por encima del límite de páginas se rechazan al instante con TOO_MANY_PAGES — divide el documento.

Consulta GET /v1/jobs/{request_id} para el estado (pending → processing → done/failed) y luego descarga el resultado en GET /v1/jobs/{request_id}/result. Indica un webhook_url para recibir aviso automático al terminar, sin sondeo.

NombreTipoObligatorioDescripción
filefileDocument up to 50 MB.
modelstringConversion model (see Models).
webhook_urlstringNoHTTPS URL notified (signed) when the job finishes.
# 1. create the job
curl -X POST https://api.myocr.app/v1/jobs \
  -H "X-API-Key: sk_live_xxxxxxxxxxxx" \
  -F "file=@statement.pdf" -F "model=bank_statement"
# → {"success": true, "data": {"request_id": "abcd1234"}}

# 2. poll status, then download the result
curl https://api.myocr.app/v1/jobs/abcd1234 -H "X-API-Key: sk_live_xxxxxxxxxxxx"
curl https://api.myocr.app/v1/jobs/abcd1234/result -H "X-API-Key: sk_live_xxxxxxxxxxxx" -o out.xlsx
job = client.create_job("statement.pdf", model="bank_statement")
job.wait()                     # polls with backoff until done
job.result().save("out.xlsx")

Conversión por lotes

Método: POST /v1/batch Auth requerida: Límite de tasa: 30/min

POST /v1/batch acepta de 1 a 20 archivos en una sola solicitud multipart, todos procesados con el mismo modelo. Cada archivo se informa de forma independiente; los fallos por archivo se devuelven en un array errors sin hacer fallar todo el lote.

curl -X POST https://api.myocr.app/v1/batch \
  -H "X-API-Key: sk_live_xxxxxxxxxxxx" \
  -F "files=@a.pdf" -F "files=@b.pdf" -F "files=@c.jpg" \
  -F "model=invoice"

Modelos

Pasa uno de estos valores model. tables y text usan nuestro motor OCR; los modelos especializados devuelven campos específicos del dominio.

ModeloQué extrae
tablesCualquier documento con tablas → una hoja por tabla, diseño preservado. El predeterminado de uso general.
textExtracción completa de texto (OCR) de cualquier documento. Siempre devuelve txt.
invoiceCampos de factura: proveedor, fecha, totales, IVA y líneas de detalle.
receiptCampos de recibo: comercio, fecha, total, impuesto y artículos — ideal para informes de gastos.
bank_statementFilas del extracto bancario: fecha, descripción, débito, crédito y saldo acumulado. Incluye verificación automática de saldos (cuadre).
business_cardCampos de contacto de tarjetas de visita: nombre, empresa, cargo, email, teléfono.

Formatos de salida

Define el parámetro output para elegir el formato: xlsx (por defecto, hoja estructurada), txt (texto plano), json (campos extraídos como JSON) o csv. El modelo text siempre devuelve txt.

Para model=bank_statement también puedes definir output como csv_quickbooks (CSV de 4 columnas para importación bancaria), csv_xero (plantilla de importación de Xero) u ofx (archivo OFX estándar para la mayoría del software contable). Con output=json la respuesta incluye además un objeto reconciliation: saldos inicial/final, total de créditos y débitos, la diferencia calculada y ok=true cuando las transacciones extraídas cuadran con los saldos del extracto.

Respuestas y cabeceras

Las respuestas JSON siguen un envoltorio fijo: un booleano success, un objeto data (o un objeto error) y un request_id. Las respuestas de archivo devuelven el binario directamente con el Content-Type adecuado.

Cada respuesta incluye la cabecera X-MyOCR-Request-Id. Las respuestas de archivo también incluyen X-MyOCR-Pages-Used (páginas facturadas) y X-MyOCR-Model (el modelo usado).

{
  "success": true,
  "data": { "request_id": "abcd1234" },
  "request_id": "abcd1234"
}

Errores

Los errores devuelven success: false con un error.code y un error.message legible, más el request_id. Usa el code (estable) para la lógica y el message (puede cambiar) para las personas.

CódigoHTTPSignificado
MISSING_API_KEY401No se envió la cabecera X-API-Key.
INVALID_API_KEY401La API key es desconocida, revocada o malformada.
UNSUPPORTED_MODEL400El valor model no es uno de los modelos admitidos.
UNSUPPORTED_FILE_TYPE400Extensión/tipo de archivo no aceptado (usa PDF, JPG, PNG).
MISSING_FILE400No se incluyó ningún archivo en la solicitud.
FILE_TOO_LARGE413El archivo supera el límite de tamaño del endpoint.
TOO_MANY_PAGES413El documento tiene más páginas de las permitidas por el endpoint.
INVALID_WEBHOOK_URL400El webhook_url falta o no es una URL HTTPS válida.
INSUFFICIENT_PAGES402Créditos de página insuficientes para procesar la solicitud.
QUOTA_EXCEEDED402Cuota mensual de páginas agotada — devuelve un upgrade_url.
CARD_REQUIRED402Se requiere una tarjeta de pago verificada antes de crear claves API o usar la prueba.
NO_ACTIVE_PLAN403No hay un plan activo en esta cuenta — suscríbete a un plan para usar la API.
SPEND_CAP_REACHED402Se alcanzó tu límite de gasto mensual — súbelo o mejora tu plan.
NOT_READY409El trabajo aún no ha terminado; el resultado no está disponible.
NOT_FOUND404El trabajo o recurso solicitado no existe.
OCR_ERROR502El motor OCR de origen no pudo procesar el documento.
STORAGE_ERROR502El almacenamiento temporal (subida/resultado) falló — se puede reintentar.
SERVICE_NOT_READY503Un servicio requerido aún no está configurado/habilitado.
INTERNAL_ERROR500Error inesperado del servidor — reintenta y luego contacta con soporte con el request_id.

Límites y cuota

Los límites de tasa se aplican por API key (no por IP), así los clientes tras un proxy compartido no comparten el límite: /v1/convert 60 req/min, /v1/jobs 120 req/min, /v1/batch 30 req/min.

Facturación por página, no por llamada. Planes: Free 10 páginas en total (única vez, tarjeta requerida), Starter €29/mes (2.500), Pro €99/mes (10.000), Scale €190/mes (20.000). El servicio nunca se interrumpe: al agotar las páginas del mes te avisamos por email y cargamos un paquete extra al precio por página de tu plan — Starter 500 a €0,0116, Pro 2.000 a €0,0099, Scale 4.000 a €0,0095 — hasta un tope mensual de recarga que tú defines (y puedes desactivar). Alcanzado el tope la API devuelve 402 con un upgrade_url. Consulta el uso con GET /v1/usage.

Webhooks

Cuando pasas un webhook_url a /v1/jobs, enviamos una POST con payload JSON a esa URL cuando el trabajo llega a done o failed. Las entregas se reintentan con backoff si fallan.

Cada entrega va firmada: verifica la cabecera de firma con tu webhook signing secret (visible en el panel) para confirmar que la solicitud viene realmente de myocr.app. El SDK de Python incluye el helper verify_webhook_signature.

SDK

El SDK oficial de Python (myocr-client) envuelve cada endpoint con métodos y excepciones tipados, sondeo automático Job.wait() con backoff y verificación de firma de webhook.

¿Prefieres HTTP directo? Sirve cualquier cliente HTTP — mira los ejemplos cURL y Node de esta guía y la referencia interactiva completa.

pip install myocr-client

Spec OpenAPI

Descargar spec OpenAPI

OpenAPI 3.1 (openapi.json) · Postman · Insomnia · code generators

Descargar spec OpenAPI

Preguntas frecuentes

¿Qué tipos y tamaños de archivo se admiten?

PDF, JPG y PNG. /v1/convert síncrono permite hasta 5 MB y 10 páginas; /v1/jobs asíncrono admite archivos de hasta 50 MB.

¿Cómo se factura el uso?

Por página procesada, contada en todos los endpoints y reiniciada cada mes. La cabecera X-MyOCR-Pages-Used indica cuántas páginas facturó cada llamada.

¿Qué diferencia hay entre claves de prueba y live?

Las claves de prueba (sk_test_) son para desarrollo y pruebas de integración; las live (sk_live_) para tráfico de producción. Ambas se autentican igual.

¿Síncrono o asíncrono?

Usa /v1/convert para archivos pequeños que necesitas al instante. Usa /v1/jobs (opcionalmente con webhook) para archivos grandes, lotes o procesamiento en segundo plano.

¿Dónde veo cada parámetro y esquema?

Cada endpoint, parámetro y respuesta está documentado en las secciones anteriores. Para uso automático, descarga el spec OpenAPI (openapi.json) e impórtalo en Postman, Insomnia o un generador de clientes.

Productividad

100 facturas en 10 minutos

Trucos y plantillas para procesamiento en lote. Guía gratis.

Leer la guía →