Documentación de la API de KolWrite

Autentícate con tu clave de API, inicia un trabajo y lee el resultado: transcripciones con tiempos por palabra y etiquetas de hablante en JSON, TXT o SRT.

Autenticación

Todas las solicitudes a la API deben autenticarse con tu clave de API única. Inclúyela en las cabeceras de la solicitud:

x-api-key: YOUR_API_KEY

Puedes generar y gestionar tus claves de API desde « Consola de KolWrite » después de crear una cuenta.

Inicio rápido

Empieza rápidamente con estos ejemplos básicos.

1. Iniciar la transcripción

Envía una solicitud POST al endpoint `/transcribe` con la URL del archivo de audio que quieras transcribir.

Solicitud:

POST https://app.kolwrite.com/transcribe
Content-Type: application/json
x-api-key: YOUR_API_KEY

{
  "audio_url": "https://salford.figshare.com/ndownloader/files/14630270"
}

Respuesta:

La API devuelve un `jobId` que utilizarás para recuperar los resultados de la transcripción.

{
  "jobId": "34c63d45-4cb5-473b-bc60-25c175e69c57"
}

2. Obtener el resultado de la transcripción

De Send a GET request a the `/transcribe/{jobId}` endpoint using the `jobId` received from the previous step.

Solicitud:

GET https://app.kolwrite.com/transcribe/34c63d45-4cb5-473b-bc60-25c175e69c57
x-api-key: YOUR_API_KEY

Respuesta (ejemplo):

Cuando el estado del trabajo sea COMPLETED, la respuesta incluirá los detalles de la transcripción.

{
  "jobId": "34c63d45-4cb5-473b-bc60-25c175e69c57",
  "status": "COMPLETED",
  "result": {
    "language": "en",
    "segments": [
      {
        "start": 0.5,
        "end": 3.2,
        "text": "Hello everyone, welcome to today's meeting.",
        "speaker": "Speaker 1",
        "words": [
          {
            "start": 0.5,
            "end": 0.8,
            "word": "Hello"
          },
          {
            "start": 0.9,
            "end": 1.4,
            "word": "everyone"
          },
          {
            "start": 1.5,
            "end": 1.9,
            "word": "welcome"
          }
        ]
      }
    ]
  }
}

Modelos y créditos de uso

El uso del modelo se mide en créditos de uso por segundo, sin cargo mínimo. El pago, los recibos y los documentos fiscales muestran la moneda de pago real utilizada en la compra.

1 crédito es la unidad de facturación de la API que antes se mostraba como $1.00 en la consola de la API.

Las cuentas de facturación israelíes que cumplan los requisitos compran créditos de uso en ILS a un precio neto de ILS 3.60 por crédito antes del IVA. Antes del pago, se muestran los créditos de uso, el importe neto, el IVA y el total final en ILS. Las demás cuentas compran créditos de uso en USD a USD 1.20 por crédito, salvo que se apliquen condiciones de pedido independientes.

Modelo Valor de la API Créditos de uso / hora Ideal para
Basebase0.40Transcripción económica, marcas de tiempo por palabra y separación de hablantes
Oracle Minioracle_mini0.80Transcripción rápida con Oracle, traducción opcional a cualquier idioma de destino compatible, diarización y separación de canales; la opción de traducción Oracle de menor precio
Oracleoracle1.20Transcripción para producción y flujos de trabajo multilingües
Oracle Prooracle_pro1.40Calidad de producción prémium
Oracle Maxoracle_max3.00Máxima calidad para audio complejo o de gran importancia
Corecore1.00Transcripción heredada de uso general
Edgeedge1.20Transcripción heredada de mayor precisión

Complementos: La diarización estándar de hablantes y la separación por canales en modo standard están incluidas. La diarización Pro de hablantes añade 0.20 créditos de uso por hora de audio. overlap la separación de canales se factura a la tarifa del modelo seleccionado por el mayor valor entre la duración de la grabación y el tiempo total de habla detectado en sus canales físicos; ningún modo de canal añade un recargo por diarización. Oracle Mini habilita automáticamente la alineación de marcas de tiempo cuando se selecciona diarización de hablantes o separación de canales.

Endpoints de la API

POST /upload

Carga audio o vídeo local y usa el valor devuelto fileUrl como audio_url en POST /transcribe. Elige la carga Base64 integrada para archivos pequeños o la carga directa al almacenamiento para archivos más grandes.

Carga Base64 integrada (hasta 4 MiB)

Para archivos de hasta 4 MiB (4,194,304 bytes en total), envía los bytes del archivo multimedia como Base64 en una sola solicitud a la API.

