# 1. exchange your client id and secret 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 the video - file, or a YouTube, Drive, S3, Vimeo or direct link
curl -X POST https://api.rask.ai/api/library/v1/media/link \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"link": "https://youtu.be/...", "name": "Q3 launch"}'
# 3. create the project - transcription, translation and dubbing start
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"es-mx\"}"# Poll until merging_done, then collect the files
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
| jq '{status, translated_video, voiceover, translation_srt_path}'



Envía un archivo de video o audio como datos de formulario multipartes, o publica un enlace de YouTube, Google Drive, S3, Vimeo o cualquier URL directa. Obtendrás un ID de medios y los metadatos del archivo antes de gastar nada.
Pasa el ID de medios como video_id y un idioma de destino. Opcionalmente, adjunta tu propia transcripción o un glosario. El procesamiento comienza de inmediato.
Consulta el estado hasta que llegue a merging_done; luego descarga el video con doblaje, las pistas de audio, los archivos de subtítulos y la transcripción.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
async def main():
# the client exchanges your credentials for tokens and refreshes them
client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
media = await client.create_media_link(data=schemas.MediaCreateLink(link="https://youtu.be/..."))
while media.status is enums.MediaStatus.PROCESSING:
await asyncio.sleep(5)
media = await client.get_media(media_id=media.id)
job = await client.create_project(data=schemas.ProjectCreate(video_id=media.id, dst_lang="es-mx"))
while job.status is not enums.ProjectStatus.MERGING_DONE:
await asyncio.sleep(10)
job = await client.get_project(project_id=job.id)
print(job.translated_video, job.translation_srt_path, job.translation_vtt_path)
asyncio.run(main())import 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}"}
with open("launch.mp4", "rb") as f:
media = requests.post(f"{API}/api/library/v1/media", headers=h,
params={"kind": "video"}, files={"data": f}).json()
while media["status"] == "processing":
time.sleep(5)
media = requests.get(f"{API}/api/library/v1/media/{media['id']}", headers=h).json()
pid = requests.post(f"{API}/v2/projects", headers=h,
json={"video_id": media["id"], "dst_lang": "de-de"}).json()["id"]
while (p := requests.get(f"{API}/v2/projects/{pid}", headers=h).json())["status"] != "merging_done":
time.sleep(10)
for field in ("translated_video", "translated_audio", "translation_srt_path"):
print(field, p[field]) # presigned links, valid for one hour// no dependencies, Node 18+ global fetch
const API = 'https://api.rask.ai';
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
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 call = (method, path, body) => fetch(API + path, { method, headers: h, body: body && JSON.stringify(body) }).then((r) => r.json());
let media = await call('POST', '/api/library/v1/media/link', { link: 'https://youtu.be/...' });
while (media.status === 'processing') { await sleep(5000); media = await call('GET', `/api/library/v1/media/${media.id}`); }
let p = await call('POST', '/v2/projects', { video_id: media.id, dst_lang: 'ja-jp' });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
const { translated_video, voiceover, translation_vtt_path } = p;
console.log({ translated_video, voiceover, translation_vtt_path });# 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" -H "Content-Type: application/json" \
-d '{"link": "https://youtu.be/..."}' | jq -r .id)
# 3. create the project once the media status is ready
ID=$(curl -s -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"pt-br\"}" | jq -r .id)
# 4. wait for merging_done, then read the links
until [ "$(curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" | jq -r .status)" = merging_done ]; do
sleep 10
done
curl -s https://api.rask.ai/v2/projects/$ID -H "Authorization: Bearer $TOKEN" \
| jq '{translated_video, translated_audio, translation_srt_path}'<?php
use GuzzleHttp\Client;
$http = new Client(['base_uri' => 'https://api.rask.ai']);
$json = fn($r) => json_decode($r->getBody(), true);
$auth = $json((new Client)->post('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token',
['auth' => [$clientId, $clientSecret], 'form_params' => ['grant_type' => 'client_credentials']]));
$h = ['Authorization' => 'Bearer ' . $auth['access_token']];
$media = $json($http->post('/api/library/v1/media/link', ['headers' => $h, 'json' => [
'link' => 'https://youtu.be/...']]));
while ($media['status'] === 'processing') {
sleep(5);
$media = $json($http->get("/api/library/v1/media/{$media['id']}", ['headers' => $h]));
}
$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
'video_id' => $media['id'], 'dst_lang' => 'fr-fr']]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
echo $p['translated_video'], PHP_EOL, $p['translation_srt_path'], PHP_EOL; 0s created
11s transcription_started
87s translation_started
99s voiceover_started
154s merging_started
165s merging_done

