API de transcripción de vídeo y apuntes
Envía un archivo de audio o vídeo desde tu servidor y recibe una transcripción con marcas de tiempo, apuntes con IA y archivos listos para descargar. La API usa el mismo procesamiento que la web y la extensión de Chrome.
- URL base
https://api.video-to-notes.com- Autenticación
- Clave API como token Bearer
- Formato
- JSON sobre HTTPS; los archivos van directamente al almacenamiento mediante URL firmadas
- Acceso
- Incluida en los planes Basic y Plus activos; usa las horas de tu plan
Inicio rápido
Estos pasos llevan un archivo de tu disco a una transcripción y unos apuntes. Necesitas un plan Basic o Plus activo, una terminal y, para el cliente de ejemplo, Python 3.12 o posterior.
1. Crea una clave API
Inicia sesión en la web (por ejemplo, en la página de precios), abre Claves API en la barra de la cuenta, ponle un nombre a la clave y, si quieres, una fecha de caducidad. Copia el secreto en cuanto aparezca: solo se muestra una vez. Puede haber hasta tres claves activas a la vez.
2. Guarda la clave en una variable de entorno
Mantén la clave fuera del código fuente, de los argumentos de línea de comandos y de los registros. Los ejemplos leen la clave de VTN_API_KEY y la URL base de VTN_API_BASE.
export VTN_API_BASE="https://api.video-to-notes.com"
read -rs VTN_API_KEY && export VTN_API_KEY # paste the key, press Enter$env:VTN_API_BASE = "https://api.video-to-notes.com"
$env:VTN_API_KEY = Read-Host "API key" -MaskInput3. Comprueba tu cuenta
Esta llamada confirma que la clave funciona y devuelve tu plan, los segundos que te quedan, los formatos admitidos y los límites actuales.
# Sends the key through stdin, so it never appears in the process list.
vtn() {
printf 'header = "Authorization: Bearer %s"\n' "$VTN_API_KEY" |
curl -s --config - "$@"
}
vtn "$VTN_API_BASE/api/v1/account"$headers = @{ Authorization = "Bearer $env:VTN_API_KEY" }
Invoke-RestMethod "$env:VTN_API_BASE/api/v1/account" -Headers $headers |
ConvertTo-Json -Depth 54. Transcribe un archivo
Descarga el cliente de ejemplo en Python. Solo necesita la biblioteca estándar. Sube el archivo por partes, inicia la tarea, espera a que termine y guarda cada página de resultados.
python client.py run meeting.mp4 --state meeting.state.json \
--output meeting.jsonl --download meeting-filesPara procesar solo una parte de una grabación, añade --start y --end en segundos desde el inicio del archivo. --audio-language da una pista sobre el idioma y --notes-language elige el idioma de los apuntes. Sin estas opciones se procesa todo el archivo y los idiomas se detectan automáticamente.
python client.py run lecture.webm --state lecture.state.json \
--start 30 --end 3630 --audio-language ru --notes-language enEl archivo de estado guarda el ID de la subida y la identidad de la solicitud, nunca la clave. Si el comando se detiene, vuelve a ejecutarlo con el mismo archivo de estado: recupera la misma tarea y no se te cobra dos veces. Usa un archivo de estado nuevo para cada tarea nueva.
5. Lee los resultados
meeting.jsonl contiene una página de resultados JSON por línea: texto de la transcripción con tiempos, apuntes en Markdown, huecos y avisos. meeting-files contiene las descargas, como la transcripción en TXT y los apuntes en Markdown, HTML y PDF. El cliente tiene además estos comandos:
python client.py account
python client.py status JOB_ID
python client.py result JOB_ID --output results.jsonl --download files
python client.py cancel JOB_ID
python client.py resume JOB_ID¿Prefieres curl? El inicio rápido en Bash ejecuta los mismos pasos de subida, tarea y resultado con curl y jq.
bash quickstart.sh meeting.mp4Cómo funciona una tarea
Toda integración sigue los mismos seis pasos. La referencia de la API muestra cada llamada con un ejemplo de solicitud y de respuesta.
- Comprueba la cuenta.
GET /api/v1/accountdevuelve tu plan, los segundos restantes, los formatos admitidos y los límites. - Crea una subida.
POST /api/v1/uploadscon el tamaño del archivo en bytes y su extensión. La respuesta indica el tamaño de cada parte y el número de partes. - Sube las partes. Obtén URL firmadas con
POST /api/v1/uploads/{upload_id}/parts, envía cada parte con unPUTHTTP directamente al almacenamiento, guarda cadaETagy después llama aPOST /api/v1/uploads/{upload_id}/complete. - Inicia la tarea.
POST /api/v1/jobscon el ID de la subida y una cabeceraIdempotency-Key. El servidor comprueba el archivo real, planifica el trabajo y reserva el tiempo de tu plan. - Consulta el estado.
GET /api/v1/jobs/{job_id}hasta que el estado sea final, esperando al menospoll_after_secondsentre llamadas. - Lee el resultado.
GET /api/v1/jobs/{job_id}/resulty siguenext_cursorhasta que sea null. Descarga los archivos deartifactsantes de que caduquen sus enlaces.
Una tarea termina como completed, completed_with_gaps, interrupted, cancelled, failed o expired. charged_seconds indica cuánto de tu plan ha usado la tarea.
Buenas prácticas
Estos hábitos protegen tus claves, evitan cobros dobles y hacen fiables las tareas largas.
Mantén las claves en secreto
- Llama a la API solo desde un servidor o un script que controles. Nunca pongas una clave en código del navegador, en una app móvil, en una URL o en el control de versiones.
- Carga la clave desde una variable de entorno o un gestor de secretos, y mantenla fuera de registros, informes de errores y argumentos de línea de comandos.
- Usa una clave por integración con fecha de caducidad, para poder cambiar o revocar una clave sin tocar las demás.
- Para cambiar una clave, crea la nueva, despliégala y revoca la antigua. Las tareas ya iniciadas siguen en marcha.
- Si una clave puede haberse filtrado, por ejemplo en un chat, un ticket o un commit, revócala de inmediato en el panel Claves API.
Haz que crear tareas sea seguro de repetir
- Genera una
Idempotency-Keyaleatoria, como un UUID, para cada tarea nueva y guárdala con el ID de la subida antes de enviar la solicitud. - Si se pierde la respuesta, envía la misma solicitud con la misma clave. Recibes la tarea original y no se te cobra dos veces.
- Nunca reutilices una clave para otro archivo u otras opciones: la API responde con 409
IDEMPOTENCY_CONFLICT.
Consulta con moderación y respeta los límites
- Espera al menos cinco segundos entre consultas de estado, y más si
poll_after_secondslo pide. - Ante un 429 o un 503, espera lo que indique la cabecera
Retry-Afteroerror.retry_after_secondsy reintenta con un pequeño retardo aleatorio. - Repite una solicitud sin cambios solo si
error.retryablees true. Si no, corrige antes la solicitud. - Una cuenta ejecuta una subida y una tarea a la vez. Pon tus archivos en cola y envía el siguiente cuando termine la tarea actual.
Controla las horas que usas
- Comprueba
remaining_secondsantes de subir. Una tarea que necesita más tiempo del que tienes falla conINSUFFICIENT_BALANCE; la API nunca acorta tu selección para que encaje. - Envía un
rangecuando solo necesites una parte de una grabación. Solo se cobra el audio seleccionado. - Cancela las tareas que ya no necesites. Las partes terminadas siguen disponibles y el tiempo reservado que no se usó se devuelve.
- Anula las subidas que no vayas a usar, para que pueda empezar la siguiente.
Recoge resultados completos
- Sigue
next_cursorhasta que sea null. Una página contiene como máximo 32 elementos. - Trata los elementos
gapcomo audio que no se pudo procesar, no como silencio, y revisa loswarnings. - Descarga los archivos de
artifactsmientras sus enlaces sean válidos (hasta diez minutos); vuelve a pedir la página para obtener enlaces nuevos. - Guarda lo que necesites: los archivos de resultados se conservan unas 24 horas y la recuperación de la transcripción unas 48 horas.
- Lee los campos que necesites e ignora el resto.
Preguntas frecuentes
¿Quién puede usar la API?
Cualquiera con un plan Basic o Plus activo. El acceso a la API está incluido en ambos planes y no tiene un precio aparte. Sin un plan activo, las tareas nuevas se rechazan con PLAN_REQUIRED. Consulta los planes y precios.
¿Cómo se cuenta el uso de la API?
Las tareas de la API usan las mismas horas del plan que la web y la extensión de Chrome. El servidor mide la duración real del audio seleccionado; charged_seconds en el estado de la tarea y en cada página de resultados muestra la cantidad exacta. Para una tarea con huecos que no se pueden recuperar, los términos de uso explican cómo se cobra el audio que falta.
¿Qué formatos y tamaños de archivo se admiten?
Vídeo: MP4, M4V, MOV, WebM, MKV, OGV, AVI, WMV, ASF, FLV, MPG, MPEG, VOB, TS, MTS, M2TS, 3GP, 3G2 y MXF. Audio: MP3, M4A, AAC, WAV, FLAC, OGG, OGA, OPUS, WMA, AMR, AIFF, AIF, CAF y AC3. Un archivo puede ocupar hasta 8 GiB. Debe contener una pista de audio decodificable; los archivos protegidos contra copia no se pueden leer.
¿Qué idiomas puedo usar?
La detección automática es la opción predeterminada. También puedes indicar el idioma del audio o elegir el idioma de los apuntes con uno de los más de 60 códigos de idioma, por ejemplo en, de, es, fr, ja o zh. La llamada de la cuenta muestra todos los valores aceptados en este momento.
¿Cuánto tarda una tarea?
Depende de la duración del audio seleccionado y de la carga del momento. Las tareas se ejecutan en segundo plano, así que puedes subir una grabación larga y volver más tarde. completed_units y total_units en el estado de la tarea muestran el progreso.
¿Puedo llamar a la API desde un navegador o una app móvil?
No. Una clave API da acceso a las horas de tu plan, así que debe quedarse en un servidor que controles. Para una app web o móvil, envía los archivos a tu propio backend y llama a la API desde allí.
¿Puedo enviar un enlace de YouTube u otra URL?
No. La API procesa los archivos que subes; no descarga URL ni vídeos de YouTube.
¿Hay webhooks o avisos por correo?
No. Consulta el estado de la tarea y respeta poll_after_seconds. Las tareas de la API no envían correos.
¿Qué pasa si se corta mi conexión?
Si falla la subida de una parte, pide una URL firmada nueva para esa parte y vuelve a enviarla antes de que caduque la subida. Si se pierde la respuesta al crear la tarea, repite la solicitud con la misma Idempotency-Key y recibirás la misma tarea. Una tarea en marcha no depende de tu conexión.
¿Cuánto tiempo se conservan los resultados?
Las páginas de resultados y los archivos de descarga se conservan unas 24 horas después de que termine la tarea, y la transcripción se puede recuperar durante unas 48 horas. Cada respuesta indica la hora exacta en expires_at, así que guarda antes lo que necesites.
¿Qué pasa si revoco una clave o termina mi plan?
Revocar una clave no detiene las tareas ya iniciadas; lee sus resultados con otra clave. Cuando termina tu plan, una clave válida aún puede leer el estado y los resultados y cancelar tareas hasta que caduque el contenido, pero las subidas nuevas, las tareas nuevas y la reanudación requieren un plan activo.
¿Qué pasa con los archivos que subo?
Intentamos eliminar los archivos originales subidos en las 24 horas siguientes a la carga. La eliminación puede tardar más. La política de privacidad explica qué se guarda y durante cuánto tiempo.
¿Hay un SDK o un archivo OpenAPI?
No hay un paquete SDK. Usa el archivo OpenAPI 3.1 para generar un cliente o importar la API en una herramienta como Postman o Insomnia, o parte de los ejemplos en Python y curl.
¿Cuáles son los límites de frecuencia?
Una cuenta ejecuta una subida y una tarea a la vez, puede iniciar hasta 10 subidas con un total de 20 GiB por día UTC, crear 12 tareas por minuto y enviar otras 60 solicitudes por minuto con todas sus claves. La llamada de la cuenta devuelve los valores que se te aplican.
Archivos y ejemplos
Los ejemplos y los archivos del contrato se publican con la web y coinciden con la API en producción.
- client.py: cliente de ejemplo para Python 3.12+, solo biblioteca estándar
- quickstart.sh: ejemplo en Bash con curl y jq
- openapi.json: descripción OpenAPI 3.1 de todos los endpoints, con ejemplos
- paid-api.schema.json: JSON Schema de todas las solicitudes y respuestas
Ayuda
¿Algo no está claro o no funciona? Escríbenos e incluye el request_id de la respuesta de error, la hora y el endpoint. Nunca nos envíes tu clave API.