POST /upload
Content-Type: application/json
x-api-key: YOUR_API_KEY

{
  "filename": "clip.mp3",
  "contentType": "audio/mpeg",
  "content": "<base64-encoded media bytes>"
}

contentType es opcional y, si se omite, se deduce del nombre del archivo. Envía los bytes multimedia Base64 sin procesar en content, sin el prefijo data:...;base64, . El límite de 4 MiB se aplica al archivo multimedia decodificado.

La respuesta incluye fileUrl. Úsalo como audio_url al crear el trabajo de transcripción.

Carga directa al almacenamiento (hasta 100 MiB)

Para archivos más grandes, solicita un formulario firmado para nuestro almacenamiento compatible con S3, carga el archivo directamente y después crea el trabajo de transcripción. Tamaño máximo de carga: 100 MiB (104,857,600 bytes en total). El formulario firmado es válido durante 60 minutos. La URL de lectura devuelta es válida durante 24 horas, tiempo suficiente para que el servicio de transcripción recupere el archivo multimedia.

1. Solicita un formulario de carga firmado

POST /upload
Content-Type: application/json
x-api-key: YOUR_API_KEY

{
  "filename": "meeting.mp3",
  "contentType": "audio/mpeg"
}

contentType es opcional y, si se omite, se deduce del nombre del archivo. La API devuelve uploadUrl, uploadFields, fileUrl, y uploadExpiresIn.

Usar uploadUrl para cargar el archivo en nuestro almacenamiento compatible con S3. Después usa fileUrl como audio_url al crear el trabajo de transcripción.

2. Carga el archivo directamente al almacenamiento

// upload is the JSON response from POST /upload
const form = new FormData();
for (const [name, value] of Object.entries(upload.uploadFields)) {
  form.append(name, value);
}
form.append('file', file, file.name);
await fetch(upload.uploadUrl, { method: 'POST', body: form });

Envía los campos exactamente como se devolvieron y no añadas un encabezado de autorización personalizado al POST de almacenamiento.

3. Crea el trabajo de transcripción

POST /transcribe
Content-Type: application/json
x-api-key: YOUR_API_KEY

{
  "audio_url": "<fileUrl returned by POST /upload>",
  "model": "oracle"
}

POST /transcribe

Envía un archivo de audio para transcribirlo de forma asíncrona, con diarización de hablantes opcional.

Parámetros del cuerpo de la solicitud

Parámetro Tipo Obligatorio Descripción
audio_url string Obligatorio La URL de acceso público del archivo de audio o vídeo que se va a transcribir.
language string Opcional Indicación del código de idioma (p. ej., «he», «en», «es»). Si no se proporciona, el idioma se detectará automáticamente.
Default: "auto"
translate_to string Opcional Código del idioma al que se traducirá la transcripción (p. ej., «en», «es», «fr»). Si se proporciona, el texto de salida estará en el idioma indicado.
Nota: Este parámetro solo funciona con la familia de modelos Oracle.
word_timestamps boolean Opcional Indica si se deben incluir marcas de tiempo por palabra en JSON o SRT cuando el modelo seleccionado admite alineación de palabras. Oracle Mini habilita automáticamente la alineación para diarización de hablantes y separación de canales; la transcripción normal de Oracle Mini devuelve marcas de tiempo por segmento. No afecta a la salida TXT.
Valor predeterminado: true
model string Opcional Especifica el modelo de transcripción que se utilizará:
Modelos actuales:
• base: Transcripción económica con marcas de tiempo por palabra y diarización opcional, 0.40 créditos de uso/hora
• oracle_mini: nivel de traducción Oracle de menor precio con procesamiento opcional de hablantes, 0.80 créditos de uso/hora
• oracle: Nivel Oracle para producción, 1.20 créditos de uso/hora
• oracle_pro: Nivel Oracle prémium, 1.40 créditos de uso/hora
• oracle_max: Nivel Oracle de máxima calidad, 3.00 créditos de uso/hora
Modelos heredados:
• core: Modelo heredado más rápido, 1.00 créditos de uso/hora
• edge: Modelo heredado de mayor precisión, 1.20 créditos de uso/hora
Default: "core"
output_format string Opcional Formato deseado para la salida de la transcripción:
• json: Salida detallada con segmentos y marcas de tiempo
• txt: Transcripción en texto sin formato
• srt: Formato de subtítulos SubRip
Default: "json"
include_diarization boolean Opcional Indica si se debe habilitar la diarización de hablantes (identificación de distintos hablantes en el audio). Al habilitarla, los segmentos incluirán etiquetas de hablante. Oracle Mini habilita automáticamente la alineación de marcas de tiempo para este modo.
Valor predeterminado: false
pro_diarization boolean Opcional Activa el modelo premium de diarización de hablantes para una mayor precisión, especialmente en audio difícil. Añade 0,20 créditos por hora de audio. Oracle Mini habilita automáticamente la alineación de marcas de tiempo para este modo.
Valor predeterminado: false
num_speakers integer Opcional Número previsto de hablantes en el audio. Solo se utiliza cuando include_diarization es true. Si no se indica, el sistema detectará automáticamente el número de hablantes.
Valor predeterminado: auto
channel_speaker_separation string Opcional Separa el archivo de audio estéreo o multicanal indicado mediante audio_url por pistas físicas. Usa standard para hablantes que intervienen por turnos o overlap para habla superpuesta. No se puede combinar con diarización. Oracle Mini habilita automáticamente la alineación de marcas de tiempo para cualquiera de los modos de canal.
Default: "off"
channel_labels object Opcional Mapa opcional de índices de canal con base cero, por ejemplo {"0":"Agent","1":"Customer"}. Las etiquetas se devuelven en cada segmento y palabra.
webhook_url string Opcional URL HTTPS pública que recibe un POST cuando el trabajo de transcripción finaliza o falla. Devuelve cualquier código de estado 2xx para confirmar la entrega.
webhook_secret string Opcional Secreto opcional utilizado para firmar las cargas útiles del webhook. La cabecera de firma tiene el formato sha256=<hex digest>.

