# 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 multipart, o publica un enlace de YouTube, Google Drive, S3, Vimeo o cualquier URL directa. Obtendrás un ID de contenido multimedia y los metadatos del archivo antes de gastar nada.
Envía el identificador del video como video_id y un idioma de destino. Opcionalmente, puedes adjuntar tu propia transcripción o un glosario. El procesamiento comienza de inmediato.
Consulta el estado hasta que llegue a merging_done; después, descarga el video doblado, 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 proyecto registra glossary_version, por lo que las ediciones posteriores nunca modifican en segundo plano el trabajo ya terminado.La API de Rask AI es una API REST para la localización de videos. Transcribe las voces de un video, las traduce, las dobla con voces de IA o con clonación de voz, agrega sincronización de labios opcional y devuelve subtítulos, pistas de audio y la transcripción, todo desde un mismo proyecto.
Doblaje con IA, traducción de videos, localización de videos, clonación de voz, sincronización de labios, texto a voz para videos, voz a texto, transcripción de videos y subtítulos. Comparten una misma autenticación, un único objeto de proyecto y una misma bolsa de minutos, y 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, y sus funciones dependen del plan que elijas. Puedes generar tu ID de cliente y tu clave secreta en la aplicación para empezar a hacer llamadas de inmediato. Los términos para empresas, los precios por volumen y la cobertura de idiomas personalizados se gestionan directamente con nuestro equipo.
La API utiliza las credenciales de cliente de OAuth 2.0. Intercambia tu ID de cliente y tu clave secreta por un token de acceso en el punto de acceso de tokens y, luego, envíalo como un token Bearer en cada solicitud. El 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 de programación; esta página incluye ejemplos completos en Python, Node, cURL y PHP.
Audio original en 75 idiomas, con detección automática de idioma, y más de 135 opciones de idiomas y regiones como destino, como es-mx o pt-br. La clonación de voz está disponible en los idiomas compatibles con esta función; las voces predefinidas de IA cubren el resto.
El uso se cobra por minuto de video (se redondea hacia arriba al minuto completo más cercano) y se descuenta de 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. Las regeneraciones se cobran según los segmentos modificados, con un mínimo de un minuto por ejecución, y la sincronización de labios se factura por separado en cada generación de video completo.
No. No hay límites de velocidad, ni cuotas de simultaneidad, 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.
Videos en MP4, MOV, MKV, AVI, WebM, M4V y 3GP; audios en MP3, WAV, FLAC y M4A; o un enlace de YouTube, Google Drive, S3, Vimeo o una URL directa.
Sí. Sube archivos SRT originales y traducidos, o envía segmentos de texto, y pasa el parámetro transcript_id al crear el proyecto. A continuación, Rask pondrá voz a tu texto aprobado.
No. La API procesa archivos de video y audio grabados y entrega los resultados como archivos. Si necesitas agentes de voz en vivo o subtítulos en tiempo real, es mejor opción una API de voz en streaming.
Brask Inc cuenta con la certificación SOC 2 Tipo II y opera bajo el RGPD, con un estado de control en vivo en su Centro de Confianza. Las clonaciones de voz personalizadas se crean con el consentimiento de quien habla.