So nutzt du WizCut

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, ermittelt, wer auf welcher Kamera zu sehen ist, und generiert Schnitte. Du kannst sie 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", "fileSize": 2147483648 },
    { "label": "Camera 2", "kind": "video", "ext": "mp4", "fileSize": 1932735283 },
    { "label": "Mic mix", "kind": "audio", "ext": "wav" }
  ],
  "callbackUrl": "https://your-server.com/webhook",
  "review": true,
  "autoMap": "confident",
  "silence": { "mode": "tighten" }
}

Felder:

FeldTypBeschreibung
sourcesarrayKamerawinkel oder Audiodateien, bis zu 12 pro Job. Für die Verarbeitung braucht ein Job mindestens zwei Videoquellen. Jeder Eintrag hat ein label, optionales kind ("video" oder "audio", Standard: "video"), optionales ext (mp4, mov, webm, mkv, wav, mp3, m4a oder aac; Standard: "mp4" bei Video, "wav" bei Audio) sowie optionales fileSize in Bytes.
callbackUrlstringOptional. URL, an die Webhook-Benachrichtigungen gesendet werden, siehe Webhooks.
reviewbooleanStandard: 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 die Sprecher-Zuordnung abgeschickt wird, egal ob von einem Menschen, von deinem Code oder von WizCut selbst.
autoMapstringStandard: "confident". Legt fest, ob WizCut selbst entscheiden darf, wer auf welcher Kamera zu sehen ist: "off", "confident" oder "always", siehe Automatische Kamerazuordnung.
silenceobjectOptional. Automatisches Entfernen von Pausen, siehe Pausen entfernen. Ohne Angabe ist die Funktion deaktiviert.

Die Sprecher-Zuordnung (tracks) kannst du hier nicht mitgeben: Source-IDs gibt es erst, nachdem der Job angelegt ist, es gibt also noch nichts, dem sich ein Sprecher zuweisen ließe. Eine tracks-Liste mit Sprechern wird mit 400 und "code": "TRACKS_ON_CREATE" abgelehnt. Nutze autoMap oder ordne die Sprecher per API zu, sobald die Sprechererkennung abgeschlossen ist.

Gib fileSize für jede Datei an, deren Größe du kennst. Dateien über 100 MB bekommen dann einen Multipart-Upload. Damit kannst du Teile parallel hochladen und einzelne Teile wiederholen, und nur so lassen sich Dateien über 5 GB hochladen. Ohne fileSize bekommt jede Datei einen einzelnen presigned PUT.

Antwort:

{
  "jobId": "uuid",
  "uploads": {
    "source-uuid-1": {
      "method": "multipart",
      "uploadId": "...",
      "key": "sources/uuid/source-uuid-1.mp4",
      "partSize": 52428800,
      "partCount": 41,
      "urls": ["https://presigned-part-1-url...", "https://presigned-part-2-url...", "..."]
    },
    "source-uuid-3": {
      "method": "put",
      "url": "https://presigned-upload-url..."
    }
  },
  "audioUploads": { "...": "..." }
}

uploads ist nach den von WizCut vergebenen Source-IDs geschlüsselt, in derselben Reihenfolge wie dein sources-Array. audioUploads kannst du ignorieren. Das Feld nutzen die WizCut-Apps, die vor dem Video schon eine extrahierte Audiospur hochladen.

Dateien hochladen

Für die presigned URLs ist kein Auth-Header nötig, denn sie authentifizieren sich selbst.

"method": "put": die komplette Datei innerhalb einer Stunde per PUT an url senden:

curl -X PUT -T mic-mix.wav "https://presigned-upload-url..."

