Editor Web
← Back to docs

API de WizCut

Subí, procesá y renderizá ediciones de podcasts multicam de forma programática con la API de WizCut.

La API de WizCut te permite automatizar la edición de podcasts multicam. Subís los ángulos de cámara, WizCut detecta los speakers y genera los cortes, opcionalmente los revisás en un editor online, y recibís el video renderizado por webhook.

Autenticación

Creá una API key en wizcut.com/settings. Incluila en cada request:

Authorization: Bearer wc_live_your_key_here

Las keys se pueden revocar en cualquier momento desde la página de configuración.

Crear un job

POST /api/jobs
{
  "sources": [
    { "label": "Camera 1", "kind": "video", "ext": "mp4" },
    { "label": "Camera 2", "kind": "video", "ext": "mp4" }
  ],
  "tracks": [
    { "sourceId": "auto", "speakers": [] }
  ],
  "callbackUrl": "https://your-server.com/webhook",
  "review": true,
  "silence": { "mode": "tighten" }
}

Campos:

CampoTipoDescripción
sourcesarrayÁngulos de cámara o archivos de audio. Cada uno tiene label, kind opcional ("video" o "audio", por defecto "video"), y ext opcional (por defecto "mp4").
tracksarrayMapeo de speakers a fuentes. Pasá speakers vacíos [] para que WizCut los asigne automáticamente después del análisis.
callbackUrlstringURL que recibe las notificaciones webhook en los cambios de estado.
reviewbooleanPor defecto true. Con true, el job se pausa en “ready” para que un humano revise los cortes antes del render. Con false, el render arranca automáticamente después de que se envía el mapeo de speakers.
silenceobjectOpcional. Eliminación automática de pausas — ver Eliminación de silencios. Si se omite, está desactivado.

Respuesta:

{
  "jobId": "uuid",
  "uploadUrls": {
    "source-uuid-1": "https://presigned-upload-url...",
    "source-uuid-2": "https://presigned-upload-url..."
  }
}

Subir archivos

Hacé PUT de los archivos de video a cada URL prefirmada que devuelve la respuesta. No necesitás header de autenticación — la URL ya trae la autenticación incorporada.

curl -X PUT -T camera1.mp4 "https://presigned-upload-url..."
curl -X PUT -T camera2.mp4 "https://presigned-upload-url..."

Iniciar el procesamiento

POST /api/jobs/{jobId}/process

Esto arranca el pipeline: sincronización de audio, detección de speakers, generación de cortes y render de proxy. El request devuelve inmediatamente — el procesamiento ocurre de forma asincrónica.

Respuesta:

{ "jobId": "uuid", "status": "syncing" }

Ver el estado del job

GET /api/jobs/{jobId}

Devuelve el objeto completo del job, incluyendo el estado actual, fuentes, turnos y cortes.

Valores de estado:

EstadoSignificado
createdJob creado, esperando las subidas
syncingAlineando audio entre las fuentes
diarizingDetectando speakers
mappingNecesita mapeo de speaker a fuente
readyCortes generados, listo para revisión o render
renderingRender final en progreso
completeRender terminado, output_url disponible
approvedUn humano aprobó el resultado
failedAlgo salió mal, revisá error_message

Webhooks

Cuando proporcionás una callbackUrl, WizCut envía requests POST en cada transición de estado:

Webhook “mapping” (speakers detectados, necesita mapeo humano):

{
  "jobId": "uuid",
  "status": "mapping",
  "reviewUrl": "https://wizcut.com/jobs/uuid/edit?reviewToken=..."
}

Mandá a alguien a la reviewUrl para mapear los speakers a las fuentes de cámara y revisar los cortes.

Webhook “ready” (mapeo de speakers completo, cortes generados):

{
  "jobId": "uuid",
  "status": "ready",
  "reviewUrl": "https://wizcut.com/jobs/uuid/edit?reviewToken=..."
}

Webhook “complete” (render terminado):

