Convierta archivos desde su propio código con los mismos conversores que el sitio web: una clave de API, una interfaz REST sencilla, créditos y webhooks.
Cree una clave en la página de su cuenta y envíe un archivo y el formato que desea:
curl -X POST https://api.101convert.com/v1/conversions \
-H "Authorization: Bearer $API_KEY" \
-F "file=@photo.jpg" \
-F "target=webp" \
-F "quality=85" \
-F "wait=30"
La respuesta describe la conversión. Con wait=30 una conversión rápida ya está terminada en la misma respuesta; si no, consulte su estado más tarde. Después descargue el resultado:
{
"id": "cnv_01j9z3k8q4x7m2n5p6r8s9t0v1",
"status": "succeeded",
"source": "jpg",
"target": "webp",
"credits": 2,
"result": {
"filename": "photo.webp",
"size": 48213,
"download_url": "https://api.101convert.com/v1/conversions/cnv_01j9z3k8q4x7m2n5p6r8s9t0v1/download",
"expires_at": "…"
}
}
curl -o photo.webp -H "Authorization: Bearer $API_KEY" \
https://api.101convert.com/v1/conversions/cnv_01j9z3k8q4x7m2n5p6r8s9t0v1/download
Envíe su clave en la cabecera Authorization como "Bearer
| Método | Ruta | Descripción |
|---|---|---|
| POST | /v1/conversions | Inicia una conversión desde un archivo o una URL (también POST /v1/convert) |
| GET | /v1/conversions/{id} | Estado de una conversión, con el resultado cuando ha terminado |
| GET | /v1/conversions/{id}/download | Descarga el resultado tantas veces como necesite hasta que caduque |
| DELETE | /v1/conversions/{id} | Cancela una conversión que aún espera o borra un resultado antes de tiempo |
| GET | /v1/conversions | Sus conversiones, las más recientes primero |
| GET | /v1/formats | Todas las conversiones disponibles |
| GET | /v1/formats/{source} | Formatos de destino de un formato de origen con sus opciones, variantes, límites de tamaño y precios |
| GET | /v1/account | Su plan, créditos restantes y límites |
Envíe el archivo como campo multipart "file" o un enlace público como "url" (lo descargan nuestros servidores). El formato de origen se toma del nombre del archivo; si no lo tiene, envíe "source". Las opciones como la calidad se pueden enviar como campos simples (quality=85) o como options[quality]=85. GET /v1/formats/{source} muestra todos los formatos de destino con sus opciones y límites.
curl -X POST https://api.101convert.com/v1/conversions \
-H "Authorization: Bearer $API_KEY" \
-d "url=https://example.com/report.docx" \
-d "target=pdf"
curl -H "Authorization: Bearer $API_KEY" https://api.101convert.com/v1/formats/jpg
Las conversiones se procesan en una cola. Consulte GET /v1/conversions/{id} hasta que el estado sea succeeded o failed, espere hasta 30 segundos en la propia solicitud con wait=30, o envíe una callback_url y le avisaremos. Un resultado se puede descargar repetidamente durante 24 horas.
Una conversión cuesta los mismos créditos que en el sitio web: el peso del tipo de conversión por la franja de tamaño del archivo, y solo si tiene éxito. Los planes de pago gastan sus créditos mensuales. Una cuenta gratuita recibe 100 créditos gratuitos de API cada mes.
| Plan | Créditos al mes | Conversiones a la vez | Solicitudes por minuto |
|---|---|---|---|
| Free | 100 créditos gratuitos de API | 2 | 30 |
| Lite | 1,000 | 5 | 120 |
| Standard | 2,500 | 10 | 300 |
| Pro | 5,000 | 20 | 600 |
Una respuesta 429 incluye la cabecera Retry-After. Las conversiones también cuentan para el límite de su plan de conversiones por 10 minutos, compartido con el sitio web.
Con una callback_url (solo https) le enviamos un POST con la conversión en JSON cuando termina. Compruebe la cabecera X-101convert-Signature: contiene t, una hora Unix, y v1, el HMAC-SHA256 de "t.body" hecho con el secreto de webhooks de la página de su cuenta. Rechace las marcas de tiempo antiguas para evitar reenvíos. Las entregas fallidas se reintentan durante aproximadamente hora y media.
// PHP
[$t, $v1] = array_map(fn ($p) => explode('=', $p, 2)[1],
explode(',', $_SERVER['HTTP_X_101CONVERT_SIGNATURE']));
$body = file_get_contents('php://input');
$valid = abs(time() - (int) $t) < 300
&& hash_equals(hash_hmac('sha256', "$t.$body", $webhookSecret), $v1);
// Node.js
const [t, v1] = req.headers['x-101convert-signature'].split(',').map(p => p.split('=')[1]);
const expected = crypto.createHmac('sha256', webhookSecret).update(`${t}.${rawBody}`).digest('hex');
const valid = Math.abs(Date.now() / 1000 - t) < 300
&& crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
Envíe una cabecera Idempotency-Key con un valor único propio. Si la solicitud se repite, por ejemplo tras un tiempo de espera agotado, recibirá la conversión original en lugar de una nueva y pagará una sola vez.
curl -X POST https://api.101convert.com/v1/conversions \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: invoice-2026-0042" \
-F "file=@invoice.docx" -F "target=pdf"
Todos los errores tienen la misma forma. Decida según code, que nunca cambia; message es para personas y sigue la cabecera Accept-Language.
{
"error": {
"code": "file_too_large",
"message": "…",
"details": { "max_upload_mb": 60 }
}
}
| Código | HTTP | Significado |
|---|---|---|
| unauthenticated | 401 | Falta la clave de API o no es válida. Envíela como "Authorization: Bearer <clave>". |
| forbidden | 403 | Esta clave de API no tiene permiso para hacer eso. |
| validation_failed | 422 | Faltan algunos parámetros de la solicitud o no son válidos. |
| unsupported_conversion | 422 | La conversión de A a B no está disponible. |
| file_too_large | 413 | Archivo demasiado grande. Máximo N MB. |
| insufficient_credits | 402 | Créditos insuficientes: esta conversión cuesta N y su saldo es N. |
| free_quota_exhausted | 402 | Se agotó la asignación mensual gratuita de la API (quedan N de N créditos, esta conversión cuesta N). Pase a un plan de pago para continuar. |
| rate_limited | 429 | Demasiadas solicitudes. Espere el tiempo indicado en la cabecera Retry-After y vuelva a intentarlo. |
| concurrency_limit | 429 | Demasiadas conversiones en curso (su plan permite N a la vez). Espere a que terminen algunas. |
| idempotency_conflict | 409 | Esta Idempotency-Key ya se usó para una solicitud diferente. |
| not_ready | 409 | La conversión no terminó correctamente, así que no hay nada que descargar. |
| expired | 410 | El resultado caducó y se eliminó. Vuelva a convertir el archivo. |
| api_disabled | 503 | La API no está disponible temporalmente. Vuelva a intentarlo más tarde. |
# Python
import requests, time
API = "https://api.101convert.com/v1"
headers = {"Authorization": f"Bearer {API_KEY}"}
with open("interview.mp3", "rb") as f:
c = requests.post(f"{API}/conversions", headers=headers,
files={"file": f}, data={"target": "docx"}).json()
while c["status"] not in ("succeeded", "failed"):
time.sleep(5)
c = requests.get(c["links"]["self"], headers=headers).json()
if c["status"] == "succeeded":
open("interview.docx", "wb").write(
requests.get(c["result"]["download_url"], headers=headers).content)
// PHP (Laravel)
$c = Http::withToken($apiKey)
->attach('file', fopen('slides.pptx', 'r'), 'slides.pptx')
->post('https://api.101convert.com/v1/conversions', ['target' => 'pdf', 'wait' => 30])
->json();
if ($c['status'] === 'succeeded') {
file_put_contents('slides.pdf', Http::withToken($apiKey)->get($c['result']['download_url'])->body());
}
// JavaScript (Node 18+)
const form = new FormData();
form.append('file', new Blob([await fs.promises.readFile('scan.png')]), 'scan.png');
form.append('target', 'pdf');
form.append('callback_url', 'https://example.com/hooks/101convert');
const res = await fetch('https://api.101convert.com/v1/conversions', {
method: 'POST',
headers: { Authorization: `Bearer ${apiKey}` },
body: form,
});
const conversion = await res.json(); // status "queued"; the webhook follows
Comprobando que eres una persona…