Zum Inhalt springen
Transcript Dock
AnmeldenKostenlos starten

Seitenmenü

Transcript Dock
EinführungSo funktioniert es, Anleitungen und was Sie transkribieren können.
SchnellstartLink senden, auf den Auftrag warten, Transkript exportieren. Drei Anfragen.
AuthentifizierungAPI-Schlüssel, Scopes, Idempotency-Key und X-Request-Id.
AufträgeAufträge erstellen, abwarten, auflisten, abbrechen und wiederholen.
TranskripteDas Transkript-Objekt sowie die Exporte als txt, srt, vtt und json.
StapelBis zu 50 Videos in einer Anfrage.
Eigene DateienIhre eigenen Audio- und Videodateien transkribieren.
Webhook-BenachrichtigungenWird aufgerufen, wenn ein Auftrag oder Stapel fertig ist. Prüfen Sie die Signatur.
FehlerJeder Fehlercode, was er bedeutet und was Sie tun können.
RatenlimitsEingereichte Links, laufende Aufträge und Lesezugriffe je Tarif. Die Antwort 429.
Preise und Credits1 Credit pro Transkript aus Untertiteln, 2 pro Minute KI-Transkription. Tarife und zusätzliche Credits.
QuellenYouTube, TikTok, Ihre Dateien und direkte Links: akzeptierte URLs und Modi.
MCPVideos aus Claude, Cursor, Windsurf oder Ihrem eigenen Agenten heraus finden und transkribieren.
OpenAPI-SpezifikationDie OpenAPI-3.1-Spezifikation für Codegenerierung und typisierte Clients.
Claude CodeEin Befehl fügt Transcript Dock zu Claude Code hinzu.
Claude-AppFügen Sie Transcript Dock als benutzerdefinierten Connector auf claude.ai, in Claude Desktop oder in der mobilen App hinzu.
CursorTranscript Dock in Cursor als MCP-Server hinzufügen.
WindsurfFügen Sie Transcript Dock zu Windsurf hinzu, damit Cascade Videos finden und transkribieren kann.
OpenClawVerbinden Sie Transcript Dock mit autonomen OpenClaw-Agenten.
19 Ergebnisse
API

API-Referenz

Endpunkte, Felder, Antworten, Credits, Limits und Fehler.

Aktualisiert


So funktioniert es#

Jedes Transkript ist ein Auftrag. Sie senden eine Quelle, der Auftrag läuft im Hintergrund, und wenn er erfolgreich ist, verweist er auf ein Transkript, das Sie so oft lesen oder exportieren können, wie Sie möchten. Basis-URL: https://www.transcriptdock.com. Alle Anfragen und Antworten sind JSON.

# 1. Submit
curl -X POST https://www.transcriptdock.com/v1/jobs \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Idempotency-Key: video-7680721699171601694" \
-H "Content-Type: application/json" \
-d '{ "source": { "url": "https://www.tiktok.com/@tiktok/video/7680721699171601694" }, "mode": "captions_only" }'
 
# 2. Wait (returns as soon as the job finishes, up to 25 s per call)
curl "https://www.transcriptdock.com/v1/jobs/11111111-1111-4111-8111-111111111111?wait=25" \
-H "Authorization: Bearer td_live_YOUR_KEY"
 
# 3. Export
curl "https://www.transcriptdock.com/v1/transcripts/22222222-2222-4222-8222-222222222222/export?format=srt" \
-H "Authorization: Bearer td_live_YOUR_KEY"
Rufen Sie die API niemals aus einem Browser auf: Ihr Schlüssel wäre für jeden sichtbar. Rufen Sie sie von Ihrem Server aus auf und bewahren Sie den Schlüssel in einer Umgebungsvariable auf.

Authentifizierung#

Erstellen Sie Schlüssel auf der Seite API-Schlüssel. Ein Schlüssel wird nur einmal angezeigt, sieht aus wie td_live_... und gehört in den Authorization-Header jeder Anfrage. Schlüssel erhalten beim Erstellen festgelegte Berechtigungen: jobs:read, jobs:write, transcripts:read, uploads:write. Erstellen Sie für jede Integration einen eigenen Schlüssel, damit Sie ihn einzeln widerrufen können.

