La API de Inwista ya está aquí
Overlay

Referencia de la API

Transcribe, mejora y traduce subtítulos mediante programación. URL base, autenticación, cada endpoint y cada código de error — todo en una sola página.
Base URL: https://api.inwista.ai/v1

Autenticación

Crea una clave de API en Dashboard → API Keys (solo administradores del espacio de trabajo). La clave se muestra una sola vez — guárdala como si fuera una contraseña.

Envía la clave como token Bearer en cada petición. Cada clave está vinculada a un único espacio de trabajo: todo lo que devuelve la API le pertenece. Los recursos creados a través de la API son visibles en el dashboard, pero los proyectos del dashboard no se exponen a través de la API.

Todo fallo de autenticación — cabecera ausente, clave desconocida, clave revocada — devuelve la misma respuesta 401.

curl https://api.inwista.ai/v1/transcriptions \
  -H "Authorization: Bearer inw_live_4f6a…"

Errores

Todos los errores comparten el mismo formato: un objeto con un código legible por máquinas y un mensaje legible por personas. Dentro de v1 los códigos solo se añaden, nunca cambian — construye sobre el código, no sobre el mensaje.

{ "error": { "code": "insufficient_credits", "message": "…" } }
EstadoCódigoCuándo
401invalid_api_keyFallo de autenticación (por cualquier motivo)
400invalid_source_urlNo es https, credenciales en la URL, host privado o URL mal formada
400invalid_languageFalta o no es un código ISO 639-1
400invalid_num_speakersNo es un entero entre 1 y 32
400invalid_store_mediaNo es un booleano
400invalid_retentionNo es "standard" ni "none", o combinado con store_media true
400invalid_metadataNo es un objeto o supera 1 KB
400invalid_settingsNo es un objeto o supera 2 KB
400unreadable_sourceNo se pudo determinar la duración del archivo multimedia
400invalid_cursorstarting_after no es un id conocido
400invalid_formatFormato de subtítulos no compatible
402insufficient_creditsEl monedero no cubre el coste
404not_foundRecurso desconocido
404translation_not_foundEl idioma solicitado no tiene una traducción completada para la versión servida
409not_readyRequiere una transcripción completada
409operation_in_progressTodavía se está procesando una mejora
409translation_existsEl idioma ya existe para esta versión
400invalid_idempotency_keyCabecera Idempotency-Key vacía o de más de 255 caracteres
400idempotency_key_reusedLa Idempotency-Key ya se usó para otra petición
409idempotency_conflictUna petición con esta clave aún se está procesando
429rate_limitedDemasiadas peticiones — reintenta tras la cabecera Retry-After

Idempotencia

Cada llamada POST cobra créditos al aceptarse, así que una petición que expira y se reintenta a ciegas crearía un segundo trabajo y un segundo cobro. Envía una cabecera Idempotency-Key (cualquier cadena única de hasta 255 caracteres) y los reintentos serán seguros: la respuesta de la primera petición se guarda durante 24 horas y se devuelve sin cambios en cada reintento con la misma clave.

Reutilizar una clave con una petición distinta devuelve 400 idempotency_key_reused; reintentar mientras la original sigue en curso devuelve 409 idempotency_conflict. Las respuestas de error nunca se guardan — una petición fallida nunca conserva su cobro, así que la clave se libera para un reintento limpio.

curl -X POST https://api.inwista.ai/v1/transcriptions \
  -H "Authorization: Bearer inw_live_…" \
  -H "Idempotency-Key: order-42-transcribe" \
  -H "Content-Type: application/json" \
  -d '{ "source_url": "…", "language": "en" }'

Límites de peticiones

Cada clave de API puede hacer 300 peticiones de lectura (GET) y 60 de escritura (POST) por minuto. El cupo se rellena de forma continua y puede consumirse de una vez. Por encima del límite, la API responde 429 rate_limited con una cabecera Retry-After en segundos.

Toma las cifras como orientativas: reduce el ritmo ante cualquier 429 y prefiere webhooks antes que sondeos frecuentes.

HTTP/1.1 429 Too Many Requests
Retry-After: 12

{ "error": { "code": "rate_limited", "message": "…" } }

Créditos

Las operaciones se miden en créditos del monedero de prepago de tu espacio de trabajo (recárgalo en Dashboard → Billing). La transcripción cuesta 4 créditos por cada minuto iniciado de contenido multimedia. La mejora y la traducción se tarifican según el tamaño del contenido — las mismas tarifas que cobra el estudio. Recuperar, listar y sondear el estado es gratuito.

