# 1. exchange client credentials for a token (valid 1 hour)
curl -X POST https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token \
-u "$CLIENT_ID:$CLIENT_SECRET" \
-d "grant_type=client_credentials"# 2. upload by link - YouTube, Drive, S3, Vimeo or direct URL
curl -X POST https://api.rask.ai/api/library/v1/media/link \
-H "Authorization: Bearer $TOKEN" \
-d '{"link": "https://youtu.be/...", "name": "Q3 launch"}'# 3. create the dubbing project - this starts the dub
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" \
-d '{
"video_id": "b8f7835d-e8c9-4ff4-8e34-5c336d818319",
"dst_lang": "es-mx",
"name": "Q3 launch"
}'# Poll the project until status is merging_done.while :; do
curl -s https://api.rask.ai/v2/projects/$ID \
-H "Authorization: Bearer $TOKEN" | jq .status
sleep 10done



Envía un archivo como datos de formulario multipart o publica un enlace. Las fuentes de enlaces compatibles son YouTube, Google Drive, S3, Vimeo y cualquier URL de descarga directa. Devuelve un ID de medios y metadatos técnicos completos antes de que gastes nada.
Pasa el ID de medios como video_id y un idioma de destino. Opcionalmente, adjunta tu propia transcripción o un glosario. El doblaje comienza de inmediato.
Lee status hasta que llegue a merging_done y, luego, descarga el video doblado, las pistas de audio y los archivos de subtítulos.
# pip install git+https://github.com/braskai/rask-sdk
import asyncio
from rask_sdk import RaskSDKClient
async def main():
client = RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
media = await client.upload_media_link(link="https://youtu.be/...")
project = await client.create_project(video_id=media.id, dst_lang="es-mx")
while project.status != "merging_done":
await asyncio.sleep(10)
project = await client.get_project(project.id)
print(project.translated_video, project.translation_srt_path)
asyncio.run(main())import os, time, requests
AUTH = "https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token"
API = "https://api.rask.ai"
token = requests.post(AUTH, auth=(CLIENT_ID, CLIENT_SECRET),
data={"grant_type": "client_credentials"}).json()["access_token"]
h = {"Authorization": f"Bearer {token}"}
media = requests.post(f"{API}/api/library/v1/media/link", headers=h,
json={"link": "https://youtu.be/..."}).json()
project = requests.post(f"{API}/v2/projects", headers=h,
json={"video_id": media["id"], "dst_lang": "es-mx"}).json()
while project["status"] != "merging_done":
time.sleep(10)
project = requests.get(f"{API}/v2/projects/{project['id']}", headers=h).json()
print(project["translated_video"])// no dependencies, Node 18+ global fetch
const API = 'https://api.rask.ai';
const auth = await fetch('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token', {
method: 'POST',
headers: { Authorization: 'Basic ' + btoa(`${CLIENT_ID}:${CLIENT_SECRET}`) },
body: new URLSearchParams({ grant_type: 'client_credentials' }),
}).then(r => r.json());
const h = { Authorization: `Bearer ${auth.access_token}`, 'Content-Type': 'application/json' };
const media = await fetch(`${API}/api/library/v1/media/link`, {
method: 'POST', headers: h,
body: JSON.stringify({ link: 'https://youtu.be/...' }),
}).then(r => r.json());
let project = await fetch(`${API}/v2/projects`, {
method: 'POST', headers: h,
body: JSON.stringify({ video_id: media.id, dst_lang: 'es-mx' }),
}).then(r => r.json());
while (project.status !== 'merging_done') {
await new Promise(r => setTimeout(r, 10000));
project = await fetch(`${API}/v2/projects/${project.id}`, { headers: h }).then(r => r.json());
}
console.log(project.translated_video);# 1. token (valid 1 hour - cache and reuse it)
TOKEN=$(curl -s -X POST https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token \
-u "$CLIENT_ID:$CLIENT_SECRET" \
-d "grant_type=client_credentials" | jq -r .access_token)
# 2. upload by link
VIDEO_ID=$(curl -s -X POST https://api.rask.ai/api/library/v1/media/link \
-H "Authorization: Bearer $TOKEN" \
-d '{"link": "https://youtu.be/..."}' | jq -r .id)
# 3. create the dubbing project
ID=$(curl -s -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" \
-d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"es-mx\"}" | jq -r .id)
# 4. poll, then download
while [ "$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq -r .status)" != "merging_done" ]; do
sleep 10
done<?php
use GuzzleHttp\Client;
$http = new Client(['base_uri' => 'https://api.rask.ai']);
$auth = json_decode((new Client)->post(
'https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token',
['auth' => [$clientId, $clientSecret],
'form_params' => ['grant_type' => 'client_credentials']]
)->getBody(), true);
$h = ['Authorization' => 'Bearer ' . $auth['access_token']];
$media = json_decode($http->post('/api/library/v1/media/link',
['headers' => $h, 'json' => ['link' => 'https://youtu.be/...']])->getBody(), true);
$project = json_decode($http->post('/v2/projects',
['headers' => $h, 'json' => ['video_id' => $media['id'], 'dst_lang' => 'es-mx']])->getBody(), true);
while ($project['status'] !== 'merging_done') {
sleep(10);
$project = json_decode($http->get("/v2/projects/{$project['id']}",
['headers' => $h])->getBody(), true);
} 0s created
12s transcription_started
70s translation_started
95s voiceover_started
150s merging_started
170s merging_done