{
  "jobId": "uuid",
  "status": "complete",
  "outputUrl": "https://presigned-download-url..."
}

Webhook “approved” (humano aprobó desde la UI de revisión):

{
  "jobId": "uuid",
  "status": "approved",
  "outputUrl": "https://presigned-download-url..."
}

Webhook “failed”:

{
  "jobId": "uuid",
  "status": "failed",
  "error": "description of what went wrong"
}

Mapeo de speakers y revisión (human-in-the-loop)

Después de la detección de speakers, el job pasa al estado “mapping”. Un humano tiene que mapear los speakers detectados a las fuentes de cámara — esta detección identifica cuándo habla alguien, pero no en qué cámara está.

El webhook “mapping” incluye una reviewUrl — un link firmado al editor de WizCut. Mandá a alguien ahí. En el editor, la persona:

  1. Mapea cada speaker detectado a una fuente de cámara
  2. Previsualiza y edita los cortes generados automáticamente
  3. Hace clic en “Render” cuando está listo (si review: true, que es el valor por defecto)
  4. Opcionalmente hace clic en “Approve” después de revisar el resultado renderizado

Con review: false, el render arranca automáticamente en cuanto se envía el mapeo de speakers — la persona no tiene la opción de revisar los cortes antes del render.

Eliminación de silencios

WizCut puede acortar o eliminar automáticamente las pausas largas antes de generar los cortes. Esto pasa primero, así que el cambio de cámara se decide sobre la conversación ya ajustada: nunca vas a terminar con un corte a una cámara que pierde de inmediato la mayor parte de su tiempo en pantalla por una pausa eliminada.

Activalo con el campo silence al crear un job:

{ "silence": { "mode": "tighten" } }

Modos:

ModoComportamiento
offMantiene todas las pausas tal como se grabaron (valor por defecto cuando se omite silence).
tightenAcorta las pausas largas a un compás natural (~0.7s). Recomendado: mantiene la conversación sonando humana.
removeCorta las pausas largas casi por completo, dejando apenas el padding necesario para no cortar palabras.

Ajustes finos opcionales (los valores por defecto funcionan bien para la mayoría de las grabaciones):

CampoPor defectoRangoDescripción
minPauseSec1.50.3–10Solo se tocan las pausas más largas que este valor.
keepPauseSec0.70–3El compás que queda en lugar de una pausa ajustada (solo en el modo tighten).
paddingSec0.250–1Margen de seguridad que se mantiene alrededor del habla en cada rango eliminado.

La detección es conservadora: una pausa solo se elimina cuando la detección de speakers y un análisis de energía del audio coinciden en que es silencio, así que las risas y otros momentos que no son habla se conservan.

El objeto del job (GET /api/jobs/{jobId}) incluye removed_ranges, los tramos eliminados en tiempo de la fuente como { startMs, endMs }, junto con cuts. El render final se salta estos rangos; el editor de revisión los muestra como secciones rayadas que se pueden restaurar.

Cambialo después del procesamiento con el endpoint de recut:

POST /api/jobs/{jobId}/recut
{ "silence": { "mode": "remove", "minPauseSec": 1.0 } }

Recut regenera los cortes y los rangos eliminados a partir de los speakers ya detectados, sin reprocesar, así que devuelve la respuesta de inmediato con los nuevos cuts, removedRanges y savedMs (cuánto más corto queda el resultado). Pasá { "mode": "off" } para desactivar la eliminación de silencios de nuevo; omití silence por completo para mantener la configuración guardada del job.

Nota sobre facturación: el uso se mide en minutos de entrada (el material que subís), así que la eliminación de silencios no cambia lo que cuesta un job, solo hace que el resultado quede más ajustado.

Avanzado: control programático de cortes

Para pipelines completamente automatizados que saltean la UI por completo, podés gestionar los cortes y el render por API:

Actualizar cortes:

