DeepScript

Integrazione

API REST di trascrizione – tre chiamate e basta

Carica, fai polling, recupera il risultato. JSON, timestamp per parola, 99 lingue, server propri in Germania.

L'API DeepScript segue il classico schema del job asincrono: invii in POST un file audio o video a `/v1/transcriptions`, ricevi un ID del job e poi fai polling su `/v1/transcriptions/{id}` ogni pochi secondi oppure ti fai notificare tramite webhook. L'autenticazione avviene tramite un header `X-API-KEY`; le chiavi iniziano con `ds_live_` e si generano nella dashboard. La risposta contiene il testo completo, i timestamp per parola con punteggi di confidenza, la lingua rilevata, le etichette dei parlanti e il costo calcolato. I formati di esportazione (TXT, SRT, VTT, JSON) sono disponibili tramite `/v1/transcriptions/{id}/export?format=srt`. La specifica OpenAPI 3.1 completa si trova su `/openapi.json`, un'interfaccia Scalar interattiva su `/docs`.

Visualizza la specifica OpenAPI 3.1

Cosa puoi creare

  • Carica file audio e video fino a 500 MB (mp3, wav, flac, ogg, m4a, aac, mp4, mkv, webm, mov).
  • Timestamp precisi a livello di parola con confidenza per parola – perfetti per sottotitoli e integrazioni con editor.
  • Diarizzazione dei parlanti in entrambi i piani, ottimizzazione dei dialetti DACH nel modello Premium.
  • Custom Vocabulary per richiesta – nomi di aziende, termini medici e nomi propri vengono riconosciuti correttamente.
  • Formati di esportazione su richiesta: TXT, SRT, VTT, JSON. Nessuna ricodifica lato client necessaria.
  • Callback webhook su `transcription.completed` – il polling è opzionale, nessun long-polling necessario.

Esempi di codice

Upload con 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 con 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 con 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"])

Configurazione in pochi passaggi

  1. 1

    Genera una chiave API

    Genera una chiave nella dashboard in Impostazioni → Sicurezza. La chiave viene mostrata una sola volta e inizia con `ds_live_`. Memorizzala nella tua applicazione come variabile d'ambiente `DEEPSCRIPT_API_KEY`.

  2. 2

    Invia la richiesta di upload

    Upload multipart verso POST `/v1/transcriptions` con i campi `file`, `model` (standard/premium) e, facoltativamente, `language` (ISO 639-1) e `vocabularyId`. Ricevi subito un ID del job (HTTP 202).

  3. 3

    Fai polling o attendi il webhook

    Chiama GET `/v1/transcriptions/{id}` ogni 2-5 secondi, oppure registra un webhook su `transcription.completed`. Regola pratica: 1 minuto di audio = 5-15 secondi di elaborazione in Standard, un po' di più in Premium.

  4. 4

    Recupera o esporta il risultato

    Quando `status: 'completed'`, il campo `result` contiene il testo completo, le parole con timestamp e le etichette dei parlanti. Per l'export SRT/VTT/TXT/JSON: GET `/v1/transcriptions/{id}/export?format=srt`.

Domande frequenti

Quali sono i rate limit?

100 richieste al minuto per chiave API nelle chiamate autenticate, 30/min senza autenticazione. La risposta include gli header `X-RateLimit-Limit`, `X-RateLimit-Remaining` e `X-RateLimit-Reset`. In caso di superamento ricevi un HTTP 429 con header Retry-After.

Supportate le idempotency key?

Sì – invia `Idempotency-Key: <uuid>` come header su POST `/v1/transcriptions`. Chiavi identiche entro 24 ore restituiscono la stessa risposta senza avviare un secondo job. Consigliato per i retry in caso di problemi di rete.

Quale intervallo di polling è consigliato?

Consigliamo 2-5 secondi. Per audio più lunghi (>30 min) ogni 10 secondi è sufficiente. Se preferisci evitare il polling, usa i webhook (`/v1/webhooks`) o lo stream Server-Sent Events su `/v1/transcriptions/{id}/events`.

Cosa succede in caso di job fallito?

Lo stato passa a `failed` e il campo `errorMessage` contiene una stringa Problem Details conforme a RFC 7807. Cause comuni: file troppo corto (<1 s), nessun audio rilevabile, formato non supportato. I job falliti non vengono addebitati.

Esiste un SDK ufficiale?

Per ora forniamo la specifica OpenAPI 3.1 su `/openapi.json` – usa `openapi-generator-cli` o `openapi-typescript` per generare un client tipizzato in qualsiasi linguaggio. SDK ufficiali per TypeScript e Python sono in preparazione.

Pronto a portarlo in produzione?

Crea un account, genera una chiave API e parti. Tre trascrizioni gratuite per provare. Documentazione OpenAPI 3.1 completa su api.deepscript.com/docs.

API REST DeepScript – Speech-to-Text dalla Germania | DeepScript