API de TransConvert
Convierte imágenes y documentos mediante programación con un único endpoint HTTP sencillo.
curl -X POST \ .../api/v1/convert.php \ -H "Authorization: Bearer ..." \ -F "category=image" \ -F "target=PNG" \ -F "file=@photo.jpg" \ -o converted.png
Guía rápida
De cero a tu primer archivo convertido en tres pasos.
Regístrate (o mejora una cuenta existente) a Basic, Lite, Pro o Team y luego genera una clave desde la página de tu cuenta; puedes volver a consultarla en cualquier momento.
Envía tu archivo mediante POST al endpoint que se indica a continuación como multipart/form-data, con tu clave en la cabecera Authorization y category + target configurados.
Una respuesta 200 son los bytes en bruto del archivo convertido: guarda el cuerpo de la respuesta directamente. Cualquier otra cosa es un error JSON que explica qué salió mal.
Autenticación
Cada solicitud necesita una clave de API, enviada como token Bearer en la cabecera Authorization.
Authorization: Bearer tc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Disponible en los planes Basic, Lite, Pro y Team. Genera una clave desde tu cuenta →
Prueba tu clave
Una forma rápida de confirmar que una clave funciona antes de escribir código de integración real; por sí sola esto no convertirá nada (no hay archivo adjunto), pero un 400 no_file en lugar de un 401 confirma que la clave en sí es válida.
curl -X POST -H "Authorization: Bearer tc_live_your_key_here" -F "category=image" https://transconvert.com/api/v1/convert.php
El endpoint
Un único endpoint gestiona todas las conversiones. Envía una solicitud POST multipart/form-data con tu archivo y los campos que se indican a continuación.
https://transconvert.com/api/v1/convert.php
Parámetros
| Field | Description |
|---|---|
Authorization | Obligatorio. "Bearer tc_live_...". |
category | Obligatorio. "image" o "document"; para comprimir en lugar de convertir, consulta Comprimir más abajo. |
target | Obligatorio. El código del formato de salida, p. ej. "PNG", "DOCX"; consulta Formatos compatibles más abajo. |
file | Obligatorio. El archivo que se va a convertir (subida multipart). |
pdf_mode | Opcional, solo para la categoría image. "pages" (predeterminado, rasteriza cada página) o "extract" (extrae tal cual las imágenes incrustadas); solo es relevante cuando el origen es un PDF. |
pdf_pages | Opcional, solo para la categoría image. "all" (predeterminado) o "first". |
pdf_quality | Opcional, solo para la categoría image. "normal" (predeterminado, 150 DPI) o "high" (300 DPI). |
Conversiones habituales
Una referencia rápida para los pares más populares: el mismo endpoint los gestiona todos, solo cambia la combinación de category/target.
| Source → target | category | target |
|---|---|---|
| PNG → JPG | image | JPG |
| JPG → PNG | image | PNG |
| HEIC → JPG | image | JPG |
| WEBP → PNG | image | PNG |
| JPG → PDF | image | PDF |
| PDF → JPG | image | JPG |
| DOCX → PDF | document | PDF |
| PDF → DOCX | document | DOCX |
| PPTX → PDF | document | PDF |
| XLSX → PDF | document | PDF |
Respuesta
En caso de éxito (200): los bytes en bruto del archivo convertido, con las cabeceras Content-Type y Content-Disposition configuradas para él. En caso de error: un cuerpo JSON con la forma {"error": {"code": "...", "message": "..."}} y un código de estado HTTP correspondiente; consulta Errores más abajo.
| Header | Value |
|---|---|
Content-Type | El tipo MIME real del archivo convertido (p. ej. image/png, application/pdf). |
Content-Disposition | attachment; filename="..." — un nombre de archivo sugerido, igual que en cualquier descarga. |
Content-Length | Tamaño del cuerpo de la respuesta en bytes. |
Comprimir
Reduce el tamaño de un archivo sin cambiar su formato: el mismo formato de entrada y salida. Un par de categorías independiente de la conversión, image-compress y document-compress, cada una con sus propias opciones a continuación.
image-compress
Mismo formato de entrada y salida (JPG/PNG/WEBP/GIF); target_percent indica el tamaño al que debe aproximarse el resultado respecto al original, no un ajuste de calidad fijo.
| Field | Description |
|---|---|
category | Debe ser "image-compress". |
target_percent | Opcional, 1-100 (valor predeterminado 60). Tamaño objetivo como porcentaje aproximado del original: cuanto menor sea el número, mayor será la compresión. |
file | Obligatorio. JPG, PNG, WEBP o GIF. |
curl -X POST \ https://transconvert.com/api/v1/convert.php \ -H "Authorization: Bearer tc_live_your_key_here" \ -F "category=image-compress" \ -F "target_percent=50" \ -F "file=@photo.jpg" \ -o compressed.jpg
document-compress
PDF de entrada, PDF de salida, mediante la recompresión propia de Ghostscript: nunca devuelve un archivo más grande que el subido (si la recompresión no ayuda, se recurre al original).
| Field | Description |
|---|---|
category | Debe ser "document-compress". |
level | Opcional: "low", "medium" (predeterminado), "high" o "none". Una compresión mayor sacrifica más calidad visual, sobre todo en imágenes o escaneos incrustados. |
grayscale | Opcional. "1" para convertir también a escala de grises; omítelo para mantener el color completo. |
file | Obligatorio. Un PDF que no esté abierto ni protegido con contraseña (si lo está, usa primero Desbloquear PDF en el sitio web). |
curl -X POST \ https://transconvert.com/api/v1/convert.php \ -H "Authorization: Bearer tc_live_your_key_here" \ -F "category=document-compress" \ -F "level=high" \ -F "file=@report.pdf" \ -o compressed.pdf
| Header | Value |
|---|---|
X-Original-Size | El tamaño del archivo subido en bytes, antes de la compresión. |
X-Saved-Percent | Aproximadamente cuánto más pequeño es el resultado respecto al original, como porcentaje entero (puede ser 0). |
Vídeo y audio (asíncrono)
Las conversiones de vídeo y audio pueden tardar minutos, demasiado tiempo para mantener abierta una única solicitud síncrona — estas usan un flujo de envío y consulta en lugar del endpoint anterior. Envía un archivo, recibe enseguida un job_id y luego consulta su estado hasta que termine.
Enviar un trabajo
Misma forma de POST multipart que el endpoint principal, en una URL distinta.
https://transconvert.com/api/v1/convert-async.php
| Field | Description |
|---|---|
Authorization | Obligatorio. "Bearer tc_live_...". |
category | «video» o «audio». |
target | Obligatorio — p. ej. «MP4», «MOV», «MP3», «WAV». |
file | Obligatorio. El archivo que se va a convertir (subida multipart). |
webhook_url | Opcional. Una URL http(s) a la que se enviará (POST) el resultado del trabajo al finalizar, en lugar de solo consultar job-status.php. Debe resolver a una dirección pública. |
curl -X POST \ https://transconvert.com/api/v1/convert-async.php \ -H "Authorization: Bearer tc_live_your_key_here" \ -F "category=video" \ -F "target=MP4" \ -F "file=@clip.mov"
Respuesta (202 Accepted)
{ "job_id": "job_242e1555d78d166807aa56502f15d118", "status": "queued" }
Consultar el estado
Consulta esto cada pocos segundos con el job_id que recibiste. «status» es uno de queued, processing, completed o failed.
https://transconvert.com/api/v1/job-status.php?job_id=job_...
{
"job_id": "job_242e1555d78d166807aa56502f15d118",
"status": "completed",
"category": "video",
"target_format": "MP4",
"created_at": "2026-08-26 19:17:47",
"download_url": "/api/v1/job-status.php?job_id=job_...&download=1",
"filename": "clip.mp4"
}
Webhooks (opcional)
Si indicó un webhook_url al enviar la solicitud, enviaremos ese mismo cuerpo JSON una vez que el trabajo termine, con éxito o error, reintentando varias veces si su endpoint no responde. job-status.php sigue funcionando como respaldo de todos modos.
POST your webhook_url { "job_id": "job_242e1555d78d166807aa56502f15d118", "status": "completed", "category": "video", "target_format": "MP4", "created_at": "2026-08-26 19:17:47", "download_url": "https://transconvert.com/api/v1/job-status.php?job_id=job_...&download=1", "filename": "clip.mp4" }
Descargar el resultado
Cuando el estado sea «completed», la respuesta incluye una download_url — la misma URL de estado con &download=1 añadido. Solicitarla transmite entonces los bytes en bruto del archivo convertido, con las mismas cabeceras que cualquier otro endpoint de esta página. El resultado se elimina en el momento en que se descarga, o automáticamente tras un breve período de conservación si nunca se descarga.
scheduleLos resultados de los trabajos se eliminan inmediatamente después de la descarga, o automáticamente tras un breve período de conservación si nunca se descargan — descárgalos cuanto antes.
Ejemplos
La misma solicitud en cuatro lenguajes: elige el que mejor encaje con tu stack. Cada uno convierte un photo.jpg local a PNG y guarda el resultado.
curl -X POST \ https://transconvert.com/api/v1/convert.php \ -H "Authorization: Bearer tc_live_your_key_here" \ -F "category=image" \ -F "target=PNG" \ -F "file=@photo.jpg" \ -o converted.png
<?php $ch = curl_init('https://transconvert.com/api/v1/convert.php'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer tc_live_your_key_here'], CURLOPT_POSTFIELDS => [ 'category' => 'image', 'target' => 'PNG', 'file' => new CURLFile('photo.jpg'), ], ]); $response = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($status === 200) { file_put_contents('converted.png', $response); } else { $error = json_decode($response, true); echo $error['error']['message']; }
const form = new FormData(); form.append('category', 'image'); form.append('target', 'PNG'); form.append('file', new Blob([fs.readFileSync('photo.jpg')]), 'photo.jpg'); const res = await fetch('https://transconvert.com/api/v1/convert.php', { method: 'POST', headers: { Authorization: 'Bearer tc_live_your_key_here' }, body: form, }); if (res.ok) { fs.writeFileSync('converted.png', Buffer.from(await res.arrayBuffer())); } else { const { error } = await res.json(); console.error(error.message); }
import requests with open('photo.jpg', 'rb') as f: response = requests.post( 'https://transconvert.com/api/v1/convert.php', headers={'Authorization': 'Bearer tc_live_your_key_here'}, data={'category': 'image', 'target': 'PNG'}, files={'file': f}, ) if response.status_code == 200: with open('converted.png', 'wb') as out: out.write(response.content) else: print(response.json()['error']['message'])
# gem install multipart-post require 'net/http' require 'net/http/post/multipart' url = URI('https://transconvert.com/api/v1/convert.php') File.open('photo.jpg') do |file| req = Net::HTTP::Post::Multipart.new url, 'category' => 'image', 'target' => 'PNG', 'file' => UploadIO.new(file, 'image/jpeg', 'photo.jpg') req['Authorization'] = 'Bearer tc_live_your_key_here' res = Net::HTTP.start(url.host, url.port, use_ssl: true) do |http| http.request(req) end if res.code == '200' File.write('converted.png', res.body) else puts JSON.parse(res.body)['error']['message'] end end
// Gradle: implementation("com.squareup.okhttp3:okhttp:4.+") OkHttpClient client = new OkHttpClient(); RequestBody body = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("category", "image") .addFormDataPart("target", "PNG") .addFormDataPart("file", "photo.jpg", RequestBody.create(new File("photo.jpg"), MediaType.parse("image/jpeg"))) .build(); Request request = new Request.Builder() .url("https://transconvert.com/api/v1/convert.php") .header("Authorization", "Bearer tc_live_your_key_here") .post(body) .build(); try (Response response = client.newCall(request).execute()) { if (response.isSuccessful()) { Files.write(Paths.get("converted.png"), response.body().bytes()); } else { System.err.println(response.body().string()); } }
Errores
Cada error devuelve un JSON con un "code" sobre el que tu código puede ramificarse, además de un "message" legible por humanos. Algunos errores incluyen campos adicionales (quota_exceeded incluye, por ejemplo, "limit" y "used").
{
"error": {
"code": "quota_exceeded",
"message": "Monthly API allowance of 5000 conversion-minutes reached.",
"limit": 5000,
"used": 5000
}
}
| Status & code | When it happens |
|---|---|
401 missing_key | No se envió ninguna cabecera Authorization. |
401 invalid_key | La clave no existe, o ha sido revocada. |
403 account_suspended | La cuenta propietaria de esta clave está suspendida. |
403 plan_required | La cuenta está en el plan Free: el acceso a la API requiere Basic, Lite, Pro o Team. |
400 invalid_category | "category" no era "image" ni "document". |
400 missing_target | "target" estaba vacío. |
400 no_file | No se envió ningún archivo, o la subida falló; el campo debe llamarse "file". |
413 file_too_large | El archivo supera el tamaño máximo de subida permitido por tu plan. |
429 quota_exceeded | Se agotó la asignación mensual de minutos de conversión del plan. Se restablece al inicio del siguiente mes natural. |
429 concurrency_limit | Ya hay demasiadas conversiones en curso a la vez para esta cuenta (se comparte con el sitio web); espera a que termine una y vuelve a intentarlo. |
400/415/422/500/503 conversion_failed | El propio archivo no se pudo convertir; "message" explica el motivo. El código de estado varía según la causa: 400/415/422 significan que el archivo o el destino no funcionarán por más intentos que hagas; 500/503 indican un problema del lado del servidor, y en concreto 503 merece un breve reintento. |
405 method_not_allowed | Método HTTP incorrecto: este endpoint solo acepta POST. |
400 invalid_target | «target» no es un formato de salida compatible para esa categoría. |
404 job_not_found | No existe ningún trabajo con ese id para esta cuenta (también se devuelve para el job_id de otra cuenta — su existencia nunca se revela). |
410 result_gone | El trabajo se completó, pero su resultado ya se ha eliminado (los resultados se eliminan inmediatamente después de la descarga, o automáticamente tras un breve período de conservación). |
500 storage_failed | El servidor no pudo guardar el archivo subido para procesarlo en segundo plano. Puedes reintentarlo sin problema. |
Gestión de errores y reintentos
Ramifica tu lógica según el campo JSON "code", no según el texto de "message" (la redacción puede cambiar con el tiempo, el código no). concurrency_limit merece un breve reintento tras unos segundos (se libera en cuanto termina una de tus conversiones en curso); quota_exceeded no se resolverá por sí solo hasta el mes siguiente, así que no lo reintentes en un bucle. conversion_failed es el único código en el que el estado HTTP sigue importando: un 503 es un problema transitorio del servidor que merece un breve reintento, mientras que 400/415/422/500 significan que esa combinación exacta de archivo/destino no tendrá éxito por más veces que la reenvíes. Comprobar el tamaño de un archivo en el cliente antes de subirlo evita desperdiciar una solicitud en un file_too_large garantizado.
Planes y límites
La API comparte sus límites con el mismo plan que ya usas en el sitio web; no hay nada independiente que configurar.
Basic
bolt2000 minutos de conversión / mes
upload_fileArchivos de hasta 2 GB
sync_alt50 solicitud(es) a la vez
speed30 solicitudes/minuto
Lite
bolt3000 minutos de conversión / mes
upload_fileArchivos de hasta 4 GB
sync_alt100 solicitud(es) a la vez
speed60 solicitudes/minuto
Pro
bolt5000 minutos de conversión / mes
upload_fileArchivos de hasta 10 GB
sync_altSolicitudes ilimitadas a la vez
speed120 solicitudes/minuto
Team
bolt10000 minutos de conversión / mes
upload_fileArchivos de hasta 20 GB
sync_altSolicitudes ilimitadas a la vez
speed240 solicitudes/minuto
tollSe comparte con el fondo mensual de créditos del equipo, si utiliza uno
Cuando se aplica un límite por minuto, cada respuesta incluye las cabeceras X-RateLimit-Limit y X-RateLimit-Remaining; una respuesta 429 también incluye Retry-After (en segundos) — úselas para reducir la velocidad antes de alcanzar el límite, en lugar de reaccionar solo tras un 429.
Formatos compatibles
El mismo motor de conversión que usa el sitio web; nada es exclusivo de la API ni del sitio web.
Aceptados como origen:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, PSD, TIFF, EPS, HEIC
Disponibles como destino:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, ICO, PSD, TIFF, EPS
Aceptados como origen:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS, HTML
Disponibles como destino:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS
Origen y destino (mismo formato de entrada y salida):
JPG, PNG, WEBP, GIF
Origen y destino (mismo formato de entrada y salida):
Origen y destino (mismo formato de entrada y salida):
MP4, MOV, AVI, MKV, WEBM
Origen y destino (mismo formato de entrada y salida):
MP3, WAV, OGG, AAC, FLAC, M4A, WMA, OPUS, AIFF, AMR, AU, CAF, AC3, DTS, GSM, IRCAM, MP2, TTA, VOC, W64, WV, SPX, RM
infoEl vídeo y el audio (tanto la conversión como la compresión) están disponibles solo en el sitio web por ahora: una llamada HTTP síncrona no encaja bien con una tarea que puede tardar varios minutos.
Preguntas frecuentes
Todavía no: esas conversiones pueden tardar varios minutos, lo que no encaja bien con una única solicitud HTTP síncrona. Están disponibles en el sitio web hoy mismo; el soporte en la API podría llegar si alguna vez existe una versión asíncrona basada en tareas.
El acceso a la API requiere Basic, Lite, Pro o Team. Si la cuenta pasa a Free (por cancelación, o porque una suscripción caduca), las claves existentes dejan de funcionar de inmediato. Vuelven a funcionar automáticamente si la cuenta regresa a un plan de pago; no es necesario generar una nueva.
Al inicio de cada mes natural, no en tu fecha de facturación.
Por ahora no: cada solicitud cuenta contra tu asignación mensual real. Usa archivos pequeños mientras integras la API para no agotarla.
Hasta el límite de concurrencia de tu plan (consulta Planes y límites más arriba); se comparte con cualquier conversión que estés ejecutando al mismo tiempo en el sitio web, no es una asignación exclusiva de la API.
Para document-compress, sí: nunca devuelve un PDF más grande que el subido; si la recompresión de Ghostscript no ayudó, recibes el original sin cambios (X-Saved-Percent mostrará 0). Para image-compress, target_percent es un objetivo al que apunta el codificador, no una garantía estricta: un origen ya muy comprimido puede no reducirse mucho más.
¿Listo para empezar?
Genera una clave y haz tu primera solicitud en menos de un minuto.
Consigue tu clave de API