Saltar al contenido principal
PapyDocs

PapyDocs para desarrolladores

La API de Papy lleva el procesamiento de documentos de PapyDocs a tus aplicaciones, sitios web y programas mediante una interfaz REST sencilla y versionada.

  • Cada endpoint documentado ejecuta los mismos motores que las herramientas de PapyDocs.
  • Las claves se guardan como huellas, se muestran una sola vez y se pueden renovar o revocar.
  • Los archivos se procesan en memoria y nunca se guardan; solo se conservan contadores de uso.

Comprobando la disponibilidad…

Inicio rápido

  1. Pide una clave de API al administrador de esta instalación de PapyDocs (se crea en «Claves y uso», más abajo).
  2. Envía una solicitud POST multipart/form-data a /api/v1/OPERATION con tus archivos PDF y parámetros.
  3. Añade la cabecera Authorization: Bearer YOUR_KEY a cada solicitud.
  4. Lee el resultado JSON o guarda el PDF o ZIP devuelto. Los errores siempre se devuelven en JSON con un código estable.
Listar las operaciones disponibles en esta instalación
curl https://papydocs.vercel.app/api/v1

Autenticación

Cada solicitud se autentica con una clave de API enviada en la cabecera Authorization.

HTTP
Authorization: Bearer papy_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  • PapyDocs solo guarda una huella SHA-256 de cada clave, nunca la clave en sí.
  • Una clave nueva se muestra una sola vez, al crearla. Guárdala en tu gestor de secretos: no se podrá volver a mostrar.
  • La renovación emite una clave nueva y revoca la anterior al instante; la revocación se aplica desde la siguiente solicitud.
  • Llama a la API desde tu servidor. Nunca pongas una clave en una página web ni en una aplicación móvil.

Referencia de endpoints

Todas las operaciones son solicitudes POST a /api/v1/OPERATION con un cuerpo multipart/form-data. Las operaciones JSON devuelven application/json; las operaciones con archivos devuelven directamente el PDF o el ZIP.

Operaciones con documentos

POST/api/v1/info— Información del documento

Devuelve el número de páginas, el tamaño y los metadatos de un PDF.

CampoTipoObligatorio
fileArchivo PDFSí

Respuesta: JSON

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/info" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "file=@document.pdf"
Ejemplo de respuesta (abreviado)
{
  "pages": 2,
  "bytes": 48213,
  "metadata": {
    "title": "Contract",
    "author": "",
    "subject": "",
    "keywords": "",
    "creator": "",
    "producer": "pdf-lib",
    "creationDate": "2026-10-14T09:00:00.000Z",
    "modificationDate": null,
    "customKeys": [],
    "hasXmp": false,
    "hasJavaScript": false,
    "hasEmbeddedFiles": false,
    "pageCount": 2
  }
}

POST/api/v1/merge— Unir

Une varios PDF en el orden en que se envían.

CampoTipoObligatorio
filesVarios archivos PDFSí

Respuesta: Archivo PDF

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/merge" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "files=@document.pdf" \
  -F "files=@other.pdf" \
  -o result.pdf

POST/api/v1/split— Dividir

Divide un PDF por rangos de páginas (p. ej. 1-2,5) o en un archivo por página; devuelve un ZIP.

CampoTipoObligatorio
fileArchivo PDFSí
modeUno de (ranges | every-page)No
rangesTextoNo

Respuesta: Archivo ZIP con PDF

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/split" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "file=@document.pdf" \
  -F 'mode=ranges' \
  -F 'ranges=1-2,5' \
  -o result.zip

POST/api/v1/compress— Comprimir

Optimización estructural sin pérdida de un PDF (las imágenes no se recodifican).

CampoTipoObligatorio
fileArchivo PDFSí

Respuesta: Archivo PDF

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/compress" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "file=@document.pdf" \
  -o result.pdf

POST/api/v1/rotate— Girar

Gira todas las páginas 90, 180 o 270 grados.

CampoTipoObligatorio
fileArchivo PDFSí
angleUno de (90 | 180 | 270)No

Respuesta: Archivo PDF

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/rotate" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "file=@document.pdf" \
  -F 'angle=90' \
  -o result.pdf

POST/api/v1/page-numbers— Números de página

Añade números de página a partir de una plantilla con las variables {page} y {total} (caracteres latinos).

CampoTipoObligatorio
fileArchivo PDFSí
formatTextoNo
startNúmeroNo

Respuesta: Archivo PDF

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/page-numbers" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "file=@document.pdf" \
  -F 'format={page} / {total}' \
  -F 'start=1' \
  -o result.pdf

POST/api/v1/watermark— Marca de agua

Añade una marca de agua de texto en diagonal en cada página (caracteres latinos).

CampoTipoObligatorio
fileArchivo PDFSí
textTextoSí
opacityNúmeroNo

