API del traductor de Creator Tools: guía para desarrolladores
Esta guía explica cómo traducir videos y canales de YouTube con el traductor de Creator Tools desde tu propio código. ¿Es tu primera vez con la API? Empieza por la presentación: El traductor de Creator Tools ya está disponible por API.
Resumen
- La traducción se ejecuta como una tarea en segundo plano. Inicias una tarea, recibes un
jobIdy consultas la tarea hasta que termine. - Iniciar una tarea y consultarla usan la misma dirección:
POST https://api.creator-tools.com/info/longterm-job. El camporequestTypedel cuerpo indica qué operación quieres. - Cuando la tarea termina, el título, la descripción y los subtítulos traducidos ya están publicados en YouTube.
- No hay callbacks. Consulta el estado de la tarea cada 5 segundos, igual que hace la aplicación de Creator Tools.
1. POST /info/longterm-job { "requestType": "startTranslationJob", … } → { "jobId": "…", "status": "IN_PROGRESS" }
2. POST /info/longterm-job { "requestType": "getJobById", "jobId": "…" } → { "status": "IN_PROGRESS" }
… espera 5 segundos y repite …
3. POST /info/longterm-job { "requestType": "getJobById", "jobId": "…" } → { "status": "FINISHED", "response": { … } }
Claves que necesitas
Cada solicitud necesita cuatro valores. La clave de la pasarela te la da una sola vez el equipo de soporte. Los otros tres los copias desde el navegador mientras tienes la sesión iniciada en https://app.creator-tools.com; el siguiente capítulo muestra dónde están.
| Valor | Se envía como | Dónde encontrarlo |
|---|---|---|
| Clave de la pasarela | Cabecera x-api-key | Pídesela al equipo de soporte: escribe a info@creator-tools.com o al bot de Creator Tools en Telegram. |
| Clave personal | Campo del cuerpo xApiKey | Herramientas para desarrolladores → Application (aplicación) → Cookies → https://app.creator-tools.com → cookie xApiKey. Es la clave de tu suscripción: las traducciones se descuentan de tu saldo. |
| ID de sesión | Campo del cuerpo sessionId | Herramientas para desarrolladores → Application → Local storage (almacenamiento local) → https://app.creator-tools.com → clave channels |
| ID del canal | Campo del cuerpo channelId | La misma entrada channels |
Todas las solicitudes son POST con Content-Type: application/json. No hacen falta cookies ni la cabecera Authorization.
Mantén tus claves en privado. Tu clave personal y tu ID de sesión funcionan como una contraseña: cualquiera que los tenga puede iniciar traducciones en tu canal y gastar tu saldo. Nunca los pongas en código público ni los compartas en chats.
Cómo encontrar tu ID de sesión y tu ID de canal
Paso 1: inicia sesión y elige el canal
Abre https://app.creator-tools.com, inicia sesión y selecciona en la lista de canales el canal que quieres traducir. Si el canal aún no aparece, añádelo primero con Add channel (añadir canal).
Paso 2: abre el almacenamiento local
Abre las herramientas para desarrolladores (F12 en Windows, ⌥⌘I en Mac) → Application → Local storage → https://app.creator-tools.com → clave channels.
El valor tiene una entrada por cada canal conectado. El nombre de la entrada es el ID del canal, y la entrada contiene el ID de sesión:
{
"UCzOmbH8UyFIVjSAukXAhY5g": { // ← channelId
"sessionId": "f35876a8-1…", // ← sessionId
"channelId": "UCzOmbH8UyFIVjSAukXAhY5g",
"name": "My Channel",
"isSelected": true // ← el canal elegido en la aplicación
},
"UC…another channel…": { … }
}
Si tienes varios canales, usa la entrada con "isSelected": true, o aquella cuyo name coincida con el canal que quieres.
Conviene saber
- El ID del canal es el ID de canal de YouTube que empieza por
UC. El ID de sesión lo crea Creator Tools cuando conectas el canal. - La conexión de un canal dura unos tres meses. Si recibes
403 No credentials for channel, elimina el canal en la aplicación, vuelve a añadirlo y copia el nuevo ID de sesión. - Cerrar sesión en la aplicación termina la sesión, así que el ID de sesión anterior deja de funcionar.
Iniciar una traducción
POST https://api.creator-tools.com/info/longterm-job
Cabeceras: Content-Type: application/json y x-api-key: <gateway key>.
Traduce un video cada vez. Inicia una tarea, consúltala hasta que su estado sea FINISHED o FAILED, y solo entonces inicia el siguiente video. Las tareas en paralelo comparten tu saldo y los límites de YouTube de tu canal, así que pueden cobrarse de forma incorrecta, fallar con 429 o sobrescribir las traducciones unas de otras.
Qué se traduce
- Con
videoId: el título y la descripción del video, y también los subtítulos sicapturesIncludedestrue. - Sin
videoId: el nombre y la descripción del canal.
Campos de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
xApiKey | string | sí | Tu clave personal |
requestType | string | sí | Siempre "startTranslationJob" |
sessionId | string | sí | Tu ID de sesión. Sin él, la respuesta es 400 Missing sessionId. |
channelId | string | sí | Tu ID de canal. Debe pertenecer a la misma sesión; de lo contrario, la respuesta es 403. |
languages | string[] | sí | Códigos de los idiomas de destino (consulta Idiomas y códigos). Los idiomas que el video ya tiene se omiten, salvo que rewrite sea true. |
videoId | string | no | ID del video de YouTube. Omítelo para traducir el canal. |
capturesIncluded | boolean | no | Traducir también los subtítulos |
rewrite | boolean | no | Sobrescribir las traducciones y los subtítulos que ya existen |
saveHashtags | boolean | no | Mantener #hashtags y @mentions tal cual |
excludedFromTranslate | boolean | no | Dejar sin traducir el texto dentro de [[…]] |
useDialects | boolean | no | Traducir por separado las variantes regionales (en-GB, es-MX, …). Si es false, reciben la traducción de su idioma principal. |
tone | string | no | default, emotional, friendly, science u official |
provider | string | no | openai (predeterminado) o gemini. Si uno falla, se prueba el otro y después Google Translate. |
isPoetry | boolean | no | Traducir los subtítulos como una canción o un poema |
aiTranslations | boolean | no | Usar traducción con IA. La aplicación siempre envía true. |
Ejemplo: un video con subtítulos
curl -X POST https://api.creator-tools.com/info/longterm-job \
-H 'Content-Type: application/json' \
-H 'x-api-key: <GATEWAY_KEY>' \
-d '{
"xApiKey": "<PERSONAL_KEY>",
"requestType": "startTranslationJob",
"sessionId": "<SESSION_ID>",
"channelId": "UCxxxxxxxxxxxxxxxxxxxxxx",
"videoId": "dQw4w9WgXcQ",
"languages": ["es", "de", "fr", "pt-BR", "ja"],
"capturesIncluded": true,
"rewrite": false,
"saveHashtags": true,
"excludedFromTranslate": false,
"useDialects": false,
"tone": "default",
"provider": "openai",
"isPoetry": false,
"aiTranslations": true
}'
Respuesta
Una respuesta 200 describe la nueva tarea. Guarda el jobId: lo necesitas para consultar la tarea.
{
"jobId": "3f1c2a0e-7b8d-4c1e-9a55-…",
"jobType": "translate",
"videoId": "dQw4w9WgXcQ",
"channelId": "UCxxxxxxxxxxxxxxxxxxxxxx",
"status": "IN_PROGRESS",
"languages": ["es", "de", "fr", "pt-BR", "ja"],
"startDate": "2026-09-30T10:15:00.000Z"
}
Consultar el estado de la tarea
POST https://api.creator-tools.com/info/longterm-job, con las mismas cabeceras que antes.
{
"xApiKey": "<PERSONAL_KEY>",
"requestType": "getJobById",
"jobId": "3f1c2a0e-7b8d-4c1e-9a55-…"
}
La respuesta 200 es la tarea, o null si no tienes ninguna tarea con ese ID.
{
"jobId": "3f1c2a0e-…",
"jobType": "translate",
"status": "FINISHED",
"startDate": "2026-09-30T10:15:00.000Z",
"finishDate": "2026-09-30T10:16:12.000Z",
"languages": ["es", "de", "fr", "pt-BR", "ja"],
"languagesToTranslateVideo": ["es", "de", "fr", "pt-BR", "ja"],
"languagesToTranslateCaptions": ["es", "de", "fr", "pt-BR", "ja"],
"response": {
"status": "translated",
"captionsTranslated": true,
"metadataLanguagesTranslated": 5,
"captionsLanguageTranslated": 5
}
}
Valores de estado
| Estado | Significado |
|---|---|
WAITING | La tarea está en cola y aún no ha empezado. |
IN_PROGRESS | La tarea está en curso. Sigue consultando. |
FINISHED | Terminada. El resultado está en response. |
FAILED | La tarea se detuvo. reason indica el motivo, por ejemplo no token, No Subscription, Not enough translations are left o freeTrialCheck failed. |
- Con qué frecuencia consultar: cada 5 segundos. La aplicación deja de esperar a los 50 minutos.
- Sin porcentaje de progreso: las tareas de traducción solo informan de su estado.
- Todas tus tareas: envía
"requestType": "getAllJobs"con tuxApiKeypara listar todas las tareas. - Cuánto tiempo se guardan las tareas: una tarea terminada se puede leer durante 60 días.
Errores
Una respuesta de error tiene la forma {"message": "…"}.
| HTTP | Mensaje | Qué hacer |
|---|---|---|
| 400 | Missing sessionId | Añade sessionId a la solicitud. |
| 403 | No credentials for channel | El ID de sesión y el ID del canal no coinciden, o la conexión ha caducado. Vuelve a conectar el canal en la aplicación y copia el nuevo ID de sesión. |
| 403 | No subscription | La clave personal xApiKey es incorrecta. Cópiala de nuevo. |
| 403 | No access | No se pudo comprobar la suscripción. Inténtalo de nuevo más tarde. |
| 403 | Forbidden | Falta la cabecera x-api-key o es incorrecta. |
| 429 | Not enough translations are left | Tu saldo no alcanza para los idiomas elegidos. Recarga el saldo o elige menos idiomas. |
Una tarea puede aceptarse y aun así terminar más tarde como FAILED, por ejemplo cuando el saldo se agota durante la traducción. Comprueba siempre status y reason.
Ejemplo completo en JavaScript
const API = "https://api.creator-tools.com/info/longterm-job";
const GATEWAY_KEY = "<GATEWAY_KEY>";
const xApiKey = "<PERSONAL_KEY>";
const sessionId = "<SESSION_ID>";
const channelId = "UC…";
// Inicia una tarea. Inicia el siguiente video solo cuando esta termine en FINISHED o FAILED.
const job = await post({
xApiKey, requestType: "startTranslationJob", sessionId, channelId,
videoId: "dQw4w9WgXcQ", languages: ["es", "de", "fr"], capturesIncluded: true,
});
// Consulta cada 5 segundos hasta que la tarea termine.
let status;
do {
await new Promise((resolve) => setTimeout(resolve, 5000));
status = await post({ xApiKey, requestType: "getJobById", jobId: job.jobId });
} while (status && status.status !== "FINISHED" && status.status !== "FAILED");
console.log(status.status, status.response ?? status.reason);
async function post(body) {
const res = await fetch(API, {
method: "POST",
headers: { "Content-Type": "application/json", "x-api-key": GATEWAY_KEY },
body: JSON.stringify(body),
});
if (!res.ok) throw new Error((await res.json()).message);
return res.json();
}
Idiomas y códigos
- Envía los códigos en
languagesexactamente como aparecen abajo. Siguen los códigos de YouTube, así que el hebreo esiw, el español de Latinoamérica eses-419y el cantonés esyue. - Canal significa que el código también se puede usar para traducir un canal (una solicitud sin
videoId). Los demás códigos se omiten en los canales. La lista de canales también aceptaen-UK,filynb.
| Código | Idioma | Canal |
|---|---|---|
az | Azerbaiyano | Sí |
sq | Albanés | Sí |
en | Inglés | Sí |
en-GB | Inglés (Reino Unido) | |
en-IN | Inglés (India) | Sí |
en-IE | Inglés (Irlanda) | |
en-CA | Inglés (Canadá) | |
en-US | Inglés (Estados Unidos) | |
en-AU | Inglés (Australia) | |
ar | Árabe | Sí |
hy | Armenio | Sí |
eu | Euskera | Sí |
be | Bielorruso | Sí |
bn | Bengalí | Sí |
my | Birmano | Sí |
bg | Búlgaro | Sí |
bs | Bosnio | Sí |
cy | Galés | |
hu | Húngaro | Sí |
vi | Vietnamita | Sí |
haw | Hawaiano | |
ht | Criollo haitiano | |
gl | Gallego | Sí |
el | Griego | Sí |
ka | Georgiano | Sí |
gu | Guyaratí | Sí |
gd | Gaélico escocés | |
da | Danés | Sí |
zu | Zulú | Sí |
iw | Hebreo | Sí |
yi | Yidis | |
id | Indonesio | Sí |
ga | Irlandés | |
is | Islandés | Sí |
es | Español | Sí |
es-ES | Español (España) | |
es-419 | Español (Latinoamérica) | |
es-MX | Español (México) | Sí |
es-US | Español (Estados Unidos) | Sí |
it | Italiano | Sí |
kk | Kazajo | Sí |
kn | Canarés | Sí |
yue | Cantonés | |
ca | Catalán | Sí |
ky | Kirguís | Sí |
zh | Chino | Sí |
zh-TW | Chino (Taiwán) | |
zh-CN | Chino (China) | |
zh-Hans | Chino (simplificado) | |
zh-HK | Chino (Hong Kong) | Sí |
zh-SG | Chino (Singapur) | |
ko | Coreano | Sí |
co | Corso | |
ku | Kurdo | |
km | Jemer | Sí |
lo | Lao | Sí |
la | Latín | |
lv | Letón | Sí |
lt | Lituano | Sí |
lb | Luxemburgués | |
mk | Macedonio | Sí |
ms | Malayo | Sí |
mn | Mongol | Sí |
de | Alemán | Sí |
de-AT | Alemán (Austria) | |
de-DE | Alemán (Alemania) | |
de-CH | Alemán (Suiza) | |
ne | Nepalí | Sí |
nl | Neerlandés | Sí |
nl-BE | Neerlandés (Bélgica) | |
nl-NL | Neerlandés (Países Bajos) | |
no | Noruego | |
pa | Panyabí | Sí |
fa | Persa | Sí |
fa-AF | Persa (Afganistán) | |
fa-IR | Persa (Irán) | |
pl | Polaco | Sí |
pt | Portugués | Sí |
pt-BR | Portugués (Brasil) | Sí |
pt-PT | Portugués (Portugal) | |
ro | Rumano | Sí |
ru | Ruso | Sí |
sa | Sánscrito | |
sm | Samoano | |
sr | Serbio | Sí |
sk | Eslovaco | Sí |
sl | Esloveno | Sí |
so | Somalí | |
tl | Tagalo (filipino) | |
tg | Tayiko | |
th | Tailandés | Sí |
ta | Tamil | Sí |
te | Telugu | Sí |
tr | Turco | Sí |
uz | Uzbeko | Sí |
uk | Ucraniano | Sí |
ur | Urdu | Sí |
fi | Finés | Sí |
fr | Francés | Sí |
fr-BE | Francés (Bélgica) | |
fr-CA | Francés (Canadá) | Sí |
fr-FR | Francés (Francia) | |
fr-CH | Francés (Suiza) | |
hi | Hindi | Sí |
hr | Croata | Sí |
cs | Checo | Sí |
sv | Sueco | Sí |
eo | Esperanto | |
et | Estonio | Sí |
ja | Japonés | Sí |
jv | Javanés | |
af | Afrikáans | Sí |
ak | Akan | |
am | Amárico | Sí |
as | Asamés | Sí |
ay | Aimara | |
bm | Bambara | |
gn | Guaraní | |
ha | Hausa | |
ig | Igbo | |
ln | Lingala | |
lg | Luganda | |
mg | Malgache | |
ml | Malayalam | Sí |
mt | Maltés | |
mi | Maorí | |
mr | Maratí | Sí |
or | Oriya | Sí |
om | Oromo | |
ps | Pastún | |
st | Sesoto | |
sn | Shona | |
sd | Sindi | |
si | Cingalés | Sí |
su | Sundanés | |
sw | Suajili | Sí |
tt | Tártaro | |
ti | Tigriña | |
ts | Tsonga | |
tk | Turcomano | |
ug | Uigur | |
xh | Xhosa | |
yo | Yoruba |







