API de traducción de imágenes: envía una imagen y recibe una imagen traducida
La API de TranslateMyImage traduce el texto que hay dentro de una imagen y devuelve una imagen nueva, no una lista de cadenas. Envías una imagen y un idioma de destino a un único endpoint; la respuesta JSON contiene la URL de la imagen traducida, generada para conservar el diseño original. Esta página explica qué hace la API, muestra ejemplos de solicitudes en curl, Python y Node.js, cómo gestionar los errores y cuándo tiene más sentido montar tu propio pipeline de OCR. La referencia completa está en la documentación de la API.
En resumen
- Un solo endpoint:
POST https://translatemyimage.com/api/translatecon una cabeceraX-API-Keyy un cuerpo multipart que contiene la imagen ytarget_lang. - Una solicitud = una imagen a un idioma = un crédito cuando se completa. Idiomas de destino: en, fr, es, de, it, pt, ja, ko, zh.
- El acceso a la API empieza con el plan Pro (Pro, Premium o Enterprise). Revisa las imágenes generadas antes de publicarlas.
Campos de la solicitud
El cuerpo es multipart/form-data, algo que tu cliente HTTP configura por ti.
| Campo | Obligatorio | Valores aceptados |
|---|---|---|
file | Sí | Una imagen JPG, PNG o WEBP, de hasta 10 MB y 25 megapíxeles |
target_lang | Sí | en, fr, es, de, it, pt, ja, ko o zh |
source_lang | No | Uno de los nueve códigos anteriores; omítelo o envía auto para la detección automática |
quality | No | basic (por defecto) o ultra |
business_type | No | default, marketing, edition (el modo Manga / cómics) o technical documentation |
custom_prompt | No | Instrucciones para el modelo, hasta 1.000 caracteres (plan Pro y superiores) |
Respuesta
Una llamada correcta devuelve esta estructura (ejemplo de la documentación):
{
"success": true,
"translation": {
"id": "clxb1234567890",
"originalUrl": "https://storage.com/original.jpg",
"translatedUrl": "https://storage.com/translated.jpg",
"sourceLang": "fr",
"targetLang": "en",
"status": "completed",
"createdAt": "2026-09-21T15:27:39.000Z",
"metadata": { "quality": "basic", "model": "muse-image" }
}
}
sourceLang es null cuando omites source_lang o envías auto. Los errores devuelven JSON con success: false, un mensaje en error y, una vez aceptada la clave, un code estable como insufficient_credits.
Inicio rápido
Crea una clave en la página API Keys del panel. Solo se muestra una vez, así que guárdala enseguida en una variable de entorno o en un gestor de secretos.
curl
curl -X POST https://translatemyimage.com/api/translate \
-H "X-API-Key: $TMI_API_KEY" \
-F "[email protected]" \
-F "target_lang=es" \
-F "source_lang=auto" \
-F "business_type=marketing"
Python (requests), con reintentos cuando el servicio de imágenes alcanza su límite de solicitudes:
import os
import time
import requests
API_URL = "https://translatemyimage.com/api/translate"
API_KEY = os.environ["TMI_API_KEY"]
def translate_image(path, target_lang, business_type="default", max_attempts=5):
for attempt in range(max_attempts):
with open(path, "rb") as image:
response = requests.post(
API_URL,
headers={"X-API-Key": API_KEY},
files={"file": image},
data={
"target_lang": target_lang,
"source_lang": "auto",
"business_type": business_type,
},
timeout=900, # la generación puede tardar minutos: deja un margen amplio
)
if response.status_code == 429:
time.sleep(2 ** attempt) # espera exponencial y nuevo intento
continue
payload = response.json()
if response.status_code != 200 or not payload.get("success"):
raise RuntimeError(f"{response.status_code}: {payload.get('error')}")
return payload["translation"]
raise RuntimeError(f"Still rate limited after {max_attempts} attempts")
for lang in ["es", "fr", "de"]:
result = translate_image("product-front.jpg", lang, "marketing")
print(lang, result["translatedUrl"])
Node.js (versión 18 o posterior, como módulo ES, con fetch y FormData integrados):
import { readFile } from "node:fs/promises";
const form = new FormData();
const image = new Blob([await readFile("product-front.jpg")], { type: "image/jpeg" });
form.append("file", image, "product-front.jpg");
form.append("target_lang", "ja");
const response = await fetch("https://translatemyimage.com/api/translate", {
method: "POST",
headers: { "X-API-Key": process.env.TMI_API_KEY },
body: form,
});
const payload = await response.json();
if (!response.ok) throw new Error(`${response.status}: ${payload.error}`);
console.log(payload.translation.translatedUrl);
Un target_lang por solicitud: para traducir una imagen a cinco idiomas, envía cinco solicitudes.
Gestiona cada código de estado
| Estado | Significado (según la documentación) | Qué debe hacer tu código |
|---|---|---|
| 200 | Traducción completada; se consume un crédito | Descargar y guardar la imagen traducida |
| 400 | Entrada no válida, formato no compatible o archivo ausente | No reintentar. Validar tipo, tamaño (10 MB), resolución (25 MP) y código de idioma antes de enviar |
| 401 | Clave API ausente, no válida o revocada | No reintentar. Revisar la clave y cómo se carga |
| 403 | La cuenta propietaria de la clave no tiene el plan Pro o uno superior, necesario para acceder a la API | No reintentar. Revisar el plan de la cuenta que creó la clave |
| 429 | El servicio de imágenes ha alcanzado su límite de solicitudes | Reintentar más tarde con espera exponencial |
| 500 | El procesamiento falló | Mirar primero code: insufficient_credits significa que la cuenta necesita créditos, así que reintentar no servirá. Si no, reintentar una o dos veces y después registrar el archivo para tratarlo a mano |
La documentación describe estos seis estados. El endpoint también puede devolver otros, por ejemplo 422 cuando no se ha podido generar ninguna imagen (code: generation_failed) o 503 cuando el servicio de imágenes no está disponible (service_unavailable), así que basa tu lógica en code y no solo en el estado.
¿Montarlo tú mismo o llamar a una API de imagen a imagen?
En lugar de una API de imagen a imagen, puedes montar un pipeline: un servicio de OCR para localizar el texto (Google Cloud Vision, por ejemplo, devuelve el texto extraído con el cuadro delimitador de cada palabra, según su documentación de OCR), una API de traducción de texto y, después, código que borre el texto original y componga la traducción en los mismos cuadros con una fuente similar.
| OCR + traducción de texto + tu propio renderizado | API de TranslateMyImage | |
|---|---|---|
| Qué obtienes | Cadenas de texto con coordenadas y, después, lo que tú renderices | La URL de una imagen traducida terminada |
| Control | Total: fuentes, glosarios obligatorios, capas editables | Modo (business_type) y custom_prompt |
| Esfuerzo de desarrollo | Varios servicios más código de renderizado que construir y mantener | Una solicitud HTTP por imagen e idioma |
| Idiomas de destino | Los que admita tu servicio de traducción | 9 |
| Texto traducido como datos | Sí | No, la API devuelve una imagen |
| Píxeles fuera del texto | Intactos | Se regeneran con la imagen: las cifras, el texto pequeño y los logotipos pueden cambiar |
Móntalo tú mismo cuando necesites el texto traducido como datos (texto alternativo, búsqueda), una terminología impuesta de forma estricta, capas editables, más idiomas o que los píxeles fuera del texto queden idénticos. Llama a la API cuando quieras visuales terminados en unos pocos idiomas y puedas revisarlos antes de usarlos.
Un flujo de trabajo para producción
- Valida en local antes de enviar: tipo de archivo, 10 MB, 25 megapíxeles, un
target_langadmitido. - Pon en cola una tarea por imagen e idioma, y espacia los reintentos ante un 429.
- Copia el resultado en tu propio almacenamiento o DAM con el ID de origen, el idioma de destino,
translation.idycreatedAt. Ni la documentación ni la política de privacidad garantizan cuánto tiempo sigue disponibletranslatedUrl, así que no lo uses como alojamiento permanente. Es un enlace de almacenamiento sin firmar: trátalo como público. - Marca cada resultado como «pendiente de revisión». Una persona que lea el idioma de destino revisa primero precios, especificaciones y textos legales, y después los titulares. La página de traducción por lotes incluye una tabla de revisión por riesgo que puedes reutilizar.
- Publica solo imágenes revisadas, por ejemplo en las imágenes de tus fichas de Amazon.
Antes de escribir código, prueba unas cuantas imágenes representativas en el traductor web con el modo que piensas usar. Para trabajos puntuales sin código, la traducción por lotes del panel es más sencilla: hasta 10 imágenes y 50 imágenes traducidas por lote.
Planes y créditos
El acceso a la API está incluido a partir del plan Pro: Pro incluye 100 créditos al mes y Premium, 300 (precios). Cada traducción completada consume un crédito. Los paquetes de pago por uso añaden 1 crédito por 2 $, 30 por 10 $ o 100 por 20 $; por sí solos no dan acceso a la API. Todos los planes con acceso a la API incluyen también la calidad Ultra y custom_prompt.
Lee la documentación de la API
Endpoint, cabeceras, parámetros, códigos de estado y de error, un ejemplo de respuesta y llamadas en cURL, Python y Node.js.
Preguntas frecuentes
¿Hay alguna API que traduzca el texto de una imagen?
Sí. La API de TranslateMyImage recibe una imagen y un idioma de destino y devuelve la URL de una imagen nueva con el texto traducido, generada para conservar el diseño original. Con una API de traducción de texto, primero tendrías que extraer el texto de la imagen con OCR y después volver a dibujar la traducción por tu cuenta.
¿La API devuelve el texto traducido?
No. La respuesta contiene el ID de la traducción, las URL de la imagen original y de la traducida, los idiomas, un estado, una marca de tiempo y metadatos. Si necesitas el texto traducido en sí, para el texto alternativo o para búsquedas, pasa la imagen traducida por un servicio de OCR.
¿Puedo traducir una imagen a varios idiomas en una sola solicitud?
No. Cada solicitud lleva un único target_lang. Para obtener cinco idiomas, envía cinco solicitudes con el mismo archivo; cada traducción completada consume un crédito.
¿Cuánto cuesta la API de traducción de imágenes?
Cada traducción completada consume un crédito. El acceso a la API está incluido a partir del plan Pro: Pro cuesta 9,90 $ al mes con 100 créditos y Premium, 19,90 $ al mes con 300 créditos. Los paquetes de pago por uso añaden créditos (1 por 2 $, 30 por 10 $ o 100 por 20 $), pero por sí solos no dan acceso a la API.
¿Hay un SDK para Python o JavaScript?
La documentación describe llamadas HTTP sencillas, con ejemplos en cURL, Python (requests) y Node.js (axios). Sirve cualquier cliente HTTP capaz de enviar multipart/form-data con una cabecera personalizada.