El cargo se realiza cuando la petición es aceptada. Si una operación falla, el cargo se reembolsa automáticamente y el recurso indica credits_charged: 0. Un rechazo 402 nunca genera cargo alguno.

Paginación

Los endpoints de listado aceptan limit (por defecto 25, máximo 100) y starting_after — el último id de la página anterior. Las respuestas envuelven los resultados en un objeto de lista con has_more.

{ "object": "list", "data": [ … ], "has_more": true }

Transcripciones

Envía el archivo multimedia por URL, sondea hasta que esté completed (o usa webhooks) y después recupera los subtítulos. Los estados son processing, completed y failed. Las marcas de tiempo son segundos unix.

El sondeo y el resultado comparten un único endpoint: GET /v1/transcriptions/{id} es donde consultas el estado Y donde vive el recurso terminado — no hay un endpoint de resultados aparte. La única excepción son los propios archivos de subtítulos, que siempre se sirven desde el endpoint de subtítulos porque son cuerpos de archivo en bruto, no JSON.

Crear una transcripción

POST/v1/transcriptions

Convierte cualquier archivo multimedia alojado en subtítulos precisos y con marcas de tiempo sin que nadie abra el estudio — alimenta directamente tu CMS, tu archivo o tu canalización de publicación.

La duración del archivo se comprueba antes de aceptar la petición; el cargo al monedero y el encolado del trabajo ocurren en un único paso atómico. Devuelve 201 con el recurso de transcripción.

Créditos: 4 créditos por cada minuto iniciado de contenido multimedia, cobrados al aceptar el trabajo. Los trabajos fallidos se reembolsan automáticamente.

Cuerpo

CampoTipoDescripción
source_urlobligatoriostringURL https pública del archivo multimedia, o una URL de YouTube/TikTok/Vimeo
languageobligatoriostringCódigo ISO 639-1, p. ej. "en" o "nb-NO"
diarizationbooleanEtiquetas de hablante (por defecto false)
num_speakersinteger1–32, pista para la diarización
store_mediabooleanfalse = solo transcripción: no se preparan archivos de reproducción (por defecto true)
retentionstring"none" elimina el medio de origen tras la transcripción — la transcripción se conserva (por defecto "standard")
metadataobjectTus propias etiquetas, hasta 1 KB, devueltas literalmente
curl -X POST https://api.inwista.ai/v1/transcriptions \
  -H "Authorization: Bearer inw_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "source_url": "https://cdn.example.com/interview.mp4",
    "language": "en",
    "diarization": true
  }'

Respuesta

{
  "id": "aB3dE9f2…",
  "object": "transcription",
  "status": "processing",
  "progress": 50,
  "language": "en",
  "duration_seconds": 1834,
  "diarization": true,
  "store_media": true,
  "retention": "standard",
  "source_url": "https://cdn.example.com/interview.mp4",
  "metadata": { "internal_ref": "case-42" },
  "credits_charged": 124,
  "error": null,
  "created": 1754558000
}

Listar transcripciones

GET/v1/transcriptions

Concilia tu catálogo con los trabajos procesados o construye un panel sobre todo lo que has transcrito.

Transcripciones creadas por API, las más recientes primero. Paginación estándar.

Créditos: Gratis.

Parámetros de consulta

CampoTipoDescripción
limitintegerTamaño de página, por defecto 25, máximo 100
starting_afterstringCursor: el último id de la página anterior
curl "https://api.inwista.ai/v1/transcriptions?limit=10" \
  -H "Authorization: Bearer inw_live_…"

Recuperar una transcripción

GET/v1/transcriptions/{id}

Sondeo de progreso y resultado final en uno: observa cómo el estado pasa a completed y lee después la duración, el idioma y el cargo en la misma respuesta.

Sondea hasta que el estado sea completed (o registra un webhook, más abajo). Leer una transcripción fallida también activa su reembolso automático.

Créditos: Gratis.

curl https://api.inwista.ai/v1/transcriptions/aB3dE9f2… \
  -H "Authorization: Bearer inw_live_…"

Respuesta

{
  "id": "aB3dE9f2…",
  "object": "transcription",
  "status": "processing",
  "progress": 50,
  "language": "en",
  "duration_seconds": 1834,
  "diarization": true,
  "store_media": true,
  "retention": "standard",
  "source_url": "https://cdn.example.com/interview.mp4",
  "metadata": { "internal_ref": "case-42" },
  "credits_charged": 124,
  "error": null,
  "created": 1754558000
}

