# 1. send the video as a link - YouTube, Google Drive, Vimeo, S3 or direct URL
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": "camera review"}'
# 2. create the project - the language of the video is detected automatically
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\"}"# The transcript as plain text with timestamps and speakers
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
| jq -r '.segments[] | "\(.start) \(.speaker): \(.src.text)"'



Sube un archivo de video como datos de formulario multipart o publica un enlace de YouTube, Google Drive, Vimeo, S3 o un enlace directo. Obtendrás un ID de medios y los metadatos del video antes de gastar algo.
Pasa el ID de medios como video_id y un idioma de destino. Deja el idioma de origen vacío para la detección automática de idioma. La transcripción comienza de inmediato.video_id
Lee los segmentos de la transcripción tan pronto estén disponibles para empezar a indexar la grabación mientras el contenido multimedia traducido se sigue procesando. Descarga los archivos de subtítulos y de video cuando el proyecto esté completo.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
VIDEOS = ["https://youtu.be/aaa", "https://youtu.be/bbb", "https://vimeo.com/123"]
async def transcribe(client, i, link):
media = await client.create_media_link(data=schemas.MediaCreateLink(link=link))
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="en-us"))
while job.status is not enums.ProjectStatus.MERGING_DONE:
await asyncio.sleep(10)
job = await client.get_project(project_id=job.id)
t = await client.get_project_transcription(project_id=job.id)
with open(f"video_{i}.txt", "w") as f: # plain text, one segment per line
f.write("\n".join(f"{s.speaker}: {s.src.text}" for s in t.segments))
async def main():
client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
await asyncio.gather(*(transcribe(client, i, v) for i, v in enumerate(VIDEOS))) # no rate limits
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 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://drive.google.com/file/d/...' });
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: 'fr-fr' });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
const { segments } = await call('GET', `/v2/projects/${p.id}/transcription`);
const index = segments.map((s) => ({ t: s.start, speaker: s.speaker, text: s.src.text, fr: s.dst.text }));
console.log(JSON.stringify(index, null, 2)); // ready for your search index# 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 a local video file
VIDEO_ID=$(curl -s -X POST "https://api.rask.ai/api/library/v1/media?kind=video" \
-H "Authorization: Bearer $TOKEN" -F "[email protected]" | 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\": \"de-de\", \"num_speakers\": 3}" | jq -r .id)
# 4. when status is merging_done, save the transcript as plain text
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
| jq -r '.segments[].src.text' > webinar.txt<?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://vimeo.com/123456']]));
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' => 'pt-br']]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
$t = $json($http->get("/v2/projects/{$p['id']}/transcription", ['headers' => $h]));
file_put_contents('video.txt', implode("\n", array_map(fn($s) => $s['src']['text'], $t['segments'])));no_audio, no_words and forbidden_link are specific enough to show directly to your own user, for example a video without speech.00:00:00,320 SPEAKER_00 Welcome back. Today we test three cameras in low light.
00:00:06,180 SPEAKER_01 I brought the footage from last week's night shoot.
00:00:10,940 SPEAKER_00 Let's start with the smallest sensor, the hardest case.
00:00:15,500 SPEAKER_01 At ISO 6400 the noise is visible, but the colors hold up./transcriptiontranslation_srt_pathtranslation_vtt_pathtranslated_videotranslated_audiooriginal_video

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.Sí. Envía un archivo de video o un enlace, crea un proyecto y lee la transcripción con etiquetas de orador y marcas de tiempo desde GET /v2/projects/{id}/transcription. La transcripción es la primera etapa de cada proyecto en Rask, que luego agrega la traducción, los subtítulos y una versión con doblaje.
Sí. Publica un enlace de YouTube, Google Drive, Vimeo, S3 o de descarga directa en el endpoint de medios, y la API se encarga de obtener el video. También puedes subir archivos de video directamente.
Sí. Crea un proyecto por cada video y ejecútalos en paralelo. La API no tiene límites de frecuencia, cuotas de concurrencia ni restricciones por clave, por lo que la transcripción masiva de toda una biblioteca se reduce a un bucle en tu código.
Los diferentes oradores se detectan de forma automática y cada segmento incluye una etiqueta de orador, como SPEAKER_00. Si conoces el número de oradores, incluye num_speakers al crear el proyecto.
La API transcribe 75 idiomas de origen, incluido el inglés, con detección automática de idioma: deja src_lang vacío o usa un código de dos letras como en. Las transcripciones se pueden traducir a más de 135 opciones de idiomas y regiones, como en-us o es-mx.
La precisión depende del video: el ruido de fondo, los entornos ruidosos, las voces superpuestas, los acentos y la jerga técnica influyen. Prueba la API con tus propios videos y corrige cualquier segmento a través de la misma antes de publicar.
La transcripción se entrega en segmentos JSON con oradores y marcas de tiempo. Combina el texto de los segmentos para obtener texto sin formato o conserva las marcas de tiempo para que las transcripciones se puedan buscar. Los subtítulos en SRT y VTT se incluyen en el idioma de destino.
No. La API devuelve la transcripción, su traducción, los subtítulos y una versión con doblaje. Para crear resúmenes o notas de reuniones generados por IA, envía la transcripción a la herramienta de resumen de tu preferencia.
Sí, a partir de grabaciones. Sube la reunión grabada como archivo de video o audio. La API no se conecta a plataformas de reuniones ni ofrece subtítulos en tiempo real o transcripción de baja latencia para llamadas en vivo.
La documentación de la API no especifica un límite fijo en el tamaño de archivo. Cada proyecto muestra original_duration y duration una vez aplicados los límites de tu plan. Si trabajas con videos muy largos o un alto volumen, consulta con nuestro equipo.
Los proyectos se cobran por minuto de video, redondeando hacia arriba al siguiente minuto completo, utilizando la misma bolsa de minutos de la aplicación de Rask. El precio incluye la transcripción, la traducción, los subtítulos y la versión con doblaje. Los minutos adicionales cuestan $3/min en los planes estándar elegibles. Los precios para empresas se adaptan a tu acuerdo.
Comienza con una prueba gratis en la aplicación de Rask, sin necesidad de tarjeta de crédito, para probar la transcripción en tus propios videos. El acceso a la API está disponible en los planes Creator Pro, Business y Enterprise, y las funciones dependen de tu plan.
El acceso a la API está disponible en los planes Creator Pro, Business y Enterprise, y las funciones dependen de tu plan. Generas tu ID de cliente y tu clave secreta en la aplicación para empezar a usarla de inmediato. Los planes Enterprise, los precios por volumen y la cobertura de idiomas personalizada se gestionan directamente con nuestro equipo.