# 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}'



Envie um arquivo de vídeo ou áudio como dados de formulário multipart ou publique um link do YouTube, Google Drive, S3, Vimeo ou qualquer URL direta. Você obtém um ID de mídia e os metadados do arquivo antes de gastar qualquer valor.
Passe o ID da mídia como video_id e um idioma de destino. Opcionalmente, anexe sua própria transcrição ou um glossário. O processamento começa imediatamente.
Leia o status até que ele atinja merging_done e, em seguida, baixe o vídeo dublado, as faixas de áudio, os arquivos de legenda e a transcrição.
# 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

pt-br e pt-pt igualmente. Os registros do projeto versao_glossario, garantindo que alterações futuras não modifiquem o trabalho finalizado sem que você perceba.A API da Rask AI é uma API REST para localização de vídeos. Ela transcreve a fala de um vídeo, traduz o conteúdo, dubla com vozes de IA ou clones de voz, adiciona sincronia labial opcional e retorna legendas, faixas de áudio e a transcrição, tudo em um único projeto.
Dublagem por IA, tradução de vídeos, localização de vídeos, clonagem de voz, sincronia labial, texto para fala para vídeos, fala para texto, transcrição de vídeos e legendas. Elas compartilham a mesma autenticação, o mesmo objeto de projeto e o mesmo saldo de minutos, sendo que cada uma possui sua própria página com detalhes e código.
O acesso à API está disponível nos planos Creator Pro, Business e Enterprise, com recursos definidos de acordo com o seu plano. Você gera seu ID de cliente e segredo no aplicativo e pode começar a fazer requisições imediatamente. Termos para empresas, preços por volume e cobertura de idiomas personalizados passam pela nossa equipe.
A API utiliza credenciais de cliente OAuth 2.0. Troque seu ID de cliente e segredo por um token de acesso no endpoint de tokens e, em seguida, envie-o como um token Bearer em cada requisição. O token é válido por uma hora; armazene-o em cache e solicite um novo quando expirar.
Sim. O SDK oficial em Python está no GitHub em braskai/rask-sdk e gerencia os tokens para você. A API REST funciona em qualquer linguagem; esta página contém exemplos completos em Python, Node, cURL e PHP.
Áudio de origem em 75 idiomas, com detecção automática de idioma, e mais de 135 opções de idiomas e regiões como destino (por exemplo, es-mx ou pt-br). A clonagem de voz está disponível nos idiomas compatíveis com esse recurso; as predefinições de voz por IA cobrem os demais.
O uso é cobrado por minuto de vídeo, arredondado para o próximo minuto cheio, usando o mesmo saldo de minutos do aplicativo Rask. Minutos adicionais custam US$ 3/min nos planos padrão elegíveis, e os preços corporativos são personalizados de acordo com o seu contrato. A nova geração de conteúdo é cobrada com base nos trechos alterados, com um mínimo de um minuto por execução, e a sincronização labial é cobrada separadamente para cada vídeo gerado por completo.
Não. Não há limites de uso, cotas de simultaneidade ou restrições por chave. Assim, você pode processar um catálogo inteiro e todos os idiomas de destino ao mesmo tempo.
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.
Vídeos em MP4, MOV, MKV, AVI, WebM, M4V e 3GP; áudios em MP3, WAV, FLAC e M4A; ou um link do YouTube, Google Drive, S3, Vimeo ou um URL direto.
Sim. Envie arquivos SRT de origem e traduzidos, ou envie trechos de texto, e informe o transcript_id ao criar o projeto. O Rask vai gerar a voz para o seu texto aprovado.
Não. A API processa arquivos de vídeo e áudio gravados e entrega os resultados como arquivos. Para agentes de voz ao vivo ou legendas em tempo real, uma API de fala por streaming é a melhor opção.
A Brask Inc possui certificação SOC 2 Tipo II e opera em conformidade com a LGPD/GDPR, com o status de controle ativo em seu Centro de Confiabilidade. Clones de voz personalizados são criados com o consentimento do locutor.