Header
Authorization: Bearer td_live_YOUR_KEY

Idempotency-Key#

Erforderlich bei POST /v1/jobs, /v1/batches, /v1/jobs/{id}/retry, /v1/video-discoveries und /v1/language-discoveries: beliebige 8 bis 128 druckbare ASCII-Zeichen. Wird derselbe Schlüssel mit demselben Body innerhalb von 48 Stunden erneut gesendet, gibt die API das ursprüngliche Objekt zurück. Eine wiederholte Anfrage erzeugt oder berechnet daher nie doppelt. Derselbe Schlüssel mit einem anderen Body liefert 409 IDEMPOTENCY_CONFLICT. Ein guter Schlüssel ist Ihre eigene Kennung für den Inhalt, den Sie transkribieren.

X-Request-Id#

Jede Antwort enthält eine. Nennen Sie sie beim Kontakt mit dem Support.

Endpunkte#

MethodePfadFunktionCredits
POST/v1/jobsEin Video, eine Datei oder einen Link transkribieren1 pro Transkript aus Untertiteln, 2 pro Minute KI-Transkription
GET/v1/jobs/{id}Auftragsstatus, wartet bis zu 25 sKostenlos
GET/v1/jobsAuftragsverlaufKostenlos
POST/v1/jobs/{id}/cancelEinen wartenden Auftrag abbrechenKostenlos
POST/v1/jobs/{id}/retryEinen fehlgeschlagenen Auftrag erneut versuchenAls neuer Auftrag
POST/v1/batchesViele Videos transkribieren (Stapelgröße je Tarif)Pro Eintrag, wie oben
GET/v1/batches/{id}Status des StapelsKostenlos
GET/v1/transcripts/{id}Transkript als JSONKostenlos
GET/v1/transcripts/{id}/exportDatei als txt, srt, vtt oder jsonKostenlos
DELETE/v1/transcripts/{id}Ein Transkript löschenKostenlos
POST/v1/uploadsURL zum Hochladen einer Datei abrufenKostenlos
POST/v1/uploads/{id}/completeUpload als abgeschlossen markierenKostenlos
POST/v1/video-discoveriesYouTube durchsuchen, einen Kanal, eine Playlist oder ein TikTok-Profil auflisten1 pro Seite
GET/v1/video-discoveries/{id}Ergebnis der SucheKostenlos
POST/v1/language-discoveriesUntertitelsprachen eines YouTube-Videos auflisten1
GET/v1/language-discoveries/{id}Liste der SprachenKostenlos
POST/v1/webhook-endpointsEine Webhook-URL registrieren (mit angemeldeter Sitzung)Kostenlos
GET/v1/webhook-endpointsWebhook-URLs auflistenKostenlos
DELETE/v1/webhook-endpoints/{id}Eine Webhook-URL deaktivieren (mit angemeldeter Sitzung)Kostenlos
GET/v1/usageCredits und TarifKostenlos
GET/v1/capabilitiesWas Ihr API-Schlüssel kannKostenlos

Auftrag erstellen#

