API PDFThin
Sube PDFs, comprime por tamano o calidad y descarga resultados con una API REST.
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
Archivo PDF a procesar.
mode
optimize (predeterminado) o split.
preset
gmail25 | outlook20 | outlook25 | custom. Obligatorio para objetivos de tamano si quality no esta definido.
custom_mb
Requerido cuando preset=custom. Tamano objetivo en MB.
quality
screen | ebook | printer | prepress o 1-100. No permitido para split.
quality_mode
Usa "smart" para alcanzar el tamano objetivo probando calidades; requiere preset/custom_mb.
watermark
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
Uno o mas archivos PDF (se permiten multiples).
mode
organize.
rotate_angle
90 | 180 | 270.
rotate_pages
Lista de paginas como 1,3-5.
delete_pages
Paginas a eliminar, p. ej. 2,4,7-9.
order_pages
Orden explicito de paginas, p. ej. 3,1,2.
split_after
Dividir despues de paginas, p. ej. 2,4,7.
watermark
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