Eliminar una transcripción

DELETE/v1/transcriptions/{id}

Elimine un trabajo bajo demanda — control total de sus datos en una sola llamada.

Elimina la transcripción de forma permanente junto con todo lo almacenado: archivos multimedia, contenido de la transcripción, revisiones, traducciones y comentarios. Los contadores de facturación agregados se conservan — no contienen contenido.

Solo se pueden eliminar trabajos completados o fallidos; un trabajo aún en proceso devuelve 409, igual que uno con una mejora o traducción en curso. La eliminación es inmediata e irreversible.

Créditos: endpoints.delete-transcription.pricing

curl -X DELETE https://api.inwista.ai/v1/transcriptions/aB3dE9f2… \
  -H "Authorization: Bearer inw_live_…"

Respuesta

{
  "id": "aB3dE9f2…",
  "object": "transcription",
  "deleted": true
}

Recuperar subtítulos

GET/v1/transcriptions/{id}/captions

Lleva archivos de subtítulos listos para emisión directamente a tu reproductor, tu MAM o tu canalización de entrega — sin exportaciones manuales ni conversiones de formato por tu parte. En una canalización de producción de video, el SRT o VTT terminado cae directamente en tu NLE, tu herramienta de revisión o tu paso de empaquetado en cuanto se transcribe un montaje.

Devuelve el cuerpo del archivo de subtítulos en bruto con el Content-Type correspondiente — sin envolver en JSON. Responde 409 not_ready hasta que la transcripción se completa.

Créditos: Gratis.

Parámetros de consulta

CampoTipoDescripción
formatobligatoriostringsrt, vtt, json o txt
diarization"true"Antepone las etiquetas de hablante
languagestringSirve una traducción completada en lugar del original; 404 translation_not_found si no existe para la versión servida
revisionstringObtén una versión concreta (el id de una mejora es su id de revisión); omitido = la más reciente
curl "https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/captions?format=srt" \
  -H "Authorization: Bearer inw_live_…" -o interview.srt

El formato json es un contrato versionado: { version: 1, language, segments: [{ index, start, end, text, speaker? }] } — segundos con precisión de milisegundos, y dentro de una versión los campos solo se añaden, nunca se eliminan.

Las traducciones pertenecen a la versión para la que se crearon — el revision_id del recurso de traducción la identifica, y la versión de una mejora posterior no las hereda. Pasa ese revision_id como revision para obtener la versión traducida.

Mejoras

Mejora de subtítulos con IA — longitud de línea, equilibrado y reglas de sincronización — que produce una nueva versión de los subtítulos. Requiere una transcripción completada. Cuando una mejora termina, la recuperación de subtítulos sirve automáticamente la versión mejorada.

Iniciar una mejora

POST/v1/transcriptions/{id}/enhance

Sincronización y equilibrado de líneas con calidad de emisión en piloto automático — entrega subtítulos que pasan el control de calidad sin que un editor los toque. Para productoras, esto automatiza el paso de conformado de subtítulos de la canalización de entrega: cada episodio sale con subtítulos consistentes y conformes a la especificación.

Devuelve 202 con el recurso de mejora.

Créditos: Se calcula a partir del tamaño del contenido de los subtítulos, a la misma tarifa que cobra el estudio, y se descuenta al aceptar el trabajo. Se reembolsa automáticamente en caso de fallo.

Cuerpo

CampoTipoDescripción
settingsobjectAjustes de mejora del estudio, hasta 2 KB; omítelo para usar los valores por defecto

Ajustes de la mejora

CampoTipoDescripción
maxLinesPerBlock"1" | "2"Líneas mostradas a la vez; el estándar de emisión y el valor por defecto es 2
maxCharactersPerLine1–100Caracteres por línea; el estándar de emisión y el valor por defecto es 42
blockLineBalancingbottom_heavy | top_heavy | equal | unconstrainedForma visual de los bloques de dos líneas; por defecto unconstrained
textCondensationnone | smart | aggressivePermite a la IA condensar diálogos que se leen demasiado rápido; por defecto none (literal)
speakerDialogueFormatnone | hyphens | speaker_name | bracketsCómo se separan varios hablantes en un mismo bloque; por defecto none
continuationMarkersnone | end | start | bothColocación del marcador cuando una frase abarca varios bloques; por defecto none
continuationMarkerStyledash | ellipsisGuion o puntos suspensivos para frases divididas; por defecto dash
gapBetweenBlocksnone | broadcasting | streaming | sdhPausa vacía forzada entre bloques consecutivos; por defecto broadcasting (~99 ms)
minBlockDuration0.1–60 sTiempo mínimo que un bloque permanece en pantalla, en segundos; por defecto 1.0
maxBlockDuration> minTiempo máximo que un bloque permanece en pantalla, en segundos; por defecto 7.0
curl -X POST https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/enhance \
  -H "Authorization: Bearer inw_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "settings": { "maxCharactersPerLine": 37, "textCondensation": "smart" } }'