POST/v1/jobs
source.urlstringWahlfrei
Ein öffentliches Video: YouTube (watch?v=, youtu.be, shorts, live) oder TikTok (tiktok.com/@user/video/…, Kurzlinks über vm.tiktok.com). Jeder andere https-Link zu einer Audio- oder Videodatei gilt als direkter Medienlink (KI-Transkription). Eines von url oder upload_id ist erforderlich.
source.upload_iduuidWahlfrei
Eine Datei, die Sie hochgeladen haben (siehe Dateien hochladen). Immer KI-Transkription.
mode"captions_only" | "auto" | "transcribe"Pflichtfeld
captions_only: die eigenen Untertitel des Videos, 1 Credit; schlägt mit NO_CAPTIONS fehl, wenn es keine gibt. auto: Untertitel, wenn vorhanden (1 Credit), sonst KI-Transkription. transcribe: immer KI-Transkription des Tons, 2 Credits pro begonnener Minute, mit Wortzeiten. KI-Transkription setzt einen bezahlten Tarif voraus.
caption_languagesstring[]Wahlfrei
Bevorzugte Untertitelsprachen in der Reihenfolge, z. B. ["en", "es"], bis zu 5. Standard: die Standardspur des Videos. Nur für captions_only und auto.
caption_preference"prefer_creator" | "creator_only" | "automatic_only"Wahlfrei
Ob von Erstellern hochgeladene Untertitel, die automatischen Untertitel von YouTube oder beide akzeptiert werden (Standard prefer_creator: zuerst die des Erstellers).
languagestringWahlfrei
Hinweis zur gesprochenen Sprache für die KI-Transkription (BCP 47). Standard: automatisch erkennen.
max_creditsintegerWahlfrei
Ausgabenlimit für die KI-Transkription. Das Medium wird zuerst gemessen. Würde es mehr kosten, schlägt der Auftrag mit BUDGET_EXCEEDED fehl, und es wird nichts berechnet. Standard: genug für 2 Stunden.
webhook_endpoint_iduuidWahlfrei
Empfängt job.succeeded / job.failed an diesem Webhook.
metadataobjectWahlfrei
Bis zu 10 Zeichenketten (Namen ≤ 64, Werte ≤ 256 Zeichen). Werden in Webhook-Ereignissen zurückgegeben. Hat keinen Einfluss auf den Cache.

Gibt 202 mit dem Auftrag zurück. Besitzt Ihr Arbeitsbereich bereits ein Transkript für dasselbe Video und dieselben Optionen, kommt 200 mit einem erfolgreichen Auftrag kostenlos zurück (billing.kind: "cached").

Antwort 202
{
"id": "11111111-1111-4111-8111-111111111111",
"status": "queued",
"stage": "resolve",
"result_id": null,
"error": null,
"billing": { "credits_reserved": 2, "credits_charged": 0, "kind": "captions" },
"source": { "platform": "tiktok", "media_id": "7680721699171601694", "canonical_url": "https://www.tiktok.com/@tiktok/video/7680721699171601694", "title": null, "upload_id": null },
"options": { "mode": "auto", "language": null, "caption_preference": "prefer_creator" },
"created_at": "2026-09-16T10:00:00.000Z"
}

Das Auftragsobjekt#

iduuidWahlfrei
Auftrags-ID.
statusstringWahlfrei
queued → processing (→ awaiting_provider während der KI-Transkription) → succeeded, failed oder cancelled. Die letzten drei sind endgültig.
stagestring | nullWahlfrei
Wo sich ein laufender Auftrag befindet: resolve, captions, acquire_audio, submit_asr, wait_asr, finalize. Nur zur Information.
result_iduuid | nullWahlfrei
Das Transkript, sobald der Auftrag erfolgreich ist.
errorobject | nullWahlfrei
Bei Fehlern: code, message, retryable, optional details.detail. Dieselben Codes wie bei Fehler.
billingobjectWahlfrei
credits_reserved (während der Ausführung reserviert, bei Abschluss 0), credits_charged (endgültig), kind: captions, ai_transcription oder cached.
sourceobjectWahlfrei
platform, media_id, canonical_url, title, upload_id.
optionsobjectWahlfrei
mode, language, caption_preference in der angenommenen Form.
created_atdate-timeWahlfrei
UTC.

Auftrag abrufen#

GET/v1/jobs/{id}?wait=25

Gibt den Auftrag zurück. Mit wait (0 bis 25 Sekunden) bleibt die Anfrage offen und antwortet, sobald der Auftrag endgültig ist. Ein Aufruf ersetzt damit eine Abfrageschleife. Lesezugriffe haben ein eigenes Limit von 120 pro Minute.

Aufträge auflisten#

GET/v1/jobs?limit=20&cursor=

Neueste zuerst, limit 1 bis 100. Geben Sie den next_cursor aus der Antwort als cursor an, um die nächste Seite zu laden. Mit platform und source_id (die source.media_id eines Auftrags) zusammen sehen Sie nur die Aufträge für ein Video, in jedem Modus. So prüft ein Client, ob der Arbeitsbereich schon ein Transkript hat, bevor er erneut sendet.

Auftrag abbrechen#

POST/v1/jobs/{id}/cancel

