DeepScript

Integration

REST-API für Transkription — drei Calls, fertig

Hochladen, pollen, Ergebnis abholen. JSON, Wort-Timestamps, 99 Sprachen, eigene Server in Deutschland.

Die DeepScript-API folgt dem klassischen Async-Job-Muster: Du POSTest eine Audio- oder Videodatei an `/v1/transcriptions`, bekommst eine Job-ID zurück und pollst entweder `/v1/transcriptions/{id}` alle paar Sekunden oder lässt dich per Webhook benachrichtigen. Die Authentifizierung läuft über einen `X-API-KEY`-Header, der API-Key beginnt mit `ds_live_` und wird im Dashboard generiert. Die Response enthält Volltext, Wort-Timestamps mit Confidence-Werten, erkannte Sprache, Sprecher-Labels und die berechneten Kosten. Exportformate (TXT, SRT, VTT, JSON) holst du dir über `/v1/transcriptions/{id}/export?format=srt`. Die vollständige OpenAPI-3.1-Spec liegt unter `/openapi.json`, eine interaktive Scalar-UI unter `/docs`.

OpenAPI 3.1 Spec ansehen

Was du bauen kannst

  • Audio- und Videodateien bis 500 MB hochladen (mp3, wav, flac, ogg, m4a, aac, mp4, mkv, webm, mov).
  • Wort-genaue Timestamps mit Confidence pro Wort — perfekt für Untertitel und Editor-Integrationen.
  • Sprecher-Diarisierung in beiden Tiers, DACH-Dialekt-Optimierung im Premium-Modell.
  • Custom Vocabulary per Request — Firmennamen, medizinische Begriffe, Eigennamen werden korrekt erkannt.
  • Exportformate auf Knopfdruck: TXT, SRT, VTT, JSON. Kein clientseitiges Re-Encoding nötig.
  • Webhook-Callbacks bei `transcription.completed` — Polling ist optional, kein Long-Polling nötig.

Code-Beispiele

Upload mit curlcURL
# Upload an audio file and start a Premium transcription job
curl -X POST https://api.deepscript.com/v1/transcriptions \
  -H "X-API-KEY: ds_live_xxx" \
  -F "file=@meeting.mp3" \
  -F "model=premium" \
  -F "language=de"

# Response:
# {
#   "id": "8b1f2e4a-9c3d-4f7e-a1b2-1234567890ab",
#   "status": "queued",
#   "progress": 0,
#   "model": "premium",
#   "createdAt": "2026-06-09T10:14:22Z"
# }

# Poll until done
curl https://api.deepscript.com/v1/transcriptions/8b1f2e4a-9c3d-4f7e-a1b2-1234567890ab \
  -H "X-API-KEY: ds_live_xxx"

# Download as SRT
curl -o meeting.srt \
  "https://api.deepscript.com/v1/transcriptions/8b1f2e4a-9c3d-4f7e-a1b2-1234567890ab/export?format=srt" \
  -H "X-API-KEY: ds_live_xxx"
Node.js mit fetchJavaScript
import { readFile } from "node:fs/promises";

const API_KEY = process.env.DEEPSCRIPT_API_KEY; // "ds_live_xxx"
const BASE = "https://api.deepscript.com/v1";

async function transcribe(filePath) {
  const buffer = await readFile(filePath);
  const blob = new Blob([buffer], { type: "audio/mpeg" });

  const form = new FormData();
  form.append("file", blob, "meeting.mp3");
  form.append("model", "premium");
  form.append("language", "de");

  const created = await fetch(`${BASE}/transcriptions`, {
    method: "POST",
    headers: { "X-API-KEY": API_KEY },
    body: form,
  }).then((r) => r.json());

  // Poll every 3 seconds until done
  while (true) {
    await new Promise((r) => setTimeout(r, 3000));
    const job = await fetch(`${BASE}/transcriptions/${created.id}`, {
      headers: { "X-API-KEY": API_KEY },
    }).then((r) => r.json());

    if (job.status === "completed") return job.result;
    if (job.status === "failed") throw new Error(job.errorMessage);
  }
}

const result = await transcribe("./meeting.mp3");
console.log(result.text);
Python mit requestsPython
import os
import time
import requests