"method": "multipart": die Datei in partSize große Teile zerlegen (der letzte ist kürzer) und Teil n per PUT an die URL für Teil n senden:

  1. urls enthält die URLs für die ersten Teile (urls[0] ist Teil 1). Weitere fragst du bei Bedarf nach, bis zu 16 pro Anfrage:

    POST /api/jobs/{jobId}/sources/{sourceId}/parts
    
    { "uploadId": "...", "partNumbers": [5, 6, 7, 8] }
    

    Die Antwort ordnet Teilnummern URLs zu: { "urls": { "5": "https://...", "6": "https://..." } }. Teil-URLs sind zwei Stunden gültig, hol sie dir also erst kurz, bevor du sie brauchst.

  2. Sobald jeder Teil hochgeladen ist, schließt du den Upload ab:

    POST /api/uploads/complete
    
    { "key": "sources/uuid/source-uuid-1.mp4", "uploadId": "..." }
    

Um einen Upload abzubrechen, schick denselben Body an POST /api/uploads/abort.

Verarbeitung starten

POST /api/jobs/{jobId}/process

Ruf das erst auf, wenn alle Dateien hochgeladen sind. Der Aufruf startet die Pipeline: Audio-Sync, Sprechererkennung, Proxy-Rendering, Kamerazuordnung und Schnittgenerierung. Die Anfrage kehrt sofort zurück, die Verarbeitung läuft asynchron.

Optionaler Body:

{ "diarizeSourceIds": ["source-uuid-3"] }

diarizeSourceIds legt fest, welche Quellen WizCut für die Sprechererkennung auswertet. Lässt du das Feld weg, nutzt WizCut deine audio-Quellen oder, falls keine vorhanden sind, die erste Quelle. Wähl die Quellen mit dem saubersten Ton aller Sprecher: Eine Kamera mit stummgeschaltetem oder weit entferntem Mikrofon führt zu einem Job ohne Schnitte.

Antwort:

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

Jobs auflisten

GET /api/jobs

Liefert { "jobs": [...] } mit deinen 50 neuesten Jobs, die neuesten zuerst. Jeder Job hat id, title, status, created_at und updated_at.

Job-Status abfragen

GET /api/jobs/{jobId}

Antwort:

{
  "job": {
    "id": "uuid",
    "status": "complete",
    "sources": [...],
    "tracks": [...],
    "turns": [...],
    "cuts": [...],
    "removed_ranges": [...],
    "camera_map": {...},
    "output_url": "https://presigned-download-url...",
    "error_message": null
  },
  "sourceUrls": { "source-uuid-1": "https://..." },
  "audioUrl": "https://..."
}

Der eigentliche Job steckt unter job. Signierte URLs in der Antwort (output_url, sourceUrls, audioUrl) werden bei jeder Anfrage neu signiert, ruf den Job also lieber erneut ab, statt sie zu speichern.

camera_map ist der Vorschlag von WizCut, wer auf welcher Kamera zu sehen ist, siehe Die Camera Map. Bis zur Berechnung ist der Wert null.

Statuswerte:

StatusBedeutung
createdJob angelegt, wartet auf Uploads
uploadingWartet, bis alle Dateien hochgeladen sind (z. B. nachdem ein fehlgeschlagener Job neu gestartet wurde)
syncingAudio-Synchronisation zwischen den Quellen
diarizingSprechererkennung läuft
mappingSprecher erkannt. WizCut ermittelt noch, wer auf welcher Kamera zu sehen ist, oder ein Mensch (bzw. dein Agent) muss die Zuordnung bestätigen
readySchnitte generiert, bereit zur Prüfung oder zum Rendering
renderingFinales Rendering läuft
completeRendering abgeschlossen, output_url verfügbar
approvedAusgabe von einem Menschen bestätigt
failedFehler aufgetreten, Details in error_message

Job löschen

DELETE /api/jobs/{jobId}

Löscht den Job und alle zugehörigen Dateien: Uploads, Proxys, das Audio für die Sprechererkennung und das fertige Video. Funktioniert in jedem Status; läuft gerade noch ein Verarbeitungsschritt, wird dessen Ergebnis entfernt, sobald er fertig ist. Bereits verbrauchte Minuten werden nicht gutgeschrieben. Antwort: { "ok": true }, oder 404, wenn der Job nicht existiert oder nicht dir gehört.