Bricht einen Auftrag ab, dessen KI-Transkription noch nicht begonnen hat. Die Reservierung wird freigegeben. Danach liefert die API 409 CANCELLATION_NOT_ALLOWED, und der Auftrag wird zu Ende geführt.

Auftrag erneut versuchen#

POST/v1/jobs/{id}/retry

Erstellt aus einem fehlgeschlagenen Auftrag mit einem wiederholbaren Fehler (retryable) einen neuen Auftrag. Dafür ist ein neuer Idempotency-Key nötig; optionaler Body { "max_credits": 40 }. Die Abrechnung entspricht einem neuen Auftrag. Endgültige Fehler (privates Video, keine Untertitel) liefern 409 JOB_NOT_RETRYABLE: Korrigieren Sie in diesem Fall die Eingabe und senden Sie erneut.

Das Transkript#

GET/v1/transcripts/{id}
iduuidWahlfrei
Entspricht der result_id des Auftrags.
sourceobjectWahlfrei
platform, media_id, canonical_url, title.
source_originstringWahlfrei
creator_captions, platform_captions (von der Plattform erzeugte Untertitel, etwa die automatischen Untertitel von YouTube) oder speech_recognition (KI-Transkription).
languagestring | nullWahlfrei
BCP-47-Sprachkennung des Textes.
textstringWahlfrei
Das gesamte Transkript als Klartext.
segmentsarrayWahlfrei
Untertitelgroße Abschnitte: { start, end, text } in Sekunden.
wordsarray | nullWahlfrei
{ start, end, text, confidence } pro Wort. Nur bei KI-Transkription.
timing_granularity"word" | "segment" | "none"Wahlfrei
Feinste verfügbare Zeitangabe.
duration_secondsnumber | nullWahlfrei
Länge des Mediums.
extraction_versionstringWahlfrei
Version der Verarbeitung, die das Ergebnis erzeugt hat.
recognitionobject | nullWahlfrei
Nur bei KI-Transkription: model, profile, quality_status (validated_language: wir haben sie geprüft; provider_supported: das Modell führt sie auf; experimental_language: die Qualität kann schwanken).
created_atdate-timeWahlfrei
UTC.
Antwort 200
{
"id": "22222222-2222-4222-8222-222222222222",
"source": { "platform": "youtube", "media_id": "dQw4w9WgXcQ", "canonical_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "title": "Beispielvideo" },
"source_origin": "creator_captions",
"language": "de",
"text": "Willkommen zu diesem Beispiel. Dies ist die zweite Zeile.",
"segments": [
{ "start": 0, "end": 2.4, "text": "Willkommen zu diesem Beispiel" },
{ "start": 2.4, "end": 4.9, "text": "Dies ist die zweite Zeile" }
],
"words": null,
"timing_granularity": "segment",
"duration_seconds": 212.0,
"recognition": null,
"extraction_version": "worker-0.1.0",
"created_at": "2026-09-16T10:00:14.000Z"
}

Transkripte werden für die Aufbewahrungsdauer Ihres Tarifs gespeichert (7 Tage in der Testphase, 30 bei Starter, 90 bei Pro und Scale). DELETE /v1/transcripts/{id} entfernt ein Transkript vorher.

Transkript exportieren#

GET/v1/transcripts/{id}/export?format=srt
formatSie erhalten
txtKlartext, ein Abschnitt pro Zeile.
srtSubRip-Untertitel.
vttWebVTT-Untertitel.
jsonDas oben beschriebene Transkriptobjekt.

Kostenlos und unbegrenzt. srt und vtt benötigen Zeitangaben. Ein Transkript ohne Zeitangaben liefert 422 TIMESTAMPS_UNAVAILABLE.

Stapel#

POST/v1/batches

Eine Anfrage, viele Videos. Jeder Eintrag hat dieselben Felder wie Auftrag erstellen. Der gesamte Stapel wird insgesamt angenommen oder insgesamt abgelehnt. Einträge pro Stapel: 1 in der Testphase, 10 bei Starter, 25 bei Pro, 50 bei Scale.

itemsJobRequest[]Pflichtfeld
1 bis 50 Auftragsanfragen.
webhook_endpoint_iduuidWahlfrei
Empfängt ein batch.completed, sobald jeder Eintrag endgültig ist.
metadataobjectWahlfrei
Wird im Ereignis batch.completed zurückgegeben.
POST /v1/batches
curl -X POST https://www.transcriptdock.com/v1/batches \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Idempotency-Key: playlist-2026-09-16" \
-H "Content-Type: application/json" \
-d '{ "items": [
{ "source": { "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" }, "mode": "captions_only" },
{ "source": { "url": "https://www.tiktok.com/@tiktok/video/7680721699171601694" }, "mode": "captions_only" }
] }'