es-mx y es-es por igual. El proyecto registra glossary_version, de modo que las ediciones posteriores nunca modifiquen el trabajo finalizado en segundo plano.El acceso a la API está incluido en los planes de pago. Generas tu ID de cliente y tu clave secreta en la aplicación para empezar a hacer llamadas de inmediato. Los términos empresariales, los precios por volumen y la cobertura de idiomas personalizados se gestionan a través de nuestro equipo.
Credenciales de cliente OAuth 2.0: intercambia tu ID de cliente y tu clave secreta por un token de acceso de corta duración. Los tokens duran una hora, así que guárdalos en caché y reutilízalos.
Asíncrono. La creación de un proyecto responde de inmediato y comienza el doblaje. Consulta GET /v2/projects/{id} periódicamente hasta que el estado sea merging_done. La entrega por webhook está disponible en la incorporación para empresas.
Cada solicitud se acepta tal como se envía. La velocidad depende de la fila de procesamiento, y la prioridad de procesamiento forma parte de los términos para empresas.
Más de 135 idiomas de destino, incluidos español, francés, alemán, portugués, hindi, japonés y coreano, con variantes regionales cuando son importantes (por lo que dst_lang usa es-mx en lugar de es). El idioma de origen se detecta automáticamente o puedes configurarlo tú mismo. La lista completa de códigos de origen y destino está en la documentación de la API. Para otros idiomas que no estén en el catálogo, contacta a nuestro equipo para evaluar la viabilidad y las opciones disponibles.
La clonación de voz instantánea usa las voces de los hablantes de tu video de origen para los idiomas compatibles. Si prefieres una clonación de voz personalizada que puedas reutilizar, créala en la aplicación de Rask con el consentimiento del hablante y asígnala a través de la API. Los resultados dependen del audio original y del idioma y la voz que elijas.
Depende de la duración del video, la cantidad de personas que hablan, el idioma de destino y el estado de la fila. Cada proyecto muestra su avance en cada etapa, desde la transcripción hasta la unión de los archivos, para que puedas mostrar el progreso real a tus usuarios.
Siete formatos de video (MP4, MOV, MKV, AVI, WebM, M4V, 3GP) y cuatro formatos de audio (MP3, WAV, FLAC, M4A). También puedes importar desde YouTube, Google Drive, S3, Vimeo o una URL directa en lugar de subir el archivo.
Los hablantes se detectan y se separan del audio de origen automáticamente, y a cada uno se le asigna su propia voz en el idioma de destino. Puedes cambiar la asignación por hablante o enviar num_speakers al crear el proyecto si ya conoces la cantidad.
Sí. Sube un archivo .srt para crear una transcripción y envía su ID al crear el proyecto. También puedes dejar que la API haga la transcripción y luego editar el guion parte por parte.
Cada proyecto terminado incluye archivos de subtítulos en formato .srt y .vtt junto con las pistas de video y audio, sincronizados con el doblaje.
Hay un SDK de Python asíncrono oficial, publicado en GitHub, con una interfaz estable y compatible con versiones anteriores. Para otros lenguajes, puedes generar un cliente a partir de la especificación OpenAPI publicada. También hay un nodo de n8n para flujos de trabajo sin código.
Solo el contenido que cambiaste. La duración de las partes editadas y nuevas se suma y se redondea hacia arriba al minuto más cercano, por lo que corregir unas pocas líneas cuesta aproximadamente un minuto.