Transkription
Audiodateien transkribieren, optional mit Sprechererkennung und Meeting-Notizen. Status abfragen und Dokumente exportieren.
Audiodateien transkribieren, optional mit Sprechererkennung und Meeting-Notizen. Status abfragen und Dokumente exportieren.
Lade eine Audiodatei hoch, erhalte eine Job-ID und hole dir das Transkript, sobald es fertig ist. Große Dateien laufen asynchron: der Upload antwortet sofort mit 202.
Zwei Modi: transcript liefert nur den Text. meeting erzeugt zusätzlich einen Titel und Zusammenfassungen, wie in der Meeting-Ansicht der App.
POST legt den Auftrag an und antwortet, bevor die Erkennung fertig ist. Frage GET mit der Job-ID ab, bis status completed oder failed ist.
| Parameter | Type | Description |
|---|---|---|
id | uuid | UUID des Auftrags. id und job_id sind dieselbe Kennung. |
mode | "transcript" | "meeting" | transcript (nur Text) oder meeting (Text plus Notizen). |
status | "processing" | "pending" | "completed" | "failed" | processing, pending, completed oder failed. |
text | string | null | Das fertige Transkript. Bei Anonymisierung der geschwärzte Text, nie die Rohfassung. |
segments | array | null | Abschnitte mit Zeit und optionalem Sprecher. Nur wenn angefordert und nicht anonymisiert. |
summaries | array | Nur im meeting-Modus: vorbereitete Notizen je Vorlage. |
error_code | "AUDIO_TOO_LONG" | "UPLOAD_INCOMPLETE" | "AUDIO_UNREADABLE" | "ASSEMBLY_FAILED" | Nur bei failed und nur, wenn der Grund bekannt ist: AUDIO_TOO_LONG, UPLOAD_INCOMPLETE, AUDIO_UNREADABLE oder ASSEMBLY_FAILED. ASSEMBLY_FAILED heißt: Die Teile ließen sich auch nach mehreren Versuchen nicht zusammensetzen. Lad die Aufnahme dann noch einmal hoch. |
1curl "https://app.anymize.ai/api/v1/transcriptions" \2 -H "Authorization: Bearer YOUR_API_KEY" Eine Datei hochladen und die Erkennung starten. Die Antwort ist 202 mit der Job-ID.
multipart/form-data mit der Datei und optionalen Schaltern. Das Transkript holst du später über GET.
/api/v1/transcriptionsRequest: multipart/form-data
Body
| Parameter | Type | Description |
|---|---|---|
filerequired | File | Die Audio-Datei. MP3, WAV, M4A, OGG, WEBM. |
mode | "transcript" | "meeting" | transcript oder meeting. Vorgabe transcript. |
speaker_detection | boolean | Sprechererkennung. Vorgabe an bei meeting, sonst aus. |
timestamps | boolean | Abschnitte mit Millisekunden. Bei Sprechererkennung immer an. |
language | string | ISO-639-1, oder weglassen bzw. auto für Erkennung nach der Transkription. |
prompt | string | Kurzer Hinweis an die Erkennung, höchstens 1000 Zeichen. |
context_bias | string | Kommagetrennte Begriffe, damit Namen richtig geschrieben werden. Höchstens 100 Tokens. |
anonymize | boolean | Danach durch die Anonymisierung schicken. Unterstützt de, en, fr, es, it. |
{
"id": "11111111-1111-4111-8111-111111111111",
"job_id": "11111111-1111-4111-8111-111111111111",
"status": "processing",
"mode": "transcript",
"title": "standup.m4a",
"filename": "standup.m4a",
"message": "Audio submitted for transcription. Poll GET /api/v1/transcriptions/:id until status is completed or failed."
}| 401 | UNAUTHORIZED | Kein gültiger Schlüssel und keine Sitzung. |
| 400 | NO_FILE | Im Formular fehlt das Feld file. |
| 400 | INVALID_FORMAT | Kein unterstütztes Audioformat. |
| 413 | FILE_TOO_LARGE | Die Datei ist größer als 100 MB. Größere Aufnahmen lädst du in Teilen hoch. |
| 429 | RATE_LIMIT | Zu viele Uploads in dieser Minute. |
1curl -X POST "https://app.anymize.ai/api/v1/transcriptions" \2 -H "Authorization: Bearer YOUR_API_KEY" \3 -F "file=@standup.m4a" \4 -F "mode=transcript" \5 -F "language=de" Eine Anfrage trägt höchstens 100 MB, und große Anfragen reißen auf wackligen Leitungen gern ab. Für längere Aufnahmen gibt es deshalb den Upload in Teilen: bis 1 GB und 6 Stunden, am Ende steht trotzdem genau ein Auftrag mit einem Transkript.
So läuft es: Sitzung öffnen, die Teile der Reihe nach mit Content-Range schicken, dann complete aufrufen. Du bekommst dieselbe Auftrags-ID wie beim einfachen Upload und fragst den Status über GET /api/v1/transcriptions/:id ab.
JSON mit Dateiname, Größe und Typ, dazu dieselben Optionen wie beim einfachen Upload. Format, Größe und Sprache werden schon hier geprüft, bevor ein Byte unterwegs ist. Die Antwort nennt sessionId, chunkSize und nextExpectedRanges.
/api/v1/transcriptions/uploadsRequest: application/json
Body
| Parameter | Type | Description |
|---|---|---|
filenamerequired | string | Der Dateiname der Aufnahme, etwa meeting.wav. Er wird zum Titel des Auftrags. |
sizerequired | integer | Die Größe der ganzen Datei in Bytes, höchstens 1 GB. |
mimeType | string | Der MIME-Typ, etwa audio/wav. Dieselben Formate wie beim einfachen Upload. |
mode | "transcript" | "meeting" | mode, speaker_detection, timestamps, language, prompt, context_bias und anonymize wirken wie beim einfachen Upload, hier als JSON-Felder. |
{
"sessionId": "22222222-2222-4222-8222-222222222222",
"uploadUrl": "/api/v1/transcriptions/uploads/22222222-2222-4222-8222-222222222222",
"chunkSize": 8388608,
"nextExpectedRanges": [
"0-"
],
"expiresAt": "2026-09-24T10: 15: 00.000Z",
"maxBytes": 1073741824
}| 401 | UNAUTHORIZED | Kein gültiger Schlüssel und keine Sitzung. |
| 400 | INVALID_BODY | Kein JSON-Objekt, oder filename bzw. size fehlt oder ist ungültig. |
| 400 | INVALID_FORMAT | Kein unterstütztes Audioformat (MP3, WAV, M4A, OGG, WEBM). |
| 413 | FILE_TOO_LARGE | Die Datei ist größer als 1 GB. |
| 429 | RATE_LIMIT | Zu viele Uploads in dieser Minute. |
| 503 | STORAGE_UNAVAILABLE | Der Speicher antwortet gerade nicht. Schick dieselbe Anfrage gleich noch einmal. |
1curl -X POST "https://app.anymize.ai/api/v1/transcriptions/uploads" \2 -H "Authorization: Bearer YOUR_API_KEY" \3 -H "Content-Type: application/json" \4 -d '{"filename":"workshop.wav","size":734003200 ,"mimeType":"audio/wav","mode":"meeting"}' Der rohe Teil als Body, dazu Content-Range: bytes Start-Ende/Gesamt und Content-Length. Die Antwort 202 nennt in nextExpectedRanges das nächste erwartete Byte. Einen schon angenommenen Teil darfst du gefahrlos noch einmal schicken.
/api/v1/transcriptions/uploads/:sessionIdRequest: application/octet-stream
{
"sessionId": "22222222-2222-4222-8222-222222222222",
"receivedBytes": 8388608,
"nextExpectedRanges": [
"8388608-"
],
"expiresAt": "2026-09-24T10: 16: 02.000Z"
}| 400 | INVALID_RANGE | Content-Range fehlt, ist falsch geformt oder passt nicht zur Länge des Bodys. |
| 400 | UPLOAD_INCOMPLETE | Der Body kam kürzer an als Content-Length, die Verbindung ist abgerissen. Schick denselben Teil noch einmal. |
| 401 | UNAUTHORIZED | Kein gültiger Schlüssel und keine Sitzung. |
| 404 | SESSION_NOT_FOUND | Diese Sitzung gibt es nicht, oder sie gehört einem anderen Konto. |
| 409 | RANGE_MISMATCH | Der Teil schließt nicht lückenlos an. nextExpectedRanges nennt das Byte, bei dem es weitergeht. |
| 410 | SESSION_EXPIRED | Die Sitzung ist abgelaufen, die Teile sind weg. Starte den Upload neu. |
| 411 | LENGTH_REQUIRED | Content-Length fehlt. Ohne Länge nimmt der Server keinen Teil an. |
| 413 | FILE_TOO_LARGE | Der Teil ist größer als die chunkSize der Sitzung. |
| 503 | STORAGE_UNAVAILABLE | Der Speicher antwortet gerade nicht. Schick dieselbe Anfrage gleich noch einmal. |
1# One part at a time, in order. Here: the second 8 MiB part. 2curl -X PUT "https://app.anymize.ai/api/v1/transcriptions/uploads/22222222 -2222 -4222 -8222 -222222222222 " \3 -H "Authorization: Bearer YOUR_API_KEY" \4 -H "Content-Type: application/octet-stream" \5 -H "Content-Range: bytes 8388608 -16777215 /734003200 " \6 --data-binary @part-001 .binWie viele Bytes angekommen sind und wo es weitergeht. Nach einem abgeschlossenen Upload steht hier auch die jobId.
/api/v1/transcriptions/uploads/:sessionId{
"sessionId": "22222222-2222-4222-8222-222222222222",
"filename": "workshop.wav",
"sizeBytes": 734003200,
"receivedBytes": 83886080,
"nextExpectedRanges": [
"83886080-"
],
"chunkSize": 8388608,
"expiresAt": "2026-09-24T10: 25: 40.000Z"
}| 404 | SESSION_NOT_FOUND | Diese Sitzung gibt es nicht, oder sie gehört einem anderen Konto. |
| 410 | SESSION_EXPIRED | Die Sitzung ist abgelaufen, die Teile sind weg. Starte den Upload neu. |
Bricht den Upload ab und entfernt alle Teile sofort. Ohne diesen Aufruf räumen wir sie eine Stunde nach dem letzten Teil selbst weg.
/api/v1/transcriptions/uploads/:sessionId{
"success": true
}| 404 | SESSION_NOT_FOUND | Diese Sitzung gibt es nicht, oder sie gehört einem anderen Konto. |
| 409 | SESSION_COMPLETED | Die Sitzung ist schon ein Auftrag geworden und lässt sich nicht mehr abbrechen. |
Wenn alle Teile oben sind: legt den Auftrag an und antwortet sofort mit 202 und seiner ID. Zusammensetzen, Umwandeln und Transkribieren laufen danach im Hintergrund. Ein wiederholter Aufruf liefert denselben Auftrag.
/api/v1/transcriptions/uploads/:sessionId/complete{
"id": "11111111-1111-4111-8111-111111111111",
"job_id": "11111111-1111-4111-8111-111111111111",
"status": "processing",
"mode": "meeting",
"title": "workshop.wav",
"filename": "workshop.wav",
"message": "Audio submitted for transcription. Poll GET /api/v1/transcriptions/:id until status is completed or failed."
}| 404 | SESSION_NOT_FOUND | Diese Sitzung gibt es nicht, oder sie gehört einem anderen Konto. |
| 409 | UPLOAD_INCOMPLETE | Es fehlen noch Teile. nextExpectedRanges zeigt, wo es weitergeht. |
| 410 | SESSION_EXPIRED | Die Sitzung ist abgelaufen, die Teile sind weg. Starte den Upload neu. |
1curl -X POST "https://app.anymize.ai/api/v1/transcriptions/uploads/22222222 -2222 -4222 -8222 -222222222222 /complete" \2 -H "Authorization: Bearer YOUR_API_KEY" Status, Text, Abschnitte und bei Meetings die Notizen. Audio-Bytes sind nicht enthalten.
Liefert den aktuellen Stand. Poll, bis status completed oder failed ist. text ist null, solange es läuft.
/api/v1/transcriptions/:id{
"id": "11111111-1111-4111-8111-111111111111",
"job_id": "11111111-1111-4111-8111-111111111111",
"status": "completed",
"mode": "transcript",
"title": "standup.m4a",
"filename": "standup.m4a",
"language": "de",
"words": 12,
"duration_ms": 18400,
"has_audio": true,
"speaker_detection": false,
"anonymize": false,
"anonymization_applied": false,
"text": "Guten Morgen. Lasst uns mit dem Stand-up beginnen.",
"segments": [
{
"start_ms": 0,
"end_ms": 18400,
"speaker": "",
"text": "Guten Morgen. Lasst uns mit dem Stand-up beginnen."
}
],
"created_at": "2026-09-11T08: 15: 00.000Z"
}{
"id": "11111111-1111-4111-8111-111111111111",
"job_id": "11111111-1111-4111-8111-111111111111",
"status": "completed",
"mode": "meeting",
"title": "Q3 Planung",
"filename": "meeting.wav",
"language": "de",
"words": 842,
"duration_ms": 3120000,
"has_audio": true,
"speaker_detection": true,
"anonymize": false,
"anonymization_applied": false,
"text": "(((Speaker 1))) Guten Morgen. (((Speaker 2))) Danke, dass ihr da seid.",
"segments": [
{
"start_ms": 0,
"end_ms": 2100,
"speaker": "Speaker 1",
"text": "Guten Morgen."
},
{
"start_ms": 2200,
"end_ms": 5400,
"speaker": "Speaker 2",
"text": "Danke, dass ihr da seid."
}
],
"summaries": [
{
"template_key": "general",
"title": null,
"content": "Stand-up zur Q3-Planung. Naechster Schritt: Budget bis Freitag.",
"status": "completed",
"locale": "de"
}
],
"created_at": "2026-09-11T08: 15: 00.000Z"
}| 401 | UNAUTHORIZED | Kein gültiger Schlüssel und keine Sitzung. |
| 404 | NOT_FOUND | Kein Audio-Auftrag mit dieser ID, oder er gehört dir nicht. |
1curl "https://app.anymize.ai/api/v1/transcriptions/11111111 -1111 -4111 -8111 -111111111111 " \2 -H "Authorization: Bearer YOUR_API_KEY" Deine Audio-Transkriptionen, ohne den vollen Text. Den holst du per GET auf die einzelne ID.
Nur Audio-Jobs. Filtern nach mode und status. Ohne Text und ohne Segmente, damit die Liste klein bleibt.
/api/v1/transcriptionsQuery
| Parameter | Type | Description |
|---|---|---|
mode | "transcript" | "meeting" | Nur transcript (kind input oder live) oder nur meeting. |
status | string | processing, pending, completed oder failed. |
limit | integer | Anzahl pro Seite, höchstens 100. |
offset | integer | Offset für die nächste Seite. |
{
"data": [
{
"id": "11111111-1111-4111-8111-111111111111",
"job_id": "11111111-1111-4111-8111-111111111111",
"status": "completed",
"mode": "transcript",
"title": "standup.m4a",
"filename": "standup.m4a",
"language": "de",
"words": 12,
"created_at": "2026-09-11T08: 15: 00.000Z"
}
],
"total": 1
}| 401 | UNAUTHORIZED | Kein gültiger Schlüssel und keine Sitzung. |
1curl "https://app.anymize.ai/api/v1/transcriptions?mode=transcript&limit=20 " \2 -H "Authorization: Bearer YOUR_API_KEY" Welchen Modus du wählst, entscheidet, was nach der Erkennung passiert, nicht die Qualität des Texts.
transcript speichert nur den Text. Keine automatischen Notizen, kein Meeting-Titel.
meeting erkennt Sprecher standardmäßig, vergibt einen Titel und erzeugt die Standard-Zusammenfassung.
Formate: MP3, WAV, M4A, OGG, WEBM. Bis 100 MB in einer Anfrage, bis 1 GB und 6 Stunden über den Upload in Teilen. Rate Limit: 50 Uploads pro Minute.
1curl -X POST "https://app.anymize.ai/api/v1/transcriptions" \2 -H "Authorization: Bearer YOUR_API_KEY" \3 -F "file=@meeting.wav" \4 -F "mode=meeting" \5 -F "speaker_detection=true" \6 -F "timestamps=true" Der ältere Endpunkt bleibt. Er startet dieselbe Engine und antwortet mit der historischen 202-Form, damit bestehende Clients weiter /api/status/:id pollen.
Nur API-Schlüssel, kein Session-Cookie. Dieselben Formularfelder wie POST /api/v1/transcriptions, inklusive mode.
/api/transcribeRequest: multipart/form-data
Body
| Parameter | Type | Description |
|---|---|---|
filerequired | File | Die Audio-Datei. MP3, WAV, M4A, OGG, WEBM. |
mode | "transcript" | "meeting" | transcript oder meeting. Vorgabe transcript. |
speaker_detection | boolean | Sprechererkennung. Vorgabe an bei meeting, sonst aus. |
timestamps | boolean | Abschnitte mit Millisekunden. Bei Sprechererkennung immer an. |
language | string | ISO-639-1, oder weglassen bzw. auto für Erkennung nach der Transkription. |
prompt | string | Kurzer Hinweis an die Erkennung, höchstens 1000 Zeichen. |
context_bias | string | Kommagetrennte Begriffe, damit Namen richtig geschrieben werden. Höchstens 100 Tokens. |
anonymize | boolean | Danach durch die Anonymisierung schicken. Unterstützt de, en, fr, es, it. |
{
"job_id": "11111111-1111-4111-8111-111111111111",
"status": "processing",
"message": "Audio submitted for transcription. Use /api/status/{job_id} to check status."
}1curl -X POST https://app.anymize.ai/api/transcribe \2 -H "Authorization: Bearer YOUR_API_KEY" \3 -F "file=@standup.mp3" \4 -F "language=de" Frage den aktuellen Status eines asynchronen Jobs ab.
/api/status/{jobId}| Parameter | Type | Description |
|---|---|---|
jobIdrequired | string | Die Job-ID, die du beim Erstellen des Jobs erhalten hast. |
Ein Job durchläuft folgende Zustände:
{
"job_id": "11111111-1111-4111-8111-111111111111",
"status": "processing"
}Bei abgeschlossenem Job enthält die Antwort das Ergebnis.
{
"job_id": "11111111-1111-4111-8111-111111111111",
"status": "completed",
"anonymized_text_raw": "Max [[Person-A1B2C3]] lives in [[Location-D4E5F6]].",
"original_text": "Max Mustermann lives in Berlin.",
"metadata": {
"filename": "document.pdf",
"language": "en",
"words": 6
}
}{
"job_id": "11111111-1111-4111-8111-111111111111",
"status": "failed"
}Frage den Status in regelmäßigen Abständen ab, bis der Job fertig ist.
Tipp
1# Poll every 3 seconds until completed 2while true; do3 RESULT=$(curl -s https://app.anymize.ai/api/status/11111111 -1111 -4111 -8111 -111111111111 \4 -H "Authorization: Bearer YOUR_API_KEY" )5 STATUS=$(echo $RESULT | jq -r '.status' )6 echo "Status: $STATUS" 7 if [ "$STATUS" = "completed" ] || [ "$STATUS" = "failed" ]; then8 echo $RESULT | jq .9 break10 fi11 sleep 3 12doneExportiere abgeschlossene Transkriptionen in verschiedenen Formaten.
/api/v1/jobs/{jobId}/exportGib Job-ID, Format und optional eine Variante an.
| Parameter | Type | Description |
|---|---|---|
jobIdrequired | string | Die Job-ID der abgeschlossenen Transkription. |
format | string | Ausgabeformat: pdf oder txt. docx liefert HTTP 501. |
textType | string | Variante des Exports (z.B. anonymisiert oder original). |
pdfPDF — Formatiertes Dokument mit Layout und Metadaten.txtTXT — Reiner Text ohne Formatierung.Der Download enthält passende Content-Type- und Content-Disposition-Header.
Content-Type: application/pdf
Content-Disposition: attachment; filename="document_anonymized.pdf"
Content-Length: 245832Wähle zwischen der originalen und der anonymisierten Version.
Tipp
1curl -OJ https://app.anymize.ai/api/v1/jobs/11111111 -1111 -4111 -8111 -111111111111 /export?format=pdf \2 -H "Authorization: Bearer YOUR_API_KEY" DOCX liefert 501. Nicht gefundene Jobs liefern 404, nicht abgeschlossene Jobs 400.
{
"error": "DOCX export not yet implemented"
}{
"error": "Job not found"
}