WizCut API
Multicam-Podcast-Schnitt programmatisch steuern: Dateien hochladen, verarbeiten und rendern mit der WizCut API.
Die WizCut API ermöglicht die vollständige Automatisierung des Multicam-Podcast-Schnitts. Du lädst deine Kameraaufnahmen hoch, WizCut erkennt die Sprecher und generiert Schnitte, du kannst diese optional in einem gehosteten Editor prüfen – und erhältst anschließend das fertige Video per Webhook.
Authentifizierung
Erstell einen API-Key unter wizcut.com/settings und füge ihn in jede Anfrage ein:
Authorization: Bearer wc_live_your_key_here
Keys lassen sich jederzeit auf der Einstellungsseite widerrufen.
Job anlegen
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
}
Felder:
| Feld | Typ | Beschreibung |
|---|---|---|
sources | array | Kamerawinkel oder Audiodateien. Jeder Eintrag hat ein label, optionales kind ("video" oder "audio", Standard: "video") und optionales ext (Standard: "mp4"). |
tracks | array | Zuordnung von Sprechern zu Quellen. Mit leerem speakers-Array [] weist WizCut die Sprecher nach der Analyse automatisch zu. |
callbackUrl | string | URL, an die Webhook-Benachrichtigungen bei Statusänderungen gesendet werden. |
review | boolean | Standard: true. Bei true pausiert der Job im Status „ready”, damit ein Mensch die Schnitte vor dem Render prüfen kann. Bei false startet das Rendering automatisch, sobald das Speaker-Mapping abgeschlossen ist. |
Antwort:
{
"jobId": "uuid",
"uploadUrls": {
"source-uuid-1": "https://presigned-upload-url...",
"source-uuid-2": "https://presigned-upload-url..."
}
}
Dateien hochladen
Lade deine Videodateien per PUT-Anfrage an die jeweiligen presigned URLs aus der Antwort. Ein Auth-Header ist nicht erforderlich – die URLs sind selbst-authentifizierend.
curl -X PUT -T camera1.mp4 "https://presigned-upload-url..."
curl -X PUT -T camera2.mp4 "https://presigned-upload-url..."
Verarbeitung starten
POST /api/jobs/{jobId}/process
Dieser Aufruf startet die Pipeline: Audio-Sync, Sprechererkennung, Schnittgenerierung und Proxy-Rendering. Die Anfrage kehrt sofort zurück – die Verarbeitung läuft asynchron.
Antwort:
{ "jobId": "uuid", "status": "syncing" }
Job-Status abfragen
GET /api/jobs/{jobId}
Gibt das vollständige Job-Objekt zurück, einschließlich aktuellem Status, Quellen, Turns und Schnitten.
Statuswerte:
| Status | Bedeutung |
|---|---|
created | Job angelegt, wartet auf Uploads |
syncing | Audio-Synchronisation zwischen den Quellen |
diarizing | Sprechererkennung läuft |
mapping | Speaker-to-Source-Zuordnung erforderlich |
ready | Schnitte generiert, bereit zur Prüfung oder zum Rendering |
rendering | Finales Rendering läuft |
complete | Rendering abgeschlossen, output_url verfügbar |
approved | Ausgabe von einem Menschen bestätigt |
failed | Fehler aufgetreten, Details in error_message |
Webhooks
Wenn du eine callbackUrl angibst, sendet WizCut POST-Anfragen bei Statusübergängen:
Webhook „mapping” (Sprecher erkannt, Zuordnung erforderlich):
{
"jobId": "uuid",
"status": "mapping",
"reviewUrl": "https://wizcut.com/jobs/uuid/edit?reviewToken=..."
}
Schick einen Menschen zur reviewUrl, um Sprecher den Kameraquellen zuzuordnen und die Schnitte zu prüfen.
Webhook „ready” (Speaker-Mapping abgeschlossen, Schnitte generiert):
{
"jobId": "uuid",
"status": "ready",
"reviewUrl": "https://wizcut.com/jobs/uuid/edit?reviewToken=..."
}
Webhook „complete” (Rendering abgeschlossen):
{
"jobId": "uuid",
"status": "complete",
"outputUrl": "https://presigned-download-url..."
}
Webhook „approved” (Mensch hat die Ausgabe über das Review-UI bestätigt):
{
"jobId": "uuid",
"status": "approved",
"outputUrl": "https://presigned-download-url..."
}
Webhook „failed”:
{
"jobId": "uuid",
"status": "failed",
"error": "description of what went wrong"
}
Speaker-Mapping und Review (Human-in-the-loop)
Nach der Sprechererkennung wechselt der Job in den Status „mapping”. Ein Mensch muss die erkannten Sprecher den Kameraquellen zuordnen – die Diarisierung bestimmt wann jemand spricht, aber nicht auf welcher Kamera die Person zu sehen ist.
Der Webhook „mapping” enthält eine reviewUrl – ein signierter Link zum WizCut-Editor. Schick einen Menschen dorthin. Im Editor nimmt er folgende Schritte vor:
- Jeden erkannten Sprecher einer Kameraquelle zuordnen
- Die automatisch generierten Schnitte in der Vorschau prüfen und bearbeiten
- Auf „Render” klicken, wenn alles stimmt (bei
review: true, dem Standard) - Optional auf „Approve” klicken, nachdem die gerenderte Ausgabe geprüft wurde
Bei review: false startet das Rendering automatisch, sobald das Speaker-Mapping abgeschickt wird – eine Prüfung der Schnitte vor dem Render entfällt.
Erweitert: Schnitte programmatisch steuern
Für vollständig automatisierte Pipelines, die das UI komplett umgehen, lassen sich Schnitte und Rendering über die API steuern:
Schnitte aktualisieren:
PATCH /api/jobs/{jobId}/cuts
{
"cuts": [
{ "startMs": 0, "endMs": 5000, "sourceId": "source-uuid-1" },
{ "startMs": 5000, "endMs": 12000, "sourceId": "source-uuid-2" }
]
}
Render auslösen:
POST /api/jobs/{jobId}/render
Ausgabe bestätigen:
POST /api/jobs/{jobId}/approve
Fehlerantworten
Alle Endpunkte liefern Fehler in diesem Format:
{ "error": "Description of what went wrong" }
Häufige HTTP-Statuscodes:
| Code | Bedeutung |
|---|---|
| 401 | Fehlender oder ungültiger API-Key |
| 403 | Kontingent überschritten |
| 404 | Job nicht gefunden oder nicht in deinem Besitz |
| 409 | Ungültiger Statusübergang (z. B. Rendering eines Jobs, der noch nicht „ready” ist) |
| 500 | Serverfehler |
| 503 | Dienst nicht verfügbar |
Vollständiger Ablauf
Der komplette Happy-Path für einen KI-Agenten oder eine Automatisierung:
# 1. Job mit zwei Kameras anlegen
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. Videodateien an die presigned URLs hochladen
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. Verarbeitung starten
curl -s -X POST "https://wizcut.com/api/jobs/$JOB_ID/process" \
-H "Authorization: Bearer wc_live_your_key"
# 4. Auf Webhook warten: { status: "mapping", reviewUrl: "..." }
# Einen Menschen zur reviewUrl schicken, um Sprecher zuzuordnen und Schnitte zu prüfen
# 5. Mensch ordnet Sprecher zu → bearbeitet Schnitte → klickt im Editor auf Render
# Auf Webhook warten: { status: "complete", outputUrl: "..." }
# 6. Fertig gerendetes Video von outputUrl herunterladen
Mit automatischem Render nach dem Mapping (review: false):
# Wie oben, aber "review": false in Schritt 1 ergänzen
# Der Mensch ordnet weiterhin Sprecher unter der reviewUrl zu (Schritt 4)
# Das Rendering startet jedoch automatisch nach dem Mapping – keine Schnittprüfung
# Ergebnis: { status: "complete", outputUrl: "..." }