Das Stapelobjekt hat status (queued, processing, succeeded, partial_success, failed, cancelled), Zähler (total_items, succeeded_items, failed_items, cancelled_items) und items, jeweils mit seiner job_id. Lesen Sie es mit GET /v1/batches/{id}. Jeder Eintrag ist ein normaler Auftrag.

Dateien hochladen#

Ihre eigene Audio- oder Videodatei (mp3, wav, m4a, ogg, aac, mp4, webm; bis 250 MB und 2 Stunden). Reservieren Sie einen Platz, laden Sie die Datei per PUT auf die signierte URL hoch, markieren Sie den Upload als abgeschlossen und reichen Sie ihn dann als Auftrag mit source.upload_id ein. Uploads verwenden immer KI-Transkription.

Hochladen und transkribieren
# 1. Reserve
curl -X POST https://www.transcriptdock.com/v1/uploads \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "filename": "interview.mp3", "content_type": "audio/mpeg", "bytes": 48213920 }'
# -> { "id": "33333333-...", "signed_upload_url": "https://...", "expires_at": "...", "status": "pending" }
 
# 2. Upload the bytes (same Content-Type you declared)
curl -X PUT "SIGNED_UPLOAD_URL" -H "Content-Type: audio/mpeg" --data-binary @interview.mp3
 
# 3. Complete
curl -X POST https://www.transcriptdock.com/v1/uploads/33333333-3333-4333-8333-333333333333/complete \
-H "Authorization: Bearer td_live_YOUR_KEY"
 
# 4. Transcribe it
curl -X POST https://www.transcriptdock.com/v1/jobs \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Idempotency-Key: interview-01" \
-H "Content-Type: application/json" \
-d '{ "source": { "upload_id": "33333333-3333-4333-8333-333333333333" }, "mode": "transcribe" }'
filenamestringPflichtfeld
Bis zu 255 Zeichen.
content_typestringPflichtfeld
MIME-Typ der Datei, z. B. audio/mpeg oder video/mp4. Senden Sie beim PUT denselben Wert.
bytesintegerPflichtfeld
Genaue Dateigröße. Der PUT-Upload muss genau dieser Größe entsprechen.

Die signierte URL ist 24 Stunden gültig. Danach reservieren Sie einen neuen Platz.

Webhooks#

POST/v1/webhook-endpoints

Registrieren Sie eine https-URL und übergeben Sie ihre id beim Einreichen als webhook_endpoint_id. Wir senden per POST ein Ereignis, sobald der Auftrag oder Stapel abgeschlossen ist. Die Antwort enthält das Signaturgeheimnis secret genau einmal. Endpunkte zu registrieren oder zu deaktivieren erfordert eine angemeldete Sitzung. Erledigen Sie das daher auf der Seite Webhooks im Dashboard. Ein API-Schlüssel erhält dort 403 FORBIDDEN, kann Endpunkte aber auflisten.

urlstringPflichtfeld
https-URL mit bis zu 2048 Zeichen.
descriptionstringWahlfrei
Eine Bezeichnung für Ihre eigene Übersicht.

Ereignisse#

job.succeeded
{
"event_id": "44444444-4444-4444-8444-444444444444",
"type": "job.succeeded",
"created_at": "2026-09-16T10:00:14.000Z",
"job_id": "11111111-1111-4111-8111-111111111111",
"batch_id": null,
"result_id": "22222222-2222-4222-8222-222222222222",
"metadata": { "order": "8812" },
"error": null
}
  • job.succeeded: Rufen Sie die result_id ab oder exportieren Sie sie.
  • job.failed: error enthält den Code.
  • batch.completed: Jeder Eintrag ist endgültig. Lesen Sie den Stapel für die Ergebnisse je Eintrag.