PATCH /api/jobs/{jobId}/cuts
{
  "cuts": [
    { "startMs": 0, "endMs": 5000, "sourceId": "source-uuid-1" },
    { "startMs": 5000, "endMs": 12000, "sourceId": "source-uuid-2" }
  ]
}

El mismo endpoint también acepta removedRanges (un array de { startMs, endMs }) para editar directamente los tramos de eliminación de silencios, por ejemplo para restaurar una pausa que la pasada automática eliminó. Podés mandar cuts, removedRanges, o los dos.

Disparar el render:

POST /api/jobs/{jobId}/render

Aprobar el resultado:

POST /api/jobs/{jobId}/approve

Respuestas de error

Todos los endpoints devuelven errores en este formato:

{ "error": "Description of what went wrong" }

Códigos de estado HTTP más comunes:

CódigoSignificado
401API key faltante o inválida
403Cuota superada
404Job no encontrado o no te pertenece
409Transición de estado inválida (ej. renderizar un job que no está listo)
500Error del servidor
503Servicio no disponible

Flujo completo

Acá está el camino feliz completo para un agente de IA o una automatización:

# 1. Create a job with two cameras
JOB=$(curl -s -X POST https://wizcut.com/api/jobs \
  -H "Authorization: Bearer wc_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "sources": [
      {"label": "Camera 1", "kind": "video"},
      {"label": "Camera 2", "kind": "video"}
    ],
    "callbackUrl": "https://your-server.com/webhook"
  }')

JOB_ID=$(echo $JOB | jq -r '.jobId')

# 2. Upload video files to the presigned URLs
curl -X PUT -T camera1.mp4 "$(echo $JOB | jq -r '.uploadUrls | to_entries[0].value')"
curl -X PUT -T camera2.mp4 "$(echo $JOB | jq -r '.uploadUrls | to_entries[1].value')"

# 3. Start processing
curl -s -X POST "https://wizcut.com/api/jobs/$JOB_ID/process" \
  -H "Authorization: Bearer wc_live_your_key"

# 4. Wait for webhook: { status: "mapping", reviewUrl: "..." }
#    Send a human to reviewUrl to map speakers and review cuts

# 5. Human maps speakers → edits cuts → clicks Render in the editor
#    Wait for webhook: { status: "complete", outputUrl: "..." }

# 6. Download the rendered video from outputUrl

Con render automático después del mapeo (review: false):

# Same as above, but add "review": false to step 1
# Human still maps speakers at the reviewUrl (step 4)
# But rendering starts automatically after mapping — no cut review step
# You'll get: { status: "complete", outputUrl: "..." }

Integraciones

¿Preferís no escribir código? Podés manejar la API de WizCut desde plataformas de automatización sin necesidad de armar los requests a mano.

n8n

Mantenemos una integración oficial con n8n: el nodo de comunidad verificado @wizcut/n8n-nodes-wizcut. Instalalo desde Settings → Community Nodes en n8n (al estar verificado, también está disponible en n8n Cloud).

Incluye dos nodos:

  • WizCut: acciones para Create Job, Get Job, Start Processing, Start Render y Approve.
  • WizCut Trigger: un webhook trigger que arranca tu workflow cada vez que un job cambia de estado (mapping, ready, complete, approved).

Apuntá la URL del trigger a la callbackUrl de tu job y tenés un pipeline completamente event-driven. Por ejemplo, podés notificar a Slack cuando se detectan los speakers, arrancar el render automáticamente cuando los cortes están listos, y publicar el link de descarga cuando el episodio está terminado. Los dos nodos también funcionan como tools para agentes de IA de n8n.

¿Querés arrancar con algo ya armado? Usá el template disponible: Notify and manage podcast edit status with WizCut and Slack.

Más plataformas

Las integraciones con Make.com y Zapier están en el roadmap. Si estás trabajando en otra plataforma o necesitás un template de workflow para tu setup específico, contactá a soporte de WizCut. Los pedidos de nuevas funciones son bienvenidos.

API de WizCut – WizCut Docs