Respuesta: Archivo PDF

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/watermark" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "file=@document.pdf" \
  -F 'text=CONFIDENTIAL' \
  -F 'opacity=0.2' \
  -o result.pdf

Inteligencia documental

POST/api/v1/text— Extraer texto

Devuelve el texto de cada página e indica si el documento parece escaneado (needsOcr). No se realiza OCR en el servidor.

CampoTipoObligatorio
fileArchivo PDFSí

Respuesta: JSON

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/text" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "file=@document.pdf"
Ejemplo de respuesta (abreviado)
{
  "pages": [
    {
      "page": 1,
      "text": "Facture N° FAC-2026-0042\nTotal TTC 144,00 €"
    }
  ],
  "characters": 41,
  "needsOcr": false
}

POST/api/v1/invoice— Extraer datos de facturas

Extrae proveedor, cliente, número, fechas, moneda, importes, líneas, condiciones de pago y referencia del pedido, cada uno con su página y línea de origen, además de comprobaciones de coherencia. Los valores que faltan se devuelven como null, nunca se estiman.

CampoTipoObligatorio
fileArchivo PDFSí

Respuesta: JSON

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/invoice" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "file=@document.pdf"
Ejemplo de respuesta (abreviado)
{
  "fields": {
    "invoiceNumber": {
      "value": "FAC-2026-0042",
      "status": "found",
      "source": {
        "pageNumber": 1,
        "excerpt": "Facture N° FAC-2026-0042"
      }
    },
    "total": {
      "value": "144",
      "status": "found",
      "source": {
        "pageNumber": 1,
        "excerpt": "Total TTC 144,00 €"
      }
    },
    "dueDate": {
      "value": null,
      "status": "missing",
      "source": null
    }
  },
  "lineItems": [
    {
      "description": "Ramette papier A4",
      "quantity": 10,
      "unitPrice": 5,
      "amount": 50,
      "source": {
        "pageNumber": 1,
        "excerpt": "Ramette papier A4 10 5,00 € 50,00 €"
      }
    }
  ],
  "checks": [
    {
      "code": "missing",
      "field": "dueDate"
    }
  ]
}

POST/api/v1/contract— Analizar un contrato

Devuelve los títulos de cláusulas, pasajes por tema (partes, pago, duración, resolución…), fechas, importes, preavisos y pasajes por revisar, todos copiados del documento con su página. Indicaciones por palabras clave, no asesoramiento jurídico.

CampoTipoObligatorio
fileArchivo PDFSí

Respuesta: JSON

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/contract" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "file=@document.pdf"
Ejemplo de respuesta (abreviado)
{
  "notice": "Passages are copied from the document; categories and flags are keyword-based pointers to verify, not legal advice.",
  "pageCount": 2,
  "clauses": [
    {
      "heading": "Article 7 - Résiliation",
      "pageNumber": 2
    }
  ],
  "findings": [
    {
      "category": "termination",
      "pageNumber": 2,
      "clause": "Article 7 - Résiliation",
      "excerpt": "Chaque partie peut résilier le contrat moyennant un préavis de 3 mois."
    }
  ],
  "flags": [
    {
      "reason": "auto-renewal",
      "pageNumber": 1,
      "clause": "Article 2 - Durée",
      "excerpt": "Il est renouvelé par tacite reconduction…",
      "match": "tacite reconduction"
    }
  ],
  "facts": [
    {
      "type": "notice",
      "value": "préavis de 3 mois",
      "pageNumber": 2,
      "clause": "Article 7 - Résiliation",
      "excerpt": "…"
    }
  ],
  "sentenceCount": 14
}

POST/api/v1/compare— Comparar dos versiones

Compara el texto de dos PDF página por página y devuelve los pasajes añadidos, suprimidos y modificados con su contexto.

CampoTipoObligatorio
originalArchivo PDFSí
revisedArchivo PDFSí

Respuesta: JSON

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/compare" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "original=@contract-v1.pdf" \
  -F "revised=@contract-v2.pdf"
Ejemplo de respuesta (abreviado)
{
  "identical": false,
  "pageCountOriginal": 2,
  "pageCountRevised": 2,
  "wordsAdded": 11,
  "wordsRemoved": 1,
  "changes": [
    {
      "type": "modified",
      "pageNumber": 1,
      "before": "12",
      "after": "24",
      "context": "Le contrat est conclu pour une durée de 24 mois."
    }
  ]
}

POST/api/v1/proofread— Corregir

Aplica las reglas de corrección locales de PapyDocs (espacios, puntuación, palabras repetidas, mayúsculas, errores frecuentes) y devuelve cada problema con su corrección y posición.

CampoTipoObligatorio
fileArchivo PDFSí
languageUno de (auto | fr | en | es | pt)No