Antworten Sie innerhalb weniger Sekunden mit einem beliebigen 2xx-Status. Fehlgeschlagene Zustellungen werden mit zunehmenden Wartezeiten erneut versucht und lassen sich im Dashboard erneut senden. Ein Ereignis kann mehrfach eintreffen. Filtern Sie Duplikate anhand von event_id.

Signatur prüfen#

Header X-TranscriptDock-Event-Id, X-TranscriptDock-Timestamp und X-TranscriptDock-Signature. Die Signatur ist der HMAC-SHA256 (hex) von {event_id}.{timestamp}.{raw_body} mit Ihrem Geheimnis. Lehnen Sie alles ab, das älter als fünf Minuten ist.

import crypto from "node:crypto";
 
export function verify(eventId: string, timestamp: string, rawBody: string, signature: string, secret: string): boolean {
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(`${eventId}.${timestamp}.${rawBody}`).digest("hex");
return expected.length === signature.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}

Videos finden#

POST/v1/video-discoveries

Durchsuchen Sie YouTube oder listen Sie einen Kanal, eine Playlist oder ein TikTok-Profil auf und übergeben Sie die URLs anschließend an Aufträge. Eine Suche läuft wie ein Auftrag im Hintergrund. Lesen Sie sie mit GET /v1/video-discoveries/{id}, bis status den Wert succeeded hat. 1 Credit pro Seite. Ergebnisse werden 24 Stunden lang gespeichert.

kindstringPflichtfeld
youtube_search, youtube_channel_videos, youtube_channel_search, youtube_playlist_videos oder tiktok_user_videos.
querystringWahlfrei
Suchbegriff (youtube_search, youtube_channel_search).
channelstringWahlfrei
@-Handle, Kanal-ID oder Kanal-URL (Kanal-Typen).
playliststringWahlfrei
Playlist-ID oder URL (youtube_playlist_videos).
userstringWahlfrei
@-Benutzername oder Profil-URL (tiktok_user_videos).
limitintegerWahlfrei
Videos pro Seite, 1 bis 50, Standard 20. TikTok: höchstens 10.
cursorstringWahlfrei
next_cursor der vorherigen Seite. Nur YouTube.
include_detailsbooleanWahlfrei
Nur TikTok: ruft zusätzlich Likes, Kommentare, Hashtags und Untertitelsprachen je Video ab.
YouTube durchsuchen
curl -X POST https://www.transcriptdock.com/v1/video-discoveries \
-H "Authorization: Bearer td_live_YOUR_KEY" \
-H "Idempotency-Key: search-async-rust-1" \
-H "Content-Type: application/json" \
-d '{ "kind": "youtube_search", "query": "async rust", "limit": 5 }'

Das POST antwortet mit 202 und status: "queued". So sieht ein abgeschlossenes GET /v1/video-discoveries/{id} aus:

Antwort 200
{
"id": "55555555-5555-4555-8555-555555555555",
"kind": "youtube_search",
"status": "succeeded",
"request": { "kind": "youtube_search", "query": "async rust", "limit": 5 },
"videos": [
{
"platform": "youtube",
"video_id": "wXtngLBkK4Q",
"url": "https://www.youtube.com/watch?v=wXtngLBkK4Q",
"title": "Async Rust explained in 20 minutes",
"channel_id": "UCSp-OaMpsO8K0KkOqyBl7_w",
"channel_title": "Let's Get Rusty",
"duration_s": 1155,
"published_at": null,
"published_text": "5 months ago",
"view_count": 83635,
"view_count_text": "83,635 views",
"thumbnail_url": "https://i.ytimg.com/vi/wXtngLBkK4Q/hq720.jpg",
"tiktok": null
}
],
"profile": null,
"next_cursor": "opaque-token",
"error": null,
"created_at": "2026-09-16T12:00:00.000Z",
"updated_at": "2026-09-16T12:00:03.000Z",
"expires_at": "2026-09-17T12:00:00.000Z"
}

Untertitelsprachen eines Videos#

