AssemblyAI

Lightweight, dependency-free, in-memory AssemblyAI API fake for testing code that uses the real assemblyai Node.js SDK (and the language-agnostic AssemblyAI REST API).

Default port: 4858

Quick start

import { AssemblyaiServer } from "./services/assemblyai/src/server.js";

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

Point the real assemblyai client at it via baseUrl:

import { AssemblyAI } from "assemblyai";

const client = new AssemblyAI({ apiKey: "parlel_assemblyai", baseUrl: "http://127.0.0.1:4858" });

const transcript = await client.transcripts.transcribe({ audio_url: "https://x/a.wav" });
// transcript.status === "completed", transcript.text => deterministic text

Transcripts, uploads, and LeMUR responses are deterministic: derived from a hash of the input. Transcripts complete on the first GET.

Access via MCP / preview URL

Implemented operations

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
transcripts.create / get✅ Supported
transcripts.list (GET /v2/transcript)✅ Supported
transcripts.delete (DELETE /v2/transcript/:id)✅ Supported
files.upload (/v2/upload)✅ Supported
LeMUR generate/task◐ Accepted — deprecated endpoint, emulated for backward compat
Deterministic transcripts/responses✅ Supported
Full transcript response fields (speech_model, language_model, etc.)✅ Supported
Real speech recognition✓ By design — Intentionally unsupported (hash-derived)
Realtime/streaming transcription⟳ Roadmap
Polling delay (queued→processing→completed)◐ Completes immediately on first GET
Key validity / quota✓ By design — Never throttles — local tests run at full speed, zero cost

Error codes & shapes

Errors use { "error": "<message>" } — matching the real AssemblyAI API exactly.

StatusWhen
401missing/empty Authorization
400missing audio_url/prompt or bad JSON
404unknown transcript or endpoint
500internal server error

Manifest

See services/assemblyai/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.

ASSEMBLYAI_API_KEY=parlel_assemblyai
ASSEMBLYAI_BASE_URL=http://parlel-bridge:4858
<!-- parlel:testenv:end -->