Solicitud de ejemplo (con diarización):

{
  "audio_url": "https://salford.figshare.com/ndownloader/files/14630270",
  "word_timestamps": true,
  "model": "edge",
  "output_format": "json",
  "include_diarization": true,
  "num_speakers": 2
}

Respuesta:

Devuelve un objeto que contiene el `jobId` de la tarea de transcripción enviada.

{
  "jobId": "34c63d45-4cb5-473b-bc60-25c175e69c57"
}

GET /transcribe/{jobId}

Recupera el estado y el resultado de un trabajo de transcripción concreto.

Parámetros de ruta

Parámetro Tipo Obligatorio Descripción
jobId string Obligatorio El ID del trabajo de transcripción, obtenido de la respuesta a POST /transcribe.

Cuerpo de la respuesta

Campo Tipo Descripción
jobId string El ID del trabajo de transcripción solicitado.
status string Estado actual del trabajo: PENDING, IN_PROGRESS, COMPLETED, o FAILED
result object | string La salida de la transcripción (solo aparece cuando el estado es COMPLETED). La estructura depende del valor de output_format solicitado.
error string Mensaje de error (solo aparece cuando el estado es FAILED).

Respuesta de ejemplo (salida JSON con diarización de hablantes):

{
  "jobId": "34c63d45-4cb5-473b-bc60-25c175e69c57",
  "status": "COMPLETED",
  "result": {
    "language": "en",
    "segments": [
      {
        "start": 0.5,
        "end": 3.2,
        "text": "Hello everyone, welcome to today's meeting.",
        "speaker": "Speaker 1",
        "words": [
          {
            "start": 0.5,
            "end": 0.8,
            "word": "Hello"
          },
          {
            "start": 0.9,
            "end": 1.4,
            "word": "everyone"
          }
        ]
      },
      {
        "start": 4.1,
        "end": 6.8,
        "text": "Thank you. Let's begin with the quarterly review.",
        "speaker": "Speaker 2",
        "words": [
          {
            "start": 4.1,
            "end": 4.5,
            "word": "Thank"
          },
          {
            "start": 4.6,
            "end": 4.9,
            "word": "you"
          }
        ]
      }
    ]
  }
}

Diarización de hablantes

La diarización de hablantes es el proceso de identificar y separar a los distintos hablantes de una grabación de audio. Cuando se activa, KolWrite analiza el audio para detectar los cambios de hablante y etiqueta cada segmento según corresponda.

La diarización de hablantes y la separación de canales están disponibles con todos los modelos indicados. Oracle Mini habilita automáticamente la alineación de marcas de tiempo siempre que se selecciona un modo de hablantes.

Cómo activar la diarización

Para activar la diarización de hablantes, establece el parámetro include_diarization en true en tu solicitud de transcripción:

{
  "audio_url": "https://example.com/meeting-audio.mp3",
  "include_diarization": true,
  "num_speakers": 3
}

Optimización del número de hablantes

Para obtener los mejores resultados, indica el número previsto de hablantes mediante el parámetro num_speakers . Si no conoces el número exacto, puedes:

Diarización Pro