POST/v1/language-discoveries

Body { "source": { "url": "https://www.youtube.com/watch?v=..." } } mit einem Idempotency-Key (nur YouTube, 1 Credit). Lesen Sie GET /v1/language-discoveries/{id} für die Liste der Untertitelspuren mit ihren Codes, der Angabe, ob sie vom Ersteller oder automatisch stammen, und der Standardspur. Verwenden Sie die Codes in caption_languages.

Nutzung und Funktionen#

GET/v1/usage
Antwort 200
{
"plan": "pro",
"period_end": "2026-10-16T00:00:00.000Z",
"credits_remaining": 5840,
"credits_total": 6000,
"credits_reserved": 4,
"prepaid_credits": 0,
"transcribe_credits_per_minute": 2,
"minimum_billable_seconds": 60,
"subscription": {
"status": "active",
"interval": "yearly",
"cancel_at_period_end": false,
"current_period_end": "2027-09-16T00:00:00.000Z"
}
}

credits_remaining enthält credits_reserved bereits nicht (Reservierungen laufender Aufträge). prepaid_credits sind gekaufte Credits, die nie ablaufen.

subscription ist das Stripe-Abonnement hinter einem kostenpflichtigen Tarif und ohne Tarif null. Es enthält den status, das Abrechnungsintervall interval (monthly oder yearly), cancel_at_period_end und current_period_end: wann der Tarif verlängert wird oder endet. period_end ist der Zeitpunkt, zu dem die monatlichen Credits erneuert werden, bei Jahrestarifen ebenfalls jeden Monat.

GET/v1/capabilities

Was Ihr API-Schlüssel gerade kann: je Quelle (youtube, tiktok, instagram, upload, direct) die verfügbaren Modi sowie Limits und Preise. Lesen Sie dies, statt Werte fest einzutragen. Die Testphase meldet zum Beispiel auto und transcribe als false.

Antwort 200
{
"youtube": { "enabled": true, "captions_only": true, "auto": true, "transcribe": true, "social_acquisition_fee": true },
"tiktok": { "enabled": true, "captions_only": true, "auto": true, "transcribe": true, "social_acquisition_fee": true },
"instagram": { "enabled": false, "captions_only": false, "auto": false, "transcribe": false, "social_acquisition_fee": true, "native_captions": "unverified_disabled" },
"upload": { "enabled": true, "captions_only": false, "auto": true, "transcribe": true, "social_acquisition_fee": false },
"direct": { "enabled": true, "captions_only": false, "auto": true, "transcribe": true, "social_acquisition_fee": false },
"max_duration_ms": 7200000,
"max_media_bytes": 262144000,
"export_formats": ["txt", "json", "srt", "vtt"],
"recognition_profiles": ["standard"],
"transcribe_credits_per_minute": 2,
"minimum_billable_seconds": 60,
"price_version": "2026-09-14",
"asr_enabled": true,
"instagram_enabled": false,
"free_caption_credits": 50,
"free_caption_credits_period": "month"
}

Ratenlimits#

TarifAufträge / Min.Laufende AufträgeLesezugriffe / Min.
Testphase1010120
Starter60100120
Pro120500120
Scale3002,000120

Bei Überschreitung erhalten Sie 429 RATE_LIMITED mit einem retry-after-Header (Sekunden) und details.detail, das das Limit nennt. Es wird nichts berechnet. Webhooks und ?wait=25 halten Sie weit unter dem Leselimit.

Fehler#

Alle Fehler haben denselben Aufbau. retryable: true bedeutet, dass dieselbe Anfrage später erfolgreich sein kann. Warten Sie dann die Sekunden aus retry-after, falls vorhanden, sonst einige Sekunden, und verwenden Sie denselben Idempotency-Key erneut, damit nichts doppelt entsteht. Jeder andere Fehler erfordert eine Änderung auf Ihrer Seite.

Antwort 402
{
"error": {
"code": "INSUFFICIENT_BALANCE",
"message": "Not enough credits. Buy credits or upgrade your plan to continue.",
"retryable": false,
"details": { "detail": "This job needs more credits than you have left. Buy credits or upgrade your plan." },
"doc_url": "https://www.transcriptdock.com/docs/api-reference#error-codes"
},
"request_id": "66666666-6666-4666-8666-666666666666"
}