Respuesta

{
  "id": "rev8Xk3…",
  "object": "enhancement",
  "transcription_id": "aB3dE9f2…",
  "status": "processing",
  "progress": 0,
  "credits_charged": 12,
  "error": null,
  "created": 1754559000
}

Recuperar una mejora

GET/v1/transcriptions/{id}/enhancements/{enhancementId}

Sondeo y resultado en uno: cuando el estado indica completed, el endpoint de subtítulos ya sirve la versión mejorada.

Sondea hasta completed. Leer una mejora fallida activa su reembolso automático.

Créditos: Gratis.

curl https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/enhancements/rev8Xk3… \
  -H "Authorization: Bearer inw_live_…"

Traducciones

Traducción de subtítulos que hereda la sincronización del original — una traducción por idioma y por versión de subtítulos. Requiere una transcripción completada.

Iniciar una traducción

POST/v1/transcriptions/{id}/translate

Una llamada por idioma convierte una pista de subtítulos terminada en una versión localizada con la misma sincronización — multiplica el alcance de cada video que ya tienes.

Devuelve 202. Responde 409 translation_exists si ese idioma ya existe para la versión actual.

Créditos: Se calcula a partir del tamaño del contenido de los subtítulos, a la misma tarifa que cobra el estudio, por idioma de destino, y se descuenta al aceptar. Se reembolsa automáticamente en caso de fallo.

Cuerpo

CampoTipoDescripción
target_languageobligatoriostringCódigo ISO 639-1, p. ej. "es"
target_labelstringNombre para mostrar, hasta 60 caracteres
curl -X POST https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/translate \
  -H "Authorization: Bearer inw_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "target_language": "es" }'

Respuesta

{
  "id": "es",
  "object": "translation",
  "transcription_id": "aB3dE9f2…",
  "target_language": "es",
  "revision_id": "TRkf2nY7…",
  "status": "processing",
  "progress": 0,
  "credits_charged": 6,
  "error": null,
  "created": 1754559600
}

Recuperar una traducción

GET/v1/transcriptions/{id}/translations/{language}

Sondeo y resultado en uno: una vez completed, obtén el archivo de subtítulos traducido desde el endpoint de subtítulos con el parámetro language.

Sondea hasta completed y obtén después los subtítulos traducidos desde el endpoint de subtítulos con el parámetro de consulta language.

Créditos: Gratis.

# Poll the translation resource
curl https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/translations/es \
  -H "Authorization: Bearer inw_live_…"

# Once completed, fetch the translated subtitle file
curl "https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/captions?format=vtt&language=es" \
  -H "Authorization: Bearer inw_live_…" -o interview-es.vtt

Webhooks

Configura un webhook en Dashboard → Integrations → Webhook para recibir eventos transcript.completed en lugar de sondear. Los payloads van firmados con HMAC-SHA256 (X-Inwista-Signature: sha256=<hex> sobre el cuerpo bruto) con el secreto de firma que se muestra una sola vez durante la configuración. Las URL de archivo están prefirmadas y caducan a las 24 horas.

{
  "event": "transcript.completed",
  "id": "evt_9f2c…",
  "timestamp": 1754560000,
  "workspaceId": "ws_…",
  "project": {
    "id": "aB3dE9f2…",
    "name": "interview.mp4",
    "language": "en",
    "durationSeconds": 1834
  },
  "files": [
    {
      "format": "srt",
      "name": "interview.srt",
      "mimeType": "application/x-subrip; charset=utf-8",
      "url": "https://…",
      "expiresAt": 1754646400
    }
  ]
}
Valoramos tu privacidad

Usamos cookies para entender cómo se usa Inwista y para medir nuestra publicidad. Política de privacidad · Política de cookies