API PDFThin

Sube PDFs, comprime por tamano o calidad y descarga resultados con una API REST.

100req/min
200 MBmax upload
1000max pages
60 horasfile TTL

Resumen

Todas las cargas usan multipart/form-data. Las respuestas son JSON.

  • URL base: https://pdfthin.com (o tu SITE_URL).
  • Limite de velocidad: RATE_LIMIT_RPM por IP (predeterminado 60/min).
  • Carga maxima: MAX_UPLOAD_MB (predeterminado 200 MB).
  • Los archivos se eliminan tras 60 horas.
  • Entradas compatibles: archivo PDF; marca de agua PNG/JPG hasta 5MB.
  • Variantes de carga: un archivo (optimize/split) o varios archivos (organize).

Configuracion del servidor

Variables de entorno clave que afectan el comportamiento de la API.

  • REDIS_URL: cola de trabajos y almacenamiento de estado.
  • S3_ENDPOINT/S3_BUCKET/S3_ACCESS_KEY/S3_SECRET_KEY: almacenamiento de objetos (opcional, si no local).
  • Los archivos se eliminan tras 60 horas.
  • RATE_LIMIT_RPM y DOWNLOAD_TOKEN_TTL_MIN.

Crear job (optimize o split)

POST /api/jobs con multipart/form-data.

  • mode=split ignora quality y devuelve partes si es necesario.
  • Cuando se define quality, preset/custom_mb se ignoran.
  • Con quality_mode=smart, la API prueba de calidad alta a baja para ajustar el tamano.
file
file (PDF) obligatorio
Archivo PDF a procesar.
mode
string opcional
optimize (predeterminado) o split.
preset
string opcional
gmail25 | outlook20 | outlook25 | custom. Obligatorio para objetivos de tamano si quality no esta definido.
custom_mb
int opcional
Requerido cuando preset=custom. Tamano objetivo en MB.
quality
string opcional
screen | ebook | printer | prepress o 1-100. No permitido para split.
quality_mode
string opcional
Usa "smart" para alcanzar el tamano objetivo probando calidades; requiere preset/custom_mb.
watermark
file (PNG/JPG) opcional
Imagen de marca de agua hasta 5MB.
cURL: preset de tamano
curl -X POST https://pdfthin.com/api/jobs   -F "[email protected]"   -F "preset=gmail25"   -F "mode=optimize"
cURL: calidad inteligente (tamano objetivo)
curl -X POST https://pdfthin.com/api/jobs   -F "[email protected]"   -F "preset=custom"   -F "custom_mb=12"   -F "quality_mode=smart"   -F "mode=optimize"
cURL: calidad fija
curl -X POST https://pdfthin.com/api/jobs   -F "[email protected]"   -F "quality=printer"   -F "mode=optimize"

Crear job (organize)

Usa mode=organize para unir, rotar, eliminar, reordenar y dividir paginas.

  • Si se suben varios archivos, se combinan en el orden de carga.
  • Se requiere al menos una operacion o varios archivos.
file
file (PDF) obligatorio
Uno o mas archivos PDF (se permiten multiples).
mode
string obligatorio
organize.
rotate_angle
int opcional
90 | 180 | 270.
rotate_pages
string opcional
Lista de paginas como 1,3-5.
delete_pages
string opcional
Paginas a eliminar, p. ej. 2,4,7-9.
order_pages
string opcional
Orden explicito de paginas, p. ej. 3,1,2.
split_after
string opcional
Dividir despues de paginas, p. ej. 2,4,7.
watermark
file (PNG/JPG) opcional
Imagen de marca de agua hasta 5MB.
cURL: unir + rotar
curl -X POST https://pdfthin.com/api/jobs   -F "[email protected]"   -F "[email protected]"   -F "mode=organize"   -F "rotate_angle=90"   -F "rotate_pages=1-2"

Consultar estado

GET /api/jobs/{id} devuelve el estado del job y archivos de resultado.

  • Valores de estado: queued | processing | done | failed.
Respuesta de ejemplo
{
  "id": "job-id",
  "status": "done",
  "progress_pct": 100,
  "expires_at": "2026-01-22T11:02:51Z",
  "result": {
    "kind": "single",
    "files": [
      {
        "name": "output.pdf",
        "size": 503937,
        "download_url": "/api/jobs/job-id/download?index=0"
      }
    ]
  }
}

Descargar resultados

GET /api/jobs/{id}/download?index=0

  • Usa index=0..n para salidas en varias partes.
  • Si se llama sin token, la API devuelve una redireccion con un token de corta duracion.
  • TTL del token: DOWNLOAD_TOKEN_TTL_MIN minutos.
cURL: descarga
curl -L "https://pdfthin.com/api/jobs/job-id/download?index=0" -o output.pdf

Eliminar job

DELETE /api/jobs/{id} elimina archivos y estado.

  • Devuelve 204 No Content.
cURL: eliminar
curl -X DELETE https://pdfthin.com/api/jobs/job-id

Codigos de error

Los errores usan JSON: {"error":{"code":"...","message":"..."}}

  • ERR_INVALID_FILE
  • ERR_TOO_LARGE
  • ERR_PASSWORD_PROTECTED
  • ERR_CANNOT_FIT_SINGLE_PAGE
  • ERR_TIMEOUT
  • ERR_INTERNAL
  • ERR_NOT_FOUND
  • ERR_NOT_READY
  • ERR_TOKEN_USED
  • ERR_FORBIDDEN

OpenAPI (borrador)

Fragmento minimo de OpenAPI 3.0 para integracion rapida.

openapi.yaml
openapi: 3.0.3
info:
  title: PDFThin API
  version: "1.0"
paths:
  /api/jobs:
    post:
      summary: Create a job
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
                mode:
                  type: string
                preset:
                  type: string
                custom_mb:
                  type: integer
                quality:
                  type: string
                quality_mode:
                  type: string
                watermark:
                  type: string
                  format: binary
      responses:
        "202":
          description: Accepted
  /api/jobs/{id}:
    get:
      summary: Get job status
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "200":
          description: OK
    delete:
      summary: Delete job
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        "204":
          description: No Content
  /api/jobs/{id}/download:
    get:
      summary: Download result
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
        - in: query
          name: index
          schema:
            type: integer
      responses:
        "303":
          description: See Other