Webhooks

Wenn du eine callbackUrl angibst, sendet WizCut eine JSON-POST-Anfrage, sobald ein Job einen der folgenden Status erreicht. WizCut versucht jede Zustellung bis zu dreimal und wartet jeweils bis zu 10 Sekunden auf eine Antwort deines Endpoints.

Webhooks sind noch nicht signiert. Behandle einen eingehenden Webhook deshalb als Signal, den Job per GET /api/jobs/{jobId} abzurufen, statt seinem Inhalt zu vertrauen. Frag den Status zusätzlich per Polling ab, falls eine Zustellung verloren geht.

Webhook „mapping” (ein Mensch muss bestätigen, wer auf welcher Kamera zu sehen ist):

{
  "jobId": "uuid",
  "status": "mapping",
  "reviewUrl": "https://wizcut.com/jobs/uuid/edit?reviewToken=...",
  "speakers": ["SPEAKER_00", "SPEAKER_01"],
  "cameraMap": {
    "version": 1,
    "speakers": ["SPEAKER_00", "SPEAKER_01"],
    "unassignedSpeakers": ["SPEAKER_01"],
    "droppedSpeakers": [],
    "cameras": [
      { "sourceId": "source-uuid-1", "kind": "closeup", "confidence": "high", "speakers": ["SPEAKER_00"], "...": "..." },
      { "sourceId": "source-uuid-2", "kind": "closeup", "confidence": "low", "speakers": ["SPEAKER_01"], "...": "..." }
    ]
  }
}

Schick einen Menschen zur reviewUrl, um Sprecher den Kameraquellen zuzuordnen und die Schnitte zu prüfen, oder ordne sie per API zu. Review-Links sind 72 Stunden gültig. speakers listet die erkannten Sprecher auf, der gesprächigste zuerst.

cameraMap ist der Vorschlag von WizCut, im selben Format wie camera_map am Job, siehe Die Camera Map. Gibt es noch keinen Vorschlag, fehlt das Feld.

Wann dieser Webhook eintrifft, hängt von autoMap ab:

  • "confident" oder "always": Der Job bleibt ohne Webhook im Status „mapping”, während WizCut die Kameras ermittelt. Das dauert wenige Minuten, nachdem die Proxys erstellt sind. Danach ordnet WizCut die Kameras entweder selbst zu, und der nächste Webhook ist „ready”, oder es sendet „mapping” samt Vorschlag. Kann WizCut keinen Vorschlag berechnen (zum Beispiel weil ein Proxy fehlgeschlagen ist), kommt „mapping” ohne cameraMap, spätestens etwa 30 Minuten nach der Sprechererkennung.
  • "off": „mapping” kommt direkt nach der Sprechererkennung, in der Regel ohne cameraMap. Der Vorschlag erscheint wenige Minuten später in GET /api/jobs/{jobId}.