Respuesta: JSON

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/proofread" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "file=@document.pdf" \
  -F 'language=auto'
Ejemplo de respuesta (abreviado)
{
  "language": "fr",
  "engine": "local-rules",
  "issues": [
    {
      "page": 1,
      "start": 11,
      "end": 15,
      "original": "recu",
      "suggestion": "reçu",
      "category": "spelling",
      "rule": "misspelling"
    }
  ]
}

Seguridad y privacidad

POST/api/v1/remove-metadata— Eliminar metadatos

Elimina los metadatos del documento y el contenido activo (JavaScript, archivos incrustados).

CampoTipoObligatorio
fileArchivo PDFSí

Respuesta: Archivo PDF

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/remove-metadata" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "file=@document.pdf" \
  -o result.pdf

POST/api/v1/protect— Proteger con contraseña

Cifra un PDF (AES-256) con una contraseña de apertura.

CampoTipoObligatorio
fileArchivo PDFSí
passwordTextoSí
owner_passwordTextoNo

Respuesta: Archivo PDF

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/protect" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "file=@document.pdf" \
  -F 'password=your-password' \
  -o result.pdf

POST/api/v1/unlock— Quitar una contraseña

Descifra un PDF cuando se proporciona la contraseña correcta.

CampoTipoObligatorio
fileArchivo PDFSí
passwordTextoSí

Respuesta: Archivo PDF

Ejemplos de código y de respuesta
cURL
curl -X POST "https://papydocs.vercel.app/api/v1/unlock" \
  -H "Authorization: Bearer $PAPY_API_KEY" \
  -F "file=@document.pdf" \
  -F 'password=your-password' \
  -o result.pdf

Endpoints de gestión de claves

Reservados al administrador de la instalación, autenticado con el token de administrador (no con una clave de API). Los usa la sección «Claves y uso» de esta página.

  • GET/api/v1/keys— Listar las claves (sin los secretos)
  • POST/api/v1/keys— Crear una clave (cuerpo JSON con un nombre); el secreto se devuelve una sola vez
  • DELETE/api/v1/keys/{id}— Revocar una clave
  • POST/api/v1/keys/{id}/rotate— Renovar una clave; el nuevo secreto se devuelve una sola vez
  • GET/api/v1/usage?days=30— Contadores de uso por día, clave y operación

Errores y límites

Los errores usan códigos HTTP estándar y un cuerpo JSON con un código estable y legible por máquina. Los mensajes no se traducen: interpreta el código en tu aplicación.

Formato de los errores
{
  "error": {
    "code": "authorization-required"
  }
}
EstadoSignificadoCódigos de error
200Éxito
400Parámetro ausente o no válidoinvalid-options, empty-selection
401Clave ausente, no válida o revocada (o token de administrador)authorization-required
404Operación o clave desconocidainvalid-options
413Solicitud o archivo demasiado granderequest-too-large, file-too-large
415El archivo no es un PDFunsupported-type
422El PDF no se puede procesar (dañado, cifrado, contraseña incorrecta, sin texto…)corrupt, encrypted, wrong-password, no-text, invalid-range
429Límite por hora alcanzado: espera los segundos indicados en Retry-Afterrate-limited
503La API, o la gestión de claves, no está activada en esta instalaciónserver-unavailable

Límites

  • Límite predeterminado: 120 solicitudes por hora y por clave (configurable por la instalación).
  • Cada respuesta incluye X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset (en segundos).
  • Hasta 100 MB por PDF, 200 MB por solicitud y 60 archivos por solicitud.
  • Las operaciones de texto leen hasta 500 páginas por documento; las búsquedas se limitan a 200 caracteres y 100 resultados.
  • Las operaciones de análisis rechazan los documentos escaneados sin capa de texto (error no-text): ejecuta antes un OCR, por ejemplo con la herramienta OCR de PapyDocs.

Consola de pruebas

Envía una solicitud real a esta instalación con tu clave. La clave permanece en la memoria de esta página, solo se envía a este sitio y nunca se guarda. Los archivos que elijas se envían a la API solo para esta solicitud.

Empieza por papy_. No se guarda.

Claves y uso

Para el administrador de esta instalación. Introduce el token de administrador configurado en el servidor (su huella se define en PAPY_ADMIN_TOKEN_HASH). El token permanece solo en la memoria de esta página.

No se guarda. Solo se envía a este sitio.

Protección de datos

  • Los archivos enviados a la API se procesan en memoria durante la solicitud y no se guardan.
  • PapyDocs no escribe en sus registros contenido de documentos, nombres de archivo, parámetros ni claves.
  • Las estadísticas de uso son contadores agregados que se conservan 90 días.
  • Usa solo HTTPS. La API ejecuta los motores de PapyDocs en este servidor; no envía tus documentos a ningún proveedor de IA.