Referencia de la API
La API REST de ConvertFly te permite convertir, optimizar y transformar archivos mediante programación. Crea flujos de conversión con trabajos y tareas: importa un archivo, procésalo y exporta el resultado en una sola solicitud.
https://convertfly.io/api/v1Todos los endpoints son relativos a esta URL base. Las solicitudes y las respuestas usan JSON. Todas las marcas de tiempo están en UTC con formato ISO 8601.
Autenticación
Cada solicitud debe incluir una clave de API en el encabezado Authorization. Las claves llevan el prefijo cvfly_sk_ y puedes crearlas en tu panel.
Authorization: Bearer cvfly_sk_live_abc123def456...Consejo de seguridad: nunca expongas las claves de API en el código del lado del cliente. Guárdalas en variables de entorno y haz las llamadas a la API desde tu servidor.
Permisos de las claves
Las claves de API pueden limitarse a algunas operaciones. Una clave creada sin lista de permisos recibe los permisos predeterminados.
| Permiso | Acceso |
|---|---|
| job:read | Leer trabajos(predeterminado) |
| job:write | Crear, cancelar, reintentar y eliminar trabajos y sus tareas(predeterminado) |
| task:read | Leer tareas(predeterminado) |
| convert | Ejecutar conversiones(predeterminado) |
| api-key:read | Listar claves de API |
| api-key:write | Crear y revocar claves de API |
| webhook:read | Listar webhooks |
| webhook:write | Crear y eliminar webhooks |
Inicio rápido
Convierte un PDF a DOCX en tres pasos: crea un trabajo, espera a que termine y descarga el resultado.
Crea un trabajo de conversión
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_live_abc123..." \
-H "Content-Type: application/json" \
-d '{
"tasks": {
"import-file": {
"operation": "import/url",
"url": "https://example.com/report.pdf"
},
"convert": {
"operation": "convert",
"input": ["import-file"],
"output_format": "docx"
},
"export": {
"operation": "export/url",
"input": ["convert"]
}
}
}'const res = await fetch("https://convertfly.io/api/v1/jobs", {
method: "POST",
headers: {
"Authorization": "Bearer cvfly_sk_live_abc123...",
"Content-Type": "application/json",
},
body: JSON.stringify({
tasks: {
"import-file": {
operation: "import/url",
url: "https://example.com/report.pdf",
},
convert: {
operation: "convert",
input: ["import-file"],
output_format: "docx",
},
export: {
operation: "export/url",
input: ["convert"],
},
},
}),
});
const job = await res.json();
console.log(job.id); // "cmxr9k2p0..."
console.log(job.status); // "processing"import requests
resp = requests.post(
"https://convertfly.io/api/v1/jobs",
headers={"Authorization": "Bearer cvfly_sk_live_abc123..."},
json={
"tasks": {
"import-file": {
"operation": "import/url",
"url": "https://example.com/report.pdf",
},
"convert": {
"operation": "convert",
"input": ["import-file"],
"output_format": "docx",
},
"export": {
"operation": "export/url",
"input": ["convert"],
},
}
},
)
job = resp.json()
print(job["id"]) # "cmxr9k2p0..."
print(job["status"]) # "processing"Espera a que termine
Consulta periódicamente el estado del trabajo o usa webhooks para recibir notificaciones en tiempo real.
curl https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_live_abc123..."{
"id": "cmxr9k2p0",
"status": "finished",
"created_at": "2026-04-03T10:30:00Z",
"tasks": [
{
"name": "export",
"operation": "export/url",
"status": "finished",
"result": {
"files": [
{ "url": "https://files.convertfly.io/d/cmv.../result.docx?e=...&s=..." }
]
}
}
]
}Descarga el resultado
Usa la URL del resultado de la tarea de exportación. Los enlaces de descarga son válidos durante 1 hora; los archivos se eliminan 24 horas después de subirlos.
curl -o result.docx "https://files.convertfly.io/d/..."Trabajos
Un trabajo (Job) es un contenedor de una o varias tareas (Tasks) que forman un flujo de conversión. Las tareas de un trabajo se ejecutan según el orden de sus dependencias: cada tarea puede hacer referencia al resultado de una tarea anterior mediante el campo input.
Concepto de flujo
Un flujo típico tiene este aspecto: import/url -> convert -> export/url. También puedes encadenar varias operaciones: import -> convert -> optimize -> watermark -> export.
Estados de un trabajo
| Estado | Descripción |
|---|---|
| waiting | Trabajo creado, en cola para su procesamiento |
| processing | Al menos una tarea se está ejecutando |
| finished | Todas las tareas se completaron correctamente |
| error | Una o varias tareas fallaron |
Crear un trabajo
/api/v1/jobstagstringEtiqueta opcional para organizar los trabajos (p. ej., batch-2026-04).
tasksobjectobligatorioUn mapa de nombres de tareas con sus definiciones. Los nombres de las tareas deben ser únicos dentro del trabajo.
webhook_urlstringURL que recibirá un evento job.finished o job.failed cuando termine el trabajo.
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"tag": "invoice-batch",
"tasks": {
"import-file": {
"operation": "import/url",
"url": "https://example.com/invoice.pdf"
},
"to-png": {
"operation": "convert",
"input": ["import-file"],
"output_format": "png",
"options": { "density": 300 }
},
"export": {
"operation": "export/url",
"input": ["to-png"]
}
}
}'{
"id": "cmxr9k2p0",
"tag": "invoice-batch",
"status": "processing",
"created_at": "2026-04-03T10:30:00Z",
"tasks": [
{ "name": "import-file", "operation": "import/url", "status": "finished" },
{ "name": "to-png", "operation": "convert", "status": "processing" },
{ "name": "export", "operation": "export/url", "status": "waiting" }
]
}Ejemplo: combinar archivos en un solo PDF
La operación merge combina dos o más entradas (PDF o imágenes) en un único PDF. Enumera en orden los nombres de las tareas de entrada en el array input.
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"tasks": {
"cover": {
"operation": "import/url",
"url": "https://example.com/cover.png"
},
"report": {
"operation": "import/url",
"url": "https://example.com/report.pdf"
},
"merge-all": {
"operation": "merge",
"input": ["cover", "report"]
},
"export": {
"operation": "export/url",
"input": ["merge-all"]
}
}
}'Ejemplo: capturar un sitio web
La operación capture-website no necesita ninguna tarea de entrada: convierte la página de una URL pública en PDF, PNG o JPG.
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"tasks": {
"capture": {
"operation": "capture-website",
"url": "https://example.com",
"output_format": "pdf",
"width": 1280
},
"export": {
"operation": "export/url",
"input": ["capture"]
}
}
}'Obtener un trabajo
/api/v1/jobs/:idObtén los detalles de un trabajo y el estado de todas sus tareas.
curl https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_..."Listar trabajos
/api/v1/jobspageintegerNúmero de página, a partir de 1. Valor predeterminado: 1.
limitintegerResultados por página, de 1 a 100. Valor predeterminado: 20.
statusstringFiltrar por estado: WAITING, PROCESSING, FINISHED, ERROR.
tagstringFiltrar por etiqueta.
curl "https://convertfly.io/api/v1/jobs?status=finished&per_page=5" \
-H "Authorization: Bearer cvfly_sk_..."{
"data": [ ... ],
"links": { "first": "?page=1&per_page=5", "last": "?page=9&per_page=5", "prev": null, "next": "?page=2&per_page=5" },
"meta": {
"page": 1,
"per_page": 5,
"total": 42
}
}Eliminar un trabajo
/api/v1/jobs/:idElimina un trabajo y todos sus archivos asociados. Las tareas en ejecución se cancelarán. Esta acción es irreversible.
curl -X DELETE https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_..."Esperar a que termine
/api/v1/jobs/:id/waitEndpoint de long polling que se bloquea hasta que el trabajo alcanza un estado final (FINISHED o ERROR). Agota el tiempo de espera a los 300 segundos y devuelve 202 Accepted si el trabajo sigue en proceso.
curl "https://convertfly.io/api/v1/jobs/job_7kX9mP2qR/wait?timeout=120" \
-H "Authorization: Bearer cvfly_sk_..."Tareas
Las tareas son los pasos individuales de un trabajo. Cada tarea tiene un nombre (la clave en el objeto tasks), una operation y, opcionalmente, un array input que hace referencia a nombres de tareas anteriores.
Campos de una tarea
| Campo | Tipo | Descripción |
|---|---|---|
| operation | string | La operación que se va a realizar (consulta Operaciones) |
| input | string[] | Nombres de las tareas cuyo resultado se usa como entrada |
| output_format | string | Formato de destino de las operaciones de conversión |
| options | object | Ajustes propios de la operación (calidad, densidad, etc.) |
Listar las tareas de un trabajo
/api/v1/jobs/:id/tasks{
"data": [
{
"name": "import-file",
"operation": "import/url",
"status": "finished",
"result": { "file_id": "file_Xk9m..." }
},
{
"name": "convert",
"operation": "convert",
"status": "finished",
"result": { "file_id": "file_Pm3n..." }
}
]
}Obtener una tarea
/api/v1/jobs/:job_id/tasks/:task_nameCancelar una tarea
/api/v1/jobs/:job_id/tasks/:task_name/cancelCancela una tarea en ejecución o en espera. Las tareas posteriores que dependen de ella también se cancelarán.
Reintentar una tarea fallida
/api/v1/jobs/:job_id/tasks/:task_name/retryReintenta una tarea con el estado ERROR. Si la tarea es facturable, vuelve a consumir créditos.
Subida de archivos
Hay tres formas de enviar archivos a ConvertFly. Elige la que mejor se adapte a tu caso.
Importar desde una URL
El método más sencillo. ConvertFly descarga el archivo desde una URL de acceso público.
{
"import-file": {
"operation": "import/url",
"url": "https://example.com/document.pdf",
"filename": "document.pdf",
"headers": {
"Authorization": "Bearer your-external-token"
}
}
}Subida directa (URL prefirmada)
Para archivos que están en tu equipo. Es un proceso en dos pasos: primero crea la tarea para obtener una URL de subida prefirmada y luego envía tu archivo con PUT a esa URL.
{
"upload-file": {
"operation": "import/upload",
"filename": "photo.jpg"
}
}# The task result will contain the presigned URL
curl -X PUT "https://files.convertfly.io/convertfly-files/..." \
-H "Content-Type: image/jpeg" \
--data-binary @photo.jpgImportar desde Base64
Para archivos pequeños (menos de 10 MB). Inserta el contenido del archivo directamente en la solicitud.
{
"import-file": {
"operation": "import/base64",
"file": "JVBERi0xLjQKJcOkw7zD...",
"filename": "document.pdf"
}
}| Método | Tamaño máx. | Ideal para |
|---|---|---|
| import/url | 5 GB | Archivos ya alojados en línea |
| import/upload | 5 GB | Archivos locales, archivos grandes |
| import/base64 | 10 MB | Archivos pequeños, insertados en la solicitud |
Opciones de conversión
Cada operación admite opciones específicas. Aquí tienes todas las operaciones disponibles y los pares de formatos de las conversiones.
Operaciones disponibles
| Operación | Descripción | Créditos |
|---|---|---|
| import/upload | Subir un archivo mediante una URL prefirmada | 0 |
| import/url | Importar un archivo desde una URL | 0 |
| import/base64 | Importar un archivo a partir de datos en base64 | 0 |
| convert | Convertir entre formatos | 1-4 |
| optimize | Comprimir/optimizar un archivo | 1 |
| thumbnail | Generar una miniatura de vista previa | 1 |
| merge | Combinar varios PDF o imágenes en un único PDF | 1 |
| watermark | Añadir una marca de agua de texto o imagen a imágenes, videos o PDF | 1 |
| split | Extrae páginas de un PDF o divídelo en un PDF por página (ZIP) | 1 |
| rotate | Rota las páginas de un PDF 90, 180 o 270 grados | 1 |
| resize | Redimensiona una imagen por ancho, alto o porcentaje, manteniendo las proporciones | 1 |
| gif | Convierte un fragmento de video en un GIF animado (inicio, duración, fps, ancho) | 2 |
| ocr | Reconocer texto en PDF o imágenes (14 idiomas, los mismos que la página de OCR) | 3 |
| capture-website | Capturar un sitio web público en PDF, PNG o JPG | 1 |
| metadata | Extraer los metadatos de un archivo | 1 |
| export/url | Obtener una URL de descarga firmada | 0 |
| export/s3 | Exportar directamente a tu bucket de S3 | 0 |
Pares de formatos compatibles
Conversiones habituales. El formato se detecta automáticamente a partir del archivo, pero también puedes definir input_format de forma explícita.
| Categoría | Formatos de entrada | Formatos de salida |
|---|---|---|
| Documentos | pdf, docx, doc, odt, rtf, txt, html | pdf, docx, odt, rtf, txt, html |
| Hojas de cálculo | xlsx, xls, ods, csv | xlsx, ods, csv, pdf |
| Presentaciones | pptx, ppt, odp | pptx, odp, pdf |
| Imágenes | jpg, png, gif, bmp, tiff, webp, svg, heic | jpg, png, gif, bmp, tiff, webp |
| Video | mp4, avi, mov, mkv, webm | mp4, avi, mov, mkv, webm, gif |
| Audio | mp3, wav, ogg, flac, aac, m4a | mp3, wav, ogg, flac, aac |
Opciones de calidad y procesamiento
Pásalas en el objeto options de una tarea de conversión.
qualityintegerCalidad de salida para formatos con pérdida (1-100). Valor predeterminado: 85.
densityintegerPPP para la conversión de documento a imagen. Valor predeterminado: 150.
widthintegerRedimensionar a este ancho en píxeles. Mantiene la relación de aspecto si se omite height.
heightintegerRedimensionar a este alto en píxeles. Mantiene la relación de aspecto si se omite width.
pagesstringIntervalo de páginas para las operaciones con documentos. P. ej., 1-5, 1,3,5, all.
{
"convert-hq": {
"operation": "convert",
"input": ["import-file"],
"output_format": "png",
"options": {
"density": 300,
"quality": 95
}
}
}Webhooks
Registra URL de webhook para recibir notificaciones en tiempo real cuando cambie el estado de los trabajos o las tareas. Todas las cargas útiles se firman con HMAC-SHA256 para que puedas verificar que proceden de ConvertFly.
Crear un webhook
/api/v1/webhooksurlstringobligatorioLa URL HTTPS que recibirá los eventos del webhook.
eventsstring[]obligatorioTipos de eventos a los que suscribirse.
curl -X POST https://convertfly.io/api/v1/webhooks \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.com/webhooks/convertfly",
"events": ["job.finished", "job.failed"]
}'{
"data": {
"id": "wh_Abc123...",
"url": "https://your-app.com/webhooks/convertfly",
"events": ["job.finished", "job.failed"],
"signing_secret": "whsec_9f8e7d6c5b4a...",
"created_at": "2026-04-03T10:30:00Z"
}
}Listar webhooks
/api/v1/webhooksEliminar un webhook
/api/v1/webhooks/:idTipos de eventos
| Evento | Desencadenante |
|---|---|
| job.finished | Todas las tareas del trabajo se completaron correctamente |
| job.failed | Una o varias tareas fallaron; el trabajo está en estado ERROR |
| task.finished | Una tarea individual se completó |
| task.failed | Una tarea individual falló |
Carga útil del webhook
{
"event": "job.finished",
"timestamp": "2026-04-03T10:31:15Z",
"data": {
"id": "job_7kX9mP2qR",
"status": "finished",
"tasks": { ... }
}
}Verificación de firmas
Cada solicitud de webhook incluye dos encabezados: X-Webhook-Signature y X-Webhook-Timestamp. Verifícalos para asegurarte de que la carga útil la envió ConvertFly y de que no se ha alterado.
import crypto from "crypto";
function verifyWebhook(rawBody, signature, timestamp, secret) {
const signedContent = timestamp + "." + rawBody;
const expected = "v1=" + crypto
.createHmac("sha256", secret)
.update(signedContent)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
}import hmac, hashlib
def verify_webhook(raw_body: bytes, signature: str, timestamp: str, secret: str) -> bool:
signed_content = f"{timestamp}.{raw_body.decode()}"
expected = "v1=" + hmac.new(
secret.encode(), signed_content.encode(), hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)Claves de API
Gestiona las claves de API mediante programación. También puedes gestionarlas desde el panel.
Crear una clave de API
/api/v1/api-keysnamestringobligatorioUn nombre descriptivo para la clave.
scopesstring[]Permisos que se conceden. Valor predeterminado: ["*"] (acceso completo).
{
"data": {
"id": "key_Xk9m...",
"name": "production-server",
"key": "cvfly_sk_live_abc123def456...",
"scopes": ["*"],
"created_at": "2026-04-03T10:30:00Z"
}
}Importante: la clave de API completa solo se muestra una vez, en el momento de su creación. Guárdala de forma segura: no podrás recuperarla después.
Listar claves de API
/api/v1/api-keysRevocar una clave de API
/api/v1/api-keys/:idInvalida la clave de inmediato. Cualquier solicitud que la use devolverá 401.
Límite de solicitudes
Las solicitudes a la API tienen un límite por clave de API para garantizar un uso equitativo. Cuando superas el límite, las solicitudes devuelven 429 Too Many Requests.
Límite predeterminado
Cada clave de API permite 100 solicitudes por hora. El límite y la ventana actuales de una clave se devuelven como rate_limit y rate_limit_window (en segundos) al listar tus claves. Contacta con nosotros si tu integración necesita un límite mayor.
Encabezados de respuesta
Cada respuesta a una solicitud hecha con una clave de API incluye estos encabezados:
X-RateLimit-LimitencabezadoNúmero máximo de solicitudes permitidas en la ventana actual.
X-RateLimit-RemainingencabezadoSolicitudes restantes en la ventana actual.
X-RateLimit-ResetencabezadoMarca de tiempo Unix en la que se reinicia la ventana.
Retry-AfterencabezadoSegundos que hay que esperar antes de reintentar (solo en respuestas 429).
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1743681600
Retry-After: 3600
{
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. 100 requests per 3600s allowed."
}Errores
ConvertFly usa los códigos de estado HTTP convencionales. Todas las respuestas de error siguen un formato uniforme con un code legible por máquina y un message legible por personas.
Formato de las respuestas de error
{
"code": "INVALID_DATA",
"message": "Missing required field: output_format",
"details": {
"field": "output_format",
"reason": "required"
}
}Códigos de error
| Código | HTTP | Descripción |
|---|---|---|
| INVALID_DATA | 400 | Cuerpo de la solicitud o parámetros no válidos |
| UNAUTHENTICATED | 401 | Clave de API ausente o no válida |
| FORBIDDEN | 403 | La clave de API no tiene el permiso necesario para esta operación |
| NOT_FOUND | 404 | El recurso no existe o se ha eliminado |
| CONFLICT | 409 | El recurso ya existe o la operación entra en conflicto con el estado actual |
| PAYLOAD_TOO_LARGE | 413 | El cuerpo de la solicitud supera el tamaño máximo permitido |
| UNSUPPORTED_FORMAT | 422 | La conversión solicitada no es compatible |
| RATE_LIMIT_EXCEEDED | 429 | Límite de solicitudes superado: consulta Límite de solicitudes |
| INSUFFICIENT_CREDITS | 402 | No hay créditos suficientes para completar la operación |
| SERVER_ERROR | 500 | Error interno del servidor: reintenta o contacta con soporte |
| UNAVAILABLE | 503 | Servicio no disponible temporalmente: vuelve a intentarlo en unos instantes |
Gestión de errores
const res = await fetch("https://convertfly.io/api/v1/jobs", {
method: "POST",
headers: {
"Authorization": "Bearer cvfly_sk_...",
"Content-Type": "application/json",
},
body: JSON.stringify({ tasks: { /* ... */ } }),
});
if (!res.ok) {
const error = await res.json();
console.error(`[${error.code}] ${error.message}`);
// "[INVALID_DATA] Missing required field: output_format"
return;
}
const { data: job } = await res.json();Créditos
Cada operación cuesta un número determinado de créditos. Las operaciones de importación y exportación son gratuitas. Tu saldo restante se incluye en cada respuesta de la API mediante el encabezado X-Credits-Remaining.
Costo en créditos por tipo de conversión
| Operación | Costo | Ejemplos |
|---|---|---|
| Importación / exportación | Gratis | import/url, import/upload, export/url, export/s3 |
| Conversión de imágenes | 1 crédito | jpg a png, webp a gif, heic a jpg |
| Conversión de audio | 1 crédito | mp3 a wav, flac a aac |
| Documento a PDF | 1 crédito | txt a pdf, html a pdf, md a pdf |
| Office a PDF | 2 créditos | docx a pdf, pptx a pdf, xlsx a pdf |
| Conversión de video | 2 créditos | mp4 a webm, mov a mp4 |
| PDF a Office | 4 créditos | pdf a docx, pdf a pptx |
| Optimizar | 1 crédito | Comprimir imágenes y PDF |
| Miniatura | 1 crédito | Generar una imagen de vista previa |
| Combinar | 1 crédito | Combinar varios PDF |
| Marca de agua | 1 crédito | Añadir una superposición de texto o imagen |
| Dividir PDF | 1 crédito | Extraer las páginas 1-3, 7 o un archivo por página |
| Rotar PDF | 1 crédito | Girar todas las páginas o una selección |
| Redimensionar imagen | 1 crédito | 1200 px de ancho, 50 por ciento |
| Crear GIF | 2 créditos | Fragmento mp4 a gif, mismo precio que una conversión de video |
| Capturar sitio web | 1 crédito | Convertir la página de una URL en PDF o imagen |
| OCR | 3 créditos | Hacer que un PDF escaneado permita búsquedas |
| Metadatos | 1 crédito | Extraer información del archivo |
Consultar tu saldo
Cada respuesta de la API incluye el encabezado X-Credits-Remaining con tu saldo actual.
HTTP/1.1 201 Created
Content-Type: application/json
X-Credits-Remaining: 9847
X-Credits-Used: 2Cuando tu saldo es insuficiente para completar un trabajo, la API devuelve 402 con el código de error INSUFFICIENT_CREDITS. Recarga créditos en tu panel de facturación.
Entorno de pruebas
Las claves de entorno de pruebas te permiten crear y probar una integración de principio a fin sin gastar créditos. Crea una clave con "sandbox": true; lleva el prefijo cf_test_ en lugar de cvfly_sk_. Todo funciona igual que en producción, con tres diferencias.
| Créditos | Nunca se cobran. Tu saldo no se modifica. |
| Tamaño de archivo | Las entradas tienen un límite de 5 MB. |
| Resultado | Las imágenes, los videos y los PDF llevan una marca de agua "ConvertFly SANDBOX". |
curl -X POST https://convertfly.io/api/v1/api-keys \
-H "Authorization: Bearer YOUR_LIVE_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Sandbox", "sandbox": true}'
# Response includes: "key": "cf_test_...", "is_sandbox": true¿Listo para empezar a desarrollar?
Crea tu cuenta gratuita y prueba la API con una clave de entorno de pruebas, sin costo alguno.