es-mx y es-es por igual. El registro del proyecto glossary_version, para que las modificaciones posteriores nunca alteren en silencio el trabajo ya terminado.La API de Rask AI es una API REST para la localización de video. Transcribe la voz de un video, la traduce, la dobla con voces AI o clonación de voz, añade sincronización labial opcional y devuelve subtítulos, pistas de audio y la transcripción, todo desde un mismo proyecto.
Doblaje con IA, traducción de video, localización de video, clonación de voz, sincronización labial, texto a voz para video, voz a texto, transcripción de video y subtítulos. Comparten una sola autenticación, un único objeto de proyecto y una bolsa de minutos compartida; además, cada una cuenta con su propia página con detalles y código.
El acceso a la API está disponible en los planes Creator Pro, Business y Enterprise, con funciones definidas según tu plan. Puedes generar tu ID de cliente y tu clave secreta en la app y empezar a hacer llamadas de inmediato. Las condiciones para empresas, los precios por volumen y la cobertura de idiomas personalizados se gestionan a través de nuestro equipo.
La API utiliza las credenciales de cliente de OAuth 2.0. Canjea tu ID de cliente y tu clave secreta por un token de acceso en el endpoint de tokens, y luego envíalo como un token Bearer en cada solicitud. Un token es válido por una hora; guárdalo en caché y solicita uno nuevo cuando expire.
Sí. El SDK oficial de Python está en GitHub en braskai/rask-sdk y se encarga de gestionar los tokens por ti. La API REST funciona con cualquier lenguaje; esta página incluye ejemplos completos en Python, Node, cURL y PHP.
Audio de origen en 75 idiomas, con detección automática de idioma, y más de 135 opciones de idiomas y regiones de destino, como es-mx o pt-br. La clonación de voz está disponible en los idiomas compatibles; los ajustes preestablecidos de voz AI cubren el resto.
El uso se cobra por minuto de video, redondeado hacia arriba al siguiente minuto completo, utilizando la misma bolsa de minutos de la aplicación de Rask. Los minutos adicionales cuestan $3 por minuto en los planes estándar elegibles, y los precios para empresas se adaptan a tu contrato. La regeneración se cobra según los segmentos modificados con un mínimo de un minuto por ejecución, y la sincronización labial se cobra por separado para cada generación de video completo.
No. No hay límites de velocidad, cuotas de concurrencia ni restricciones por clave, por lo que puedes procesar un catálogo completo y todos los idiomas de destino en paralelo.
Poll GET /v2/projects/{id} for the status of each project; the statuses are documented, so you can show real progress. Webhook delivery is part of enterprise onboarding.
Video en MP4, MOV, MKV, AVI, WebM, M4V y 3GP, audio en MP3, WAV, FLAC y M4A, o un enlace de YouTube, Google Drive, S3, Vimeo o una URL directa.
Sí. Sube los archivos SRT de origen y traducidos, o envía segmentos de texto, y pasa el identificador transcript_id al crear el proyecto. A continuación, Rask pone voz a tu texto aprobado.
No. La API procesa archivos de video y audio grabados y entrega los resultados como archivos. Para agentes de voz en vivo o subtítulos en tiempo real, una API de voz en streaming es una mejor opción.
Brask Inc cuenta con la certificación SOC 2 Type II y opera bajo las normativas del RGPD, con un estado de control en vivo en su Centro de Confianza. Los clones de voz personalizados se crean con el consentimiento de la persona que habla.