Para obtener mayor precisión al identificar a los hablantes, sobre todo en condiciones acústicas complejas, puedes activar la diarización Pro. Esta función tiene un coste adicional de 0.20 créditos de uso por hora de audio.

Para utilizarla, establece el parámetro pro_diarization en true. Este parámetro puede usarse junto con include_diarization.

{
  "audio_url": "https://example.com/panel-discussion.mp3",
  "include_diarization": true,
  "pro_diarization": true
}

Separación de hablantes por canales

La separación por canales transcribe cada pista física de audio por separado y etiqueta los segmentos y las palabras devueltos con sus campos físicos channel y speaker. Requiere una fuente de entre dos y ocho canales indicada mediante audio_url y no se puede combinar con diarización normal o Pro. Oracle Mini habilita automáticamente la alineación de marcas de tiempo para cualquiera de los modos de canal.

Usar standard cuando los hablantes intervienen por turnos; se factura una sola tarifa de audio del modelo seleccionado. Usa overlap cuando los hablantes pueden solaparse; se factura la tarifa del modelo seleccionado por el mayor valor entre la duración de la grabación y el tiempo total de habla detectado en sus canales físicos.

{
  "audio_url": "https://example.com/stereo-call.wav",
  "model": "oracle",
  "channel_speaker_separation": "overlap",
  "channel_labels": {"0": "Agent", "1": "Customer"}
}

Webhooks de finalización

Establece webhook_url para recibir transcription.completed y transcription.failed eventos. Los envíos fallidos se vuelven a intentar, pero los clientes deben seguir admitiendo GET /transcribe/{jobId} como fuente de referencia.

{
  "audio_url": "https://example.com/meeting-audio.mp3",
  "output_format": "json",
  "webhook_url": "https://example.com/kolwrite-webhook",
  "webhook_secret": "replace-with-your-secret"
}

Cada envío incluye X-KolWrite-Event, X-KolWrite-Job-Id, X-KolWrite-Delivery-Id, y X-KolWrite-Timestamp. La entrega se realiza al menos una vez; los reintentos reutilizan el mismo ID de entrega, así que elimina los eventos duplicados mediante X-KolWrite-Delivery-Id. Cuando haya un secreto configurado, calcula HMAC-SHA256 sobre timestamp + "." + raw_request_body y compáralo con X-KolWrite-Signature.

{
  "event": "transcription.completed",
  "jobId": "34c63d45-4cb5-473b-bc60-25c175e69c57",
  "status": "COMPLETED",
  "createdAt": "2026-07-10T09:30:00+00:00",
  "model": "base",
  "output_format": "json",
  "result_available": true,
  "result_omitted": false,
  "result_size_bytes": 12480,
  "result": { "language": "en", "segments": [] }
}

Para output_format: "json", el webhook result es un objeto JSON. Los resultados TXT y SRT se entregan como cadenas.

En los resultados de gran tamaño, se puede establecer result_omitted en true; obtén el resultado completo de GET /transcribe/{jobId}. Los eventos fallidos incluyen un campo error campo.

Formato de salida con diarización

Cuando la diarización está activada, cada segmento de la salida JSON incluye el campo speaker que identifica al hablante (p. ej., «Hablante 1», «Hablante 2», etc.).

Formatos de salida

Formato JSON

Salida detallada con segmentos, marcas de tiempo y datos opcionales por palabra.

Formato TXT

Transcripción en texto sin formato con etiquetas de hablante (cuando la diarización está activada).

Formato SRT

Formato de subtítulos SubRip con marcas de tiempo, compatible con reproductores de vídeo y editores de subtítulos.

Estado del servicio

Consulta la página de estado de la API de KolWrite para consultar la disponibilidad en tiempo real, el historial de actividad y los incidentes del nivel de servicio.

GET /health no requiere una clave de API y devuelve el estado actual de la API, la recepción de trabajos y el procesamiento de transcripciones. Una respuesta 200 significa que el servicio está operativo o degradado; una respuesta 503 significa que el estado actual es desconocido o no está disponible. Ambas respuestas incluyen detalles de estado en JSON.

GET /health/history?period=24h devuelve un historial de disponibilidad compacto. Los periodos admitidos son 24h, 7d, y 30d.

Códigos de estado

Estado Descripción
PENDING El trabajo está en cola a la espera de ser procesado.
IN_PROGRESS Nuestro servicio de transcripción está procesando el trabajo.
COMPLETED El trabajo ha finalizado correctamente. Los resultados están disponibles en la respuesta.
FAILED No se ha podido procesar el trabajo. Consulta el mensaje de error para obtener más información.