Ein Auftrag, der nach der Annahme fehlschlägt, liefert bei GET /v1/jobs/{id} weiterhin 200 mit status: "failed" und demselben Fehlerobjekt in error. Für einen fehlgeschlagenen Auftrag wird nichts berechnet.

Codes#

CodeHTTPWiederholenBedeutung und Lösung
INVALID_REQUEST422NeinA field is missing or has the wrong shape. details.detail names it.
INVALID_URL422NeinThe URL is not a valid https link (max 2048 characters).
UNSUPPORTED_SOURCE422NeinThe link is not a YouTube or TikTok video URL.
UNSAFE_URL422NeinThe direct media link points at a private or blocked network address.
INVALID_CURSOR422NeinA video discovery cursor expired or is malformed. Start again from the first page. A bad job list cursor returns INVALID_REQUEST.
CAPABILITY_UNAVAILABLE422NeinThis mode is not available for this source. GET /v1/capabilities shows what is.
IDEMPOTENCY_CONFLICT409NeinThis Idempotency-Key was already used with a different body. Use a new key.
UNAUTHENTICATED401NeinNo valid API key or OAuth token in the Authorization header.
FORBIDDEN403NeinThe key lacks the scope for this endpoint, or the workspace is disabled.
EMAIL_UNVERIFIED403NeinVerify the account email before using the API.
NOT_FOUND404NeinNo such object in this workspace.
INSUFFICIENT_BALANCE402NeinNot enough credits for this job. Buy credits or upgrade.
PLAN_REQUIRED402NeinThis needs a paid plan (AI transcription, larger batches) or the trial credits are used up.
BUDGET_EXCEEDED402NeinThe measured cost is above max_credits. Nothing was charged; raise the cap or skip the media.
JOB_NOT_RETRYABLE409NeinThe failure was final (private video, no captions). Fix the input and submit a new job.
CANCELLATION_NOT_ALLOWED409NeinAI transcription already started; the job will finish.
RATE_LIMITED429JaOver a rate or queue limit. Wait retry-after seconds; details.detail says which limit.
SOURCE_NOT_FOUND422NeinThe video does not exist or was removed.
SOURCE_PRIVATE422NeinThe video is private. Only public videos work.
SOURCE_AUTH_REQUIRED422NeinThe video needs a login, age check or membership.
SOURCE_REGION_RESTRICTED422NeinThe video is blocked in the regions we fetch from.
NO_CAPTIONS422NeinNo captions on this video and mode was captions_only. Use auto or transcribe.
LANGUAGE_UNAVAILABLE422NeinNone of caption_languages exists on this video. Drop the list to take the default track.
LANGUAGE_UNSUPPORTED422NeinAI transcription does not support the requested language.
NO_SPEECH422NeinAI transcription found no speech in the audio.
NO_AUDIO422NeinThe media has no audio track.
INVALID_MEDIA422NeinThe file could not be read as audio or video.
UNSUPPORTED_MEDIA422NeinNot an audio or video file type.
DURATION_LIMIT_EXCEEDED413NeinLonger than 2 hours.
FILE_TOO_LARGE413NeinLarger than 250 MB.
TIMESTAMPS_UNAVAILABLE422NeinThis transcript has no timings, so srt and vtt exports are unavailable. Use txt or json.
PROVIDER_REJECTED422NeinThe AI transcription model could not process this audio.
SOURCE_RATE_LIMITED503JaThe source platform is throttling us. The job retries automatically.
SOURCE_BLOCKED503JaThe source platform blocked the fetch. The job retries automatically.
SOURCE_TIMEOUT503JaThe source platform timed out. The job retries automatically.
SOURCE_CHANGED503JaThe source changed while we read it. The job retries automatically.
PROVIDER_UNAVAILABLE503JaAI transcription is temporarily unavailable. The job retries automatically.
STORAGE_UNAVAILABLE503JaFile storage is temporarily unavailable. Retry the request.
INTERNAL_ERROR500JaOur fault. Retry with the same Idempotency-Key; quote X-Request-Id if it persists.