API_KEY = os.environ["DEEPSCRIPT_API_KEY"]  # "ds_live_xxx"
BASE = "https://api.deepscript.com/v1"
HEADERS = {"X-API-KEY": API_KEY}


def transcribe(path: str) -> dict:
    with open(path, "rb") as f:
        created = requests.post(
            f"{BASE}/transcriptions",
            headers=HEADERS,
            files={"file": f},
            data={"model": "premium", "language": "de"},
            timeout=120,
        ).json()

    job_id = created["id"]
    while True:
        time.sleep(3)
        job = requests.get(
            f"{BASE}/transcriptions/{job_id}", headers=HEADERS, timeout=30
        ).json()
        if job["status"] == "completed":
            return job["result"]
        if job["status"] == "failed":
            raise RuntimeError(job["errorMessage"])


result = transcribe("meeting.mp3")
print(result["text"])

Setup in wenigen Schritten

  1. 1

    API-Key erstellen

    Im Dashboard unter Einstellungen → Sicherheit einen Key generieren. Der Key wird nur einmal angezeigt und beginnt mit `ds_live_`. Setze ihn als Environment Variable `DEEPSCRIPT_API_KEY` in deiner Anwendung.

  2. 2

    Upload-Request senden

    Multipart-Upload an POST `/v1/transcriptions` mit Feldern `file`, `model` (standard/premium) und optional `language` (ISO 639-1) sowie `vocabularyId`. Du bekommst sofort eine Job-ID zurück (HTTP 202).

  3. 3

    Pollen oder Webhook abwarten

    Entweder alle 2-5 Sekunden GET `/v1/transcriptions/{id}` aufrufen, oder einen Webhook auf `transcription.completed` registrieren. Faustregel: 1 Minute Audio = 5-15 Sekunden Verarbeitung in Standard, etwas länger in Premium.

  4. 4

    Ergebnis abrufen oder exportieren

    Wenn `status: 'completed'` ist, enthält das `result`-Feld Volltext, Wörter mit Timestamps und Sprecher-Labels. Für SRT/VTT/TXT/JSON-Export: GET `/v1/transcriptions/{id}/export?format=srt`.

Häufige Fragen

Wie hoch sind die Rate Limits?

100 Requests pro Minute pro API-Key bei authentifizierten Calls, 30/min ohne Auth. Die Response enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining` und `X-RateLimit-Reset`. Bei Überschreitung gibt es HTTP 429 mit Retry-After-Header.

Unterstützt ihr Idempotency Keys?

Ja — sende `Idempotency-Key: <uuid>` als Header bei POST `/v1/transcriptions`. Identische Keys innerhalb von 24 Stunden geben dieselbe Response zurück, ohne den Job ein zweites Mal zu starten. Empfohlen für Retries bei Netzwerkproblemen.

Welches Polling-Intervall ist sinnvoll?

Wir empfehlen 2-5 Sekunden. Für längere Audios (>30 Min) reicht alle 10 Sekunden. Wer kein Polling will, nutzt Webhooks (`/v1/webhooks`) oder den Server-Sent-Events-Stream unter `/v1/transcriptions/{id}/events`.

Was passiert bei einem failed Job?

Der Status wechselt auf `failed` und das Feld `errorMessage` enthält einen RFC-7807-konformen Problem-Details-String. Häufige Ursachen: Datei zu kurz (<1 Sek), kein erkennbares Audio, nicht unterstütztes Format. Du wirst für fehlgeschlagene Jobs nicht belastet.

Gibt es ein offizielles SDK?

Aktuell stellen wir die OpenAPI-3.1-Spec unter `/openapi.json` bereit — daraus generierst du dir mit `openapi-generator-cli` oder `openapi-typescript` einen typsicheren Client in jeder Sprache. Offizielle SDKs für TypeScript und Python sind in Vorbereitung.

Bereit, das in Production zu bringen?

Account erstellen, API-Key generieren, los geht's. Drei Transkriptionen kostenlos zum Testen. Vollständige OpenAPI 3.1 Docs unter api.deepscript.com/docs.

DeepScript REST API — Speech-to-Text aus Deutschland | DeepScript