Webhook „ready” (Sprecher-Zuordnung abgeschickt, von einem Menschen, deinem Code oder WizCut, und 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” (der Job ist fehlgeschlagen, egal in welcher Phase):

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

error enthält dieselbe Meldung, die GET /api/jobs/{jobId} als error_message liefert. failedAtStatus nennt die Phase, in der es schiefging, zum Beispiel syncing, diarizing oder rendering. Bei den meisten Fehlern in Sync, Sprechererkennung und Rendering startet WizCut vorher einmal automatisch einen neuen Versuch. Kommt dieser Webhook, hat also auch der nicht geklappt.

Die outputUrl in den Webhooks „complete” und „approved” ist sieben Tage nach Abschluss des Renderings gültig. GET /api/jobs/{jobId} liefert dagegen immer eine frisch signierte output_url.

Sprecher-Zuordnung und Prüfung (Human-in-the-loop)

Nach der Sprechererkennung wechselt der Job in den Status „mapping”. Die erkannten Sprecher müssen den Kameraquellen zugeordnet werden, denn die Sprechererkennung bestimmt zwar, wann jemand spricht, aber nicht, auf welcher Kamera die Person zu sehen ist.

WizCut versucht, diese Zuordnung für dich zu ermitteln. Menschen bewegen sich beim Sprechen: Sie gestikulieren, nicken, lehnen sich vor. WizCut vergleicht daher das Sprechen jedes Sprechers mit der Bewegung auf jeder Kamera und schlägt vor, wer auf welcher zu sehen ist. Wie viel WizCut davon allein entscheidet, bestimmst du mit autoMap.

Wird ein Mensch gebraucht, sendet WizCut den Webhook „mapping”. Er enthält eine reviewUrl, einen signierten Link zum WizCut-Editor. Schick einen Menschen dorthin. Im Editor nimmt er folgende Schritte vor:

  1. Prüfen, welcher Sprecher auf welcher Kamera zu sehen ist (Kameras, bei denen sich WizCut sicher ist, sind bereits ausgewählt)
  2. Die automatisch generierten Schnitte in der Vorschau prüfen und bearbeiten
  3. Auf „Render” klicken, wenn alles stimmt (bei review: true, dem Standard)
  4. Optional auf „Approve” klicken, nachdem die gerenderte Ausgabe geprüft wurde

Bei review: false startet das Rendering automatisch, sobald die Sprecher-Zuordnung abgeschickt wird. Eine Prüfung der Schnitte vor dem Render entfällt.

Automatische Kamerazuordnung

Setze autoMap, wenn du den Job anlegst:

ModusWas WizCut tutSinnvoll, wenn
"off"Ordnet die Kameras nie selbst zu. Sendet „mapping” direkt nach der Sprechererkennung. Der Vorschlag erscheint wenige Minuten später am Job und kann von einem Menschen oder deinem Agenten genutzt werden.Ohnehin immer ein Mensch die Zuordnung prüft.
"confident"Standard. Ordnet die Kameras selbst zu, wenn es sicher ist, für jeden Sprecher eine Nahaufnahme gefunden zu haben, und geht dann weiter zu „ready”. Andernfalls sendet es „mapping” mit angehängtem Vorschlag. Eine Totale oder Zweiereinstellung wird im Schnitt verwendet, zählt aber nie als eigene Kamera eines Sprechers.In den meisten Integrationen. Du hörst nur von WizCut, wenn es Hilfe braucht.
"always"Wartet nicht auf einen Menschen. Nutzt zuerst die Antworten, bei denen es sich sicher ist, dann die wahrscheinlichen, und verteilt übrige Sprecher nach Redezeit auf die verbleibenden Kameras. Nur wenn es gar keinen Vorschlag berechnen kann (zum Beispiel weil ein Proxy fehlgeschlagen ist), sendet es „mapping”.Vollautomatische Pipelines, die lieber einen geschätzten Schnitt bekommen als einen hängenden Job.

„Bei jedem Sprecher sicher” heißt: Jeder Sprecher mit mindestens einer Minute Sprechzeit ist auf einer Kamera, die WizCut mit high Konfidenz beantwortet hat. Kameras, bei denen sich WizCut unsicher ist, bekommen keine Sprecher, der Schnitt wechselt also nicht zu ihnen. Willst du sie trotzdem nutzen, korrigier das im Editor.

Rechne damit, dass „confident” ziemlich oft einen Menschen hinzuzieht. Bei Material, in dem die Bewegung keinem einzelnen Sprecher folgt, hält es sich zurück: TV-Studios mit geschalteten Feeds, Events, Handkameras oder bediente Kameras. Außerdem braucht es etwa 20 Minuten Gespräch, um sicher zu sein, kurze Clips landen deshalb meist in „mapping”. In unseren bisherigen Tests hat WizCut keinen Sprecher auf die falsche Kamera gelegt, wenn es sich sicher war, die Stichprobe ist aber noch klein.

In Kombination mit review: false bedeuten "confident" und "always", dass ein Job gerendert werden kann, ohne dass ihn jemand ansieht. Das ist bei vollautomatischen Pipelines der Sinn der Sache. Soll ein Mensch jeden Schnitt sehen, lass review: true stehen.

Die Camera Map

Der Vorschlag liegt am Job als camera_map (im Webhook „mapping” als cameraMap). Bis zur Berechnung, wenige Minuten nach dem Erstellen der Proxys, ist er null. Hier ein Beispiel für eine Show mit zwei Personen, einer Nahaufnahme pro Person und einer Zweiereinstellung:

{
  "version": 1,
  "computedAt": "2026-10-01T09:42:17.000Z",
  "speakers": ["SPEAKER_00", "SPEAKER_01"],
  "unassignedSpeakers": [],
  "droppedSpeakers": ["SPEAKER_02"],
  "cameras": [
    {
      "sourceId": "source-uuid-1",
      "kind": "closeup",
      "confidence": "high",
      "speakers": ["SPEAKER_00"],
      "z": { "SPEAKER_00": 11.5, "SPEAKER_01": 0.9 },
      "lagErrorS": { "SPEAKER_00": 0.1, "SPEAKER_01": 41.6 }
    },
    {
      "sourceId": "source-uuid-2",
      "kind": "closeup",
      "confidence": "high",
      "speakers": ["SPEAKER_01"],
      "z": { "SPEAKER_01": 12.4, "SPEAKER_00": 1.3 },
      "lagErrorS": { "SPEAKER_01": 0.2, "SPEAKER_00": 63.0 }
    },
    {
      "sourceId": "source-uuid-3",
      "kind": "twoshot",
      "confidence": "high",
      "speakers": ["SPEAKER_01", "SPEAKER_00"],
      "positions": { "left": "SPEAKER_01", "right": "SPEAKER_00" },
      "z": { "SPEAKER_00": 6.8, "SPEAKER_01": 5.2 },
      "lagErrorS": { "SPEAKER_00": 0.3, "SPEAKER_01": 0.4 }
    }
  ]
}

Pro Kamera:

FeldBeschreibung
sourceIdEine der Videoquellen des Jobs.
kindWas die Kamera zeigt: closeup (eine Person), twoshot (zwei Personen nebeneinander), wide (drei Personen), multi (mehrere Personen nacheinander, meist eine bediente oder geschaltete Kamera) oder unknown.
confidencehigh (WizCut ist sicher), low (eine wahrscheinliche, aber nicht sichere Antwort) oder none (keine Antwort).
speakersWer auf der Kamera zu sehen ist. Leer, wenn confidence den Wert none hat. Bei Zweiereinstellungen und Totalen von links nach rechts.
positionsNur bei Zweiereinstellungen und Totalen: wer links (left), in der Mitte (middle) und rechts (right) im Bild sitzt.
reasonHat den Wert no_motion, wenn eine Kamera gar nicht analysiert werden konnte.
z, lagErrorSDiagnosewerte pro Sprecher: wie stark die Bewegung der Kamera dem Sprechen dieser Person folgt und um wie viele Sekunden der beste Treffer danebenlag. Nützlich zur Fehlersuche, aber keine Grundlage, auf die du aufbauen solltest.

Oberste Ebene:

FeldBeschreibung
speakersDie Sprecher, die WizCut bewertet hat: alle mit mindestens einer Minute Sprechzeit.
unassignedSpeakersBewertete Sprecher, die auf keiner high-Kamera zu sehen sind. Ist die Liste nicht leer, überlässt „confident” die Entscheidung einem Menschen.
droppedSpeakersSprecher mit zu wenig Sprechzeit für eine Bewertung, meist ein verirrtes Label oder ein kurzer Einwurf. WizCut legt sie auf keine Kamera.

Um den Vorschlag unverändert zu übernehmen, machst du aus jeder Kamera, der du vertraust, einen Track aus sourceId und speakers und schickst ihn ab.

Sprecher per API zuordnen

Wenn du ohnehin weißt, wer vor welcher Kamera sitzt, oder dein Agent den Vorschlag geprüft hat, kannst du die Zuordnung selbst übernehmen, solange der Job im Status „mapping” ist:

POST /api/jobs/{jobId}/tracks
{
  "tracks": [
    { "sourceId": "source-uuid-1", "speakers": ["SPEAKER_00"] },
    { "sourceId": "source-uuid-2", "speakers": ["SPEAKER_01"] }
  ]
}

Nutz die Sprechernamen aus dem Webhook „mapping” (oder die turns aus GET /api/jobs/{jobId}) zusammen mit deinen Video-Source-IDs. Eine Kamera kann mehrere Sprecher zeigen. WizCut generiert daraufhin die Schnitte, versetzt den Job in den Status „ready”, sendet den Webhook „ready” und startet bei review: false den Render. Die Antwort enthält die neuen cuts.

Jede sourceId muss eine der Videoquellen des Jobs sein, andernfalls antwortet die API mit 400 und "code": "UNKNOWN_SOURCE". Du kannst die Zuordnung auch abschicken, während WizCut die Kameras noch ermittelt: Wer zuerst kommt, gewinnt. Wurde die Zuordnung bereits abgeschickt, zum Beispiel automatisch, erhältst du 409 mit "code": "INVALID_STATUS".

Fortgeschritten: Zuordnung korrigieren, nachdem Schnitte existieren. Sobald der Job „ready” oder „complete” ist, kann derselbe Endpunkt die Zuordnung weiterhin ändern, generiert aber keine Schnitte mehr für dich: Sende die korrigierten cuts zusammen mit tracks (und optional removedRanges), sonst erhältst du 400 mit "code": "CUTS_REQUIRED". WizCut speichert beides gemeinsam, ein späterer Recut nutzt also die korrigierte Zuordnung. Es wird kein Webhook gesendet und kein Render gestartet. Löse einen aus, wenn du eine neue Ausgabe brauchst. Der WizCut-Editor erledigt das alles selbst, wenn dort jemand eine Zuordnung korrigiert.

Pausen entfernen

WizCut kann lange Pausen automatisch straffen oder entfernen, bevor die Schnitte generiert werden. Das passiert zuerst, damit die Kamerawechsel auf dem bereits gestrafften Gespräch entschieden werden. So bekommst du nie einen Schnitt auf eine Kamera, die sofort den Großteil ihrer Bildzeit an eine entfernte Pause verliert.

Aktivieren lässt sich das über das silence-Feld beim Anlegen eines Jobs:

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

Modi:

ModusVerhalten
offAlle Pausen bleiben wie aufgenommen erhalten (Standard, wenn silence weggelassen wird).
tightenLange Pausen werden auf einen natürlichen Beat gekürzt (~0,7 s). Empfohlen: Das Gespräch bleibt menschlich.
removeLange Pausen werden fast vollständig herausgeschnitten, nur so viel Padding bleibt, dass keine Wörter abgeschnitten werden.

Optionale Feinjustierung (die Standardwerte funktionieren für die meisten Aufnahmen gut):

FeldStandardBereichBeschreibung
minPauseSec1.50.3–10Nur Pausen, die länger sind, werden bearbeitet.
keepPauseSec0.70–3Der Beat, der anstelle einer gestrafften Pause stehen bleibt (nur im Modus tighten).
paddingSec0.250–1Sicherheitsabstand, der bei jedem entfernten Bereich um die Sprache herum erhalten bleibt.

Die Erkennung arbeitet konservativ: Eine Pause wird nur entfernt, wenn sowohl die Sprechererkennung als auch eine Audio-Energieanalyse übereinstimmend „still” ergeben. Lachen und andere nicht-sprachliche Momente bleiben dadurch erhalten.

Das Job-Objekt (GET /api/jobs/{jobId}) enthält neben cuts auch removed_ranges: die entfernten Bereiche in der Quellzeit als { startMs, endMs }. Das finale Rendering überspringt diese Bereiche, im Review-Editor erscheinen sie als wiederherstellbare, schraffierte Abschnitte.

Nachträglich ändern lässt sich das über den Recut-Endpunkt:

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

Recut generiert Schnitte und entfernte Bereiche aus den bereits erkannten Sprechern neu, ohne erneute Verarbeitung. Die Antwort kommt daher sofort zurück, mit den neuen Werten für cuts, removedRanges und savedMs (wie viel kürzer die Ausgabe dadurch wird). Übergib { "mode": "off" }, um die Stille-Entfernung wieder zu deaktivieren. Lässt du silence ganz weg, bleibt die gespeicherte Einstellung des Jobs erhalten.

Hinweis zur Abrechnung: Die Nutzung wird in Input-Minuten gemessen (dem hochgeladenen Material). Die Stille-Entfernung ändert also nichts an den Kosten eines Jobs, sie macht nur die Ausgabe kompakter.

Erweitert: Schnitte programmatisch steuern

Für vollständig automatisierte Pipelines, die das UI komplett umgehen, lässt du WizCut die Kameras zuordnen oder ordnest Sprecher per API zu und steuerst Schnitte und Rendering danach selbst. Diese Endpunkte funktionieren, solange der Job im Status „ready” oder „complete” ist:

Schnitte aktualisieren:

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

Derselbe Endpunkt akzeptiert außerdem removedRanges (ein Array aus { startMs, endMs }), um die Stille-Entfernungs-Bereiche direkt zu bearbeiten, zum Beispiel um eine Pause wiederherzustellen, die der automatische Durchlauf entfernt hat. Du kannst cuts, removedRanges oder beides senden.

Render auslösen:

POST /api/jobs/{jobId}/render

Funktioniert aus dem Status „ready” heraus oder aus „complete”, um nach dem Bearbeiten der Schnitte erneut zu rendern. Liefert { "jobId": "uuid", "status": "rendering" } zurück, oder einen 409 mit "code": "NO_CUTS", wenn der Job keine Schnitte zum Rendern hat.

Ausgabe bestätigen:

POST /api/jobs/{jobId}/approve

Funktioniert nur, wenn der Job bereits „complete” ist. Setzt ihn auf „approved” und sendet den Webhook „approved”.

Fehlerantworten

Alle Endpunkte liefern Fehler in diesem Format:

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

Manche Fehler enthalten zusätzlich einen maschinenlesbaren code:

CodeHTTPBedeutung
TRACKS_ON_CREATE400POST /api/jobs hat eine Sprecher-Zuordnung erhalten. Lass tracks weg und nutze autoMap, oder setze die Zuordnung später.
UNKNOWN_SOURCE400Ein Track nennt eine sourceId, die keine Videoquelle des Jobs ist.
CUTS_REQUIRED400Wer die Zuordnung ändert, nachdem Schnitte existieren, muss auch die aktualisierten cuts mitsenden.
NOT_ENOUGH_VIDEOS400Für die Verarbeitung braucht der Job mindestens zwei Videoquellen.
QUOTA_EXCEEDED403Deine Minuten sind aufgebraucht.
INVALID_STATUS409Der Job befindet sich nicht in einem Status, der das erlaubt, zum Beispiel weil seine Zuordnung schon abgeschickt wurde.
NO_CUTS409Es gibt keine Schnitte zum Rendern.

Häufige HTTP-Statuscodes:

CodeBedeutung
400Ungültige Anfrage (z. B. weniger als zwei Videoquellen bei der Verarbeitung)
401Fehlender oder ungültiger API-Key
403Kontingent überschritten
404Job nicht gefunden oder nicht in deinem Besitz
409Ungültiger Statusübergang (z. B. Rendering eines Jobs, der noch nicht „ready” ist)
500Serverfehler
502Ein Verarbeitungsdienst hat den Job abgelehnt oder konnte nicht starten
503Dienst nicht verfügbar

Vollständiger Ablauf

Der komplette Ablauf für einen KI-Agenten oder eine Automatisierung:

# 1. Job mit zwei Kameras anlegen (Dateien bis 5 GB, für größere
#    Dateien fileSize angeben, dann läuft der Upload als Multipart)
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 '.uploads | to_entries[0].value.url')"
curl -X PUT -T camera2.mp4 "$(echo $JOB | jq -r '.uploads | to_entries[1].value.url')"

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

