WizCut API
Envie, processe e renderize edições de podcasts multicam de forma programática com a WizCut API.
A WizCut API deixa você automatizar a edição de podcasts multicam. Envie os ângulos de câmera, deixa o WizCut detectar os participantes e gerar os cortes, opcionalmente revise tudo num editor hospedado, e receba o vídeo renderizado de volta via webhook.
Autenticação
Crie uma API key em wizcut.com/settings. Coloca ela em toda requisição:
Authorization: Bearer wc_live_your_key_here
As keys podem ser revogadas a qualquer momento pela página de configurações.
Criar um 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
}
Campos:
| Campo | Tipo | Descrição |
|---|---|---|
sources | array | Ângulos de câmera ou arquivos de áudio. Cada um tem label, kind opcional ("video" ou "audio", padrão "video"), ext opcional (padrão "mp4"). |
tracks | array | Mapeamento de participantes pra fontes. Passe speakers vazio [] pra deixar o WizCut atribuir automaticamente depois da análise. |
callbackUrl | string | URL pra receber notificações via webhook nas mudanças de status. |
review | boolean | Padrão true. Quando true, o job pausa no status “ready” pra revisão humana dos cortes antes de renderizar. Quando false, a renderização começa automaticamente assim que o mapeamento de participantes é enviado. |
Resposta:
{
"jobId": "uuid",
"uploadUrls": {
"source-uuid-1": "https://presigned-upload-url...",
"source-uuid-2": "https://presigned-upload-url..."
}
}
Fazer upload dos arquivos
Envie seus arquivos de vídeo via PUT pra cada URL presigned da resposta. Não precisa de header de autenticação — a URL já se autentica sozinha.
curl -X PUT -T camera1.mp4 "https://presigned-upload-url..."
curl -X PUT -T camera2.mp4 "https://presigned-upload-url..."
Iniciar o processamento
POST /api/jobs/{jobId}/process
Isso dispara o pipeline: sincronização de áudio, detecção de participantes, geração de cortes e render do proxy. A requisição retorna imediatamente — o processamento acontece de forma assíncrona.
Resposta:
{ "jobId": "uuid", "status": "syncing" }
Consultar o status do job
GET /api/jobs/{jobId}
Retorna o objeto completo do job, incluindo status atual, fontes, turnos e cortes.
Valores de status:
| Status | Significado |
|---|---|
created | Job criado, aguardando uploads |
syncing | Alinhando o áudio entre as fontes |
diarizing | Detectando os participantes |
mapping | Aguarda mapeamento de participantes pras fontes |
ready | Cortes gerados, pronto pra revisão ou renderização |
rendering | Render final em andamento |
complete | Render concluído, output_url disponível |
approved | Output aprovado por uma pessoa |
failed | Algo deu errado, veja error_message |
Webhooks
Quando você fornece um callbackUrl, o WizCut envia requisições POST nas transições de status:
Webhook “mapping” (participantes detectados, precisa de mapeamento humano):
{
"jobId": "uuid",
"status": "mapping",
"reviewUrl": "https://wizcut.com/jobs/uuid/edit?reviewToken=..."
}
Manda uma pessoa pra reviewUrl pra mapear os participantes nas fontes de câmera e revisar os cortes.
Webhook “ready” (mapeamento de participantes completo, cortes gerados):
{
"jobId": "uuid",
"status": "ready",
"reviewUrl": "https://wizcut.com/jobs/uuid/edit?reviewToken=..."
}
Webhook “complete” (render finalizado):
{
"jobId": "uuid",
"status": "complete",
"outputUrl": "https://presigned-download-url..."
}
Webhook “approved” (output aprovado via interface de revisão):
{
"jobId": "uuid",
"status": "approved",
"outputUrl": "https://presigned-download-url..."
}
Webhook “failed”:
{
"jobId": "uuid",
"status": "failed",
"error": "description of what went wrong"
}
Mapeamento de participantes e revisão (human-in-the-loop)
Depois da detecção de participantes, o job entra no status “mapping”. Uma pessoa precisa mapear os participantes detectados nas fontes de câmera — a diarization identifica quando alguém fala, mas não em qual câmera essa pessoa aparece.
O webhook “mapping” inclui uma reviewUrl — um link assinado pro editor do WizCut. Manda uma pessoa pra lá. No editor, ela vai:
- Mapear cada participante detectado pra uma fonte de câmera
- Visualizar e editar os cortes gerados automaticamente
- Clicar em “Render” quando estiver satisfeita (se
review: true, que é o padrão) - Opcionalmente clicar em “Approve” depois de revisar o output renderizado
Com review: false, a renderização começa automaticamente assim que o mapeamento de participantes é enviado — a pessoa não tem a chance de revisar os cortes antes de renderizar.
Avançado: controle programático dos cortes
Pra pipelines totalmente automatizados que pulam a interface, você pode gerenciar os cortes e a renderização via API:
Atualizar cortes:
PATCH /api/jobs/{jobId}/cuts
{
"cuts": [
{ "startMs": 0, "endMs": 5000, "sourceId": "source-uuid-1" },
{ "startMs": 5000, "endMs": 12000, "sourceId": "source-uuid-2" }
]
}
Acionar renderização:
POST /api/jobs/{jobId}/render
Aprovar output:
POST /api/jobs/{jobId}/approve
Respostas de erro
Todos os endpoints retornam erros neste formato:
{ "error": "Description of what went wrong" }
Códigos HTTP comuns:
| Código | Significado |
|---|---|
| 401 | API key ausente ou inválida |
| 403 | Cota excedida |
| 404 | Job não encontrado ou não pertence a você |
| 409 | Transição de status inválida (ex.: renderizar um job que ainda não tá pronto) |
| 500 | Erro no servidor |
| 503 | Serviço indisponível |
Fluxo completo
O caminho feliz completo pra um agente de IA ou automação:
# 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
Com render automático após o mapeamento (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: "..." }