Deepgram

Lightweight, dependency-free, in-memory Deepgram HTTP API fake for testing code that uses the real @deepgram/sdk (and the language-agnostic Deepgram REST API).

Default port: 4857

Quick start

import { DeepgramServer } from "./services/deepgram/src/server.js";

const server = new DeepgramServer(4857);
await server.start();
// ... run your app/tests ...
await server.stop();

Point the real @deepgram/sdk client at it:

import { createClient } from "@deepgram/sdk";

const deepgram = createClient("parlel_deepgram", { global: { url: "http://127.0.0.1:4857" } });

const { result } = await deepgram.listen.prerecorded.transcribeUrl(
  { url: "https://example.com/audio.wav" },
  { model: "nova-2" },
);
// result.results.channels[0].alternatives[0].transcript => deterministic text

Transcripts and TTS audio are deterministic: derived from a hash of the input audio/url/text.

Access via MCP / preview URL

Implemented operations

All /v1/* routes require Authorization: Token <key> (or Bearer).

Service & inspection operations (parlel extensions)

Surface coverage

This emulator faithfully replicates the API surface most application code and agents exercise. Anything below the supported lines is either an intentional design choice for a fast, zero-cost local emulator (✓ By design) or a candidate for a future release (⟳ Roadmap) — never a silent inaccuracy.

Legend: ✅ fully supported · ◐ accepted (stored, not strictly enforced) · ✓ by design · ⟳ on the roadmap.

FeatureStatus
listen (pre-recorded, url or bytes)✅ Supported
speak (TTS bytes)✅ Supported
projects list✅ Supported
Deterministic transcripts/audio✅ Supported
Real speech recognition / synthesis✓ By design — Intentionally unsupported (hash-derived)
Live/streaming websocket transcription⟳ Roadmap — pre-recorded only
Diarization / language detection accuracy✓ By design — Intentional for a local, zero-cost test emulator
Token validity / quota✓ By design — Never throttles — local tests run at full speed, zero cost

Error codes & shapes

Errors use { "err_code": "...", "err_msg": "..." }.

StatusWhen
401missing/invalid Authorization
400missing url/audio/text or bad JSON
404unknown endpoint

Manifest

See services/deepgram/manifest.json:

<!-- parlel:testenv:start -->

Configuration — test.env

Copy these into your test.env (used by the bridge sidecar flow). Tokens are Parlel's seeded test credentials — any non-empty value is accepted by the emulator, so you rarely need to change them. Swap in real credentials only when pointing at the live service in prod.env.

DEEPGRAM_API_KEY=parlel_deepgram
DEEPGRAM_BASE_URL=http://parlel-bridge:4857
<!-- parlel:testenv:end -->