# 4. Auf den nächsten Webhook warten. Mit dem Standardwert autoMap ("confident"):
#    - { status: "ready", reviewUrl: "..." }: WizCut hat die Kameras selbst zugeordnet
#    - { status: "mapping", reviewUrl: "...", speakers: [...], cameraMap: {...} }:
#      WizCut war sich nicht sicher. Einen Menschen zur reviewUrl schicken, um die Kameras
#      zu bestätigen (oder die Zuordnung selbst per POST an /api/jobs/$JOB_ID/tracks senden)

# 5. Mensch prüft und bearbeitet Schnitte → klickt im Editor auf Render
#    Auf Webhook warten: { status: "complete", outputUrl: "..." }

# 6. Fertig gerendertes Video von outputUrl herunterladen

Vollautomatisch (autoMap: "always", review: false):

# Wie oben, aber "autoMap": "always" und "review": false in Schritt 1 ergänzen
# WizCut ordnet die Kameras selbst zu, auch wenn es sich nicht sicher ist,
# und startet direkt danach das Rendering, ganz ohne menschliches Zutun
# Ergebnis: { status: "ready", ... }, danach { status: "complete", outputUrl: "..." }

Integrationen

Lieber ohne Code? Die WizCut API lässt sich auch über Automatisierungsplattformen steuern, ohne dass du die oben beschriebenen Anfragen selbst schreiben musst.

n8n

Wir pflegen eine offizielle n8n-Integration mit dem verifizierten Community-Node @wizcut/n8n-nodes-wizcut. Installieren lässt er sich in n8n unter Settings → Community Nodes. Da er verifiziert ist, steht er auch in n8n Cloud zur Verfügung.

Der Node kommt in zwei Varianten:

  • WizCut: Aktionen für Create Job, Get Job, Start Processing, Start Render und Approve.
  • WizCut Trigger: ein Webhook-Trigger, der deinen Workflow startet, sobald sich der Job-Status ändert (mapping, ready, complete, approved).

Du verbindest die Webhook-URL des Triggers mit der callbackUrl deines Jobs und erhältst eine vollständig ereignisgesteuerte Pipeline. Zum Beispiel: Slack-Benachrichtigung, wenn jemand bestätigen soll, wer auf welcher Kamera zu sehen ist, automatischer Render-Start sobald die Schnitte bereit sind, und Download-Link, wenn die Episode fertig ist. Beide Nodes lassen sich außerdem als Tools für n8n-KI-Agenten einsetzen.

Für den schnellen Einstieg gibt es eine fertige Vorlage: Podcast-Schnittstatus mit WizCut und Slack automatisch verwalten.

Weitere Plattformen

Make.com- und Zapier-Integrationen sind in Planung. Du arbeitest mit einer anderen Plattform oder brauchst eine Workflow-Vorlage für deinen konkreten Anwendungsfall? WizCut-Support kontaktieren. Funktionswünsche sind willkommen.

WizCut API – WizCut Docs