# 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 multipartes, o publica un enlace directo de YouTube, Google Drive, Vimeo, S3 o similar. Obtendrás un ID de contenido multimedia y los metadatos del video antes de gastar nada.
Pasa el ID de contenido multimedia como video_id y un idioma de destino. Deja el idioma de origen vacío para la detección automática de idiomas. La transcripción comienza de inmediato.video_id
Lee los fragmentos de la transcripción tan pronto estén disponibles, para que puedas comenzar a indexar la grabación mientras el contenido traducido sigue procesándose. Descarga los archivos de subtítulos y multimedia 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 registro del proyecto glossary_version, para que las modificaciones posteriores nunca alteren en silencio el trabajo ya terminado.Sí. Envía un archivo o enlace de video, crea un proyecto y consulta la transcripción con etiquetas de orador y marcas de tiempo mediante GET /v2/projects/{id}/transcription. La transcripción es la primera etapa de cada proyecto en Rask, a la que luego se le añade la traducción, los subtítulos y la versión con doblaje.
Sí. Publica un enlace de YouTube, Google Drive, Vimeo, S3 o de descarga directa en el endpoint de archivos multimedia, 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 solo ciclo 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, indica 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 introduce 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 en el resultado. Prueba la API con tus propios videos y corrige cualquier segmento a través de la misma antes de publicarlo.
La transcripción se entrega en segmentos JSON con oradores y marcas de tiempo. Une el texto de los segmentos para obtener texto plano o conserva las marcas de tiempo para que las transcripciones sean aptas para búsquedas. Los subtítulos en formatos SRT y VTT se incluyen en el idioma de destino.
No. La API devuelve la transcripción, su traducción, los subtítulos y la versión con doblaje. Para crear resúmenes generados por IA o notas de reuniones, envía la transcripción a la herramienta de resúmenes 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 del archivo. Cada proyecto muestra los valores original_duration y duration una vez aplicados los límites de tu plan. Si manejas videos muy largos o un alto volumen, comunícate 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 contrato.
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 sus capacidades dependen de tu plan.
El acceso a la API está disponible en los planes Creator Pro, Business y Enterprise, con funciones que dependen de tu plan. Puedes generar tu ID de cliente y tu clave secreta en la aplicación y empezar a hacer llamadas de inmediato. Los planes Enterprise, los precios por volumen y la cobertura de idiomas personalizada se gestionan directamente con nuestro equipo.