Using Deepgram Conversational STT / Flux (JavaScript / TypeScript SDK)
Turn-aware streaming STT via /v2/listen for conversational audio and explicit turn events.
When to use this product
- You need turn-aware transcription, not just a word stream.
- You want Flux-style events like
TurnInfo and Connected.
- You are building a conversational interface but do not want the full Voice Agent runtime.
Use a different skill when:
- You want general v1 transcription or prerecorded REST →
deepgram-js-speech-to-text.
- You want a hosted assistant with think + speak built in →
deepgram-js-voice-agent.
- You want analytics overlays like sentiment and summaries →
deepgram-js-audio-intelligence.
Authentication
require("dotenv").config();
const { DeepgramClient } = require("@deepgram/sdk");
const deepgramClient = new DeepgramClient({
apiKey: process.env.DEEPGRAM_API_KEY,
});
Quick start
From examples/26-transcription-live-websocket-v2.ts:
const deepgramConnection = await deepgramClient.listen.v2.createConnection({
model: "flux-general-en",
});
deepgramConnection.on("message", (data) => {
if (data.type === "Connected") {
console.log("Connected:", data);
} else if (data.type === "TurnInfo") {
console.log("Turn Info:", data);
} else if (data.type === "FatalError") {
deepgramConnection.close();
}
});
deepgramConnection.connect();
await deepgramConnection.waitForOpen();
// Swap this for a live mic capture in real apps; the repo example uses
// `createReadStream` over a sample file.
const { createReadStream } = require("node:fs");
const audioStream = createReadStream("samples/spacewalk.wav");
audioStream.on("data", (chunk) => {
deepgramConnection.sendMedia(chunk);
});
audioStream.on("end", () => {
deepgramConnection.sendCloseStream({ type: "CloseStream" });
});
Key parameters / API surface
- Connect args from
src/api/resources/listen/resources/v2/client/Client.ts: model, encoding, sample_rate, eager_eot_threshold, eot_threshold, eot_timeout_ms, keyterm, tag, mip_opt_out.
- Socket methods from
src/api/resources/listen/resources/v2/client/Socket.ts: sendMedia(...), sendCloseStream(...), sendListenV2Configure(...), waitForOpen().
- Custom wrapper additions from
src/CustomClient.ts: createConnection(...) alias and Node-only ping(...) helper.
Limitations
- The current generated
ListenV2Model type only exposes "flux-general-en".
- Product docs mention broader Flux capabilities, but
flux-general-multi / language_hint are not surfaced in this repo's generated types today.
API reference (layered)
- In-repo reference:
reference.md does not currently document listen.v2; use src/CustomClient.ts and src/api/resources/listen/resources/v2/client/{Client,Socket}.ts as the in-repo source of truth.
- Canonical OpenAPI (REST): https://developers.deepgram.com/openapi.yaml
- Canonical AsyncAPI (WSS): https://developers.deepgram.com/asyncapi.yaml
- Context7: library ID
/llmstxt/developers_deepgram_llms_txt
- Product docs:
Gotchas
- There is no REST path here. This skill is
/v2/listen WebSocket only.
- Current repo typing only allows
flux-general-en. Treat multilingual Flux support as a product capability not yet reflected in this SDK surface.
- Close with
sendCloseStream, not sendFinalize. Finalize is the v1 pattern.
ping() is Node-only. src/CustomClient.ts throws in browsers because browser WS ping frames are not user-exposed.
createConnection() is lazy. Call connect() after registering handlers.
- The example explicitly warns about access/availability. A 400 may mean your account or endpoint is not enabled yet, not that your socket code is wrong.
- Omit
encoding for containerized audio. Keep it for raw PCM/Opus streams.
Example files in this repo
examples/26-transcription-live-websocket-v2.ts
examples/27-deepgram-session-header.ts
Central product skills
For cross-language Deepgram product knowledge — the consolidated API reference, documentation finder, focused runnable recipes, third-party integration examples, and MCP setup — install the central skills:
npx skills add deepgram/skills
This SDK ships language-idiomatic code skills; deepgram/skills ships cross-language product knowledge (see api, docs, recipes, examples, starters, setup-mcp).
1---2name: deepgram-js-conversational-stt3description: Use when writing or reviewing JavaScript/TypeScript in this repo that calls Deepgram Conversational STT v2 / Flux (`/v2/listen`) for turn-aware streaming transcription. Covers `client.listen.v2.createConnection()` / `connect()`, Flux models, and turn events like `TurnInfo`. Use `deepgram-js-speech-to-text` for standard v1 ASR and `deepgram-js-voice-agent` for full-duplex assistants. Triggers include "flux", "v2 listen", "conversational STT", "turn detection", "end of turn", "EOT", and "listen.v2".4---56# Using Deepgram Conversational STT / Flux (JavaScript / TypeScript SDK)78Turn-aware streaming STT via `/v2/listen` for conversational audio and explicit turn events.910## When to use this product1112- You need **turn-aware** transcription, not just a word stream.13- You want Flux-style events like `TurnInfo` and `Connected`.14- You are building a conversational interface but do **not** want the full Voice Agent runtime.1516**Use a different skill when:**17- You want general v1 transcription or prerecorded REST → `deepgram-js-speech-to-text`.18- You want a hosted assistant with think + speak built in → `deepgram-js-voice-agent`.19- You want analytics overlays like sentiment and summaries → `deepgram-js-audio-intelligence`.2021## Authentication2223```js24require("dotenv").config();2526const { DeepgramClient } = require("@deepgram/sdk");2728const deepgramClient = new DeepgramClient({29 apiKey: process.env.DEEPGRAM_API_KEY,30});31```3233## Quick start3435From `examples/26-transcription-live-websocket-v2.ts`:3637```js38const deepgramConnection = await deepgramClient.listen.v2.createConnection({39 model: "flux-general-en",40});4142deepgramConnection.on("message", (data) => {43 if (data.type === "Connected") {44 console.log("Connected:", data);45 } else if (data.type === "TurnInfo") {46 console.log("Turn Info:", data);47 } else if (data.type === "FatalError") {48 deepgramConnection.close();49 }50});5152deepgramConnection.connect();53await deepgramConnection.waitForOpen();5455// Swap this for a live mic capture in real apps; the repo example uses56// `createReadStream` over a sample file.57const { createReadStream } = require("node:fs");58const audioStream = createReadStream("samples/spacewalk.wav");5960audioStream.on("data", (chunk) => {61 deepgramConnection.sendMedia(chunk);62});6364audioStream.on("end", () => {65 deepgramConnection.sendCloseStream({ type: "CloseStream" });66});67```6869## Key parameters / API surface7071- Connect args from `src/api/resources/listen/resources/v2/client/Client.ts`: `model`, `encoding`, `sample_rate`, `eager_eot_threshold`, `eot_threshold`, `eot_timeout_ms`, `keyterm`, `tag`, `mip_opt_out`.72- Socket methods from `src/api/resources/listen/resources/v2/client/Socket.ts`: `sendMedia(...)`, `sendCloseStream(...)`, `sendListenV2Configure(...)`, `waitForOpen()`.73- Custom wrapper additions from `src/CustomClient.ts`: `createConnection(...)` alias and Node-only `ping(...)` helper.7475## Limitations7677- The current generated `ListenV2Model` type only exposes `"flux-general-en"`.78- Product docs mention broader Flux capabilities, but `flux-general-multi` / `language_hint` are **not** surfaced in this repo's generated types today.7980## API reference (layered)81821. **In-repo reference**: `reference.md` does not currently document `listen.v2`; use `src/CustomClient.ts` and `src/api/resources/listen/resources/v2/client/{Client,Socket}.ts` as the in-repo source of truth.832. **Canonical OpenAPI (REST)**: https://developers.deepgram.com/openapi.yaml843. **Canonical AsyncAPI (WSS)**: https://developers.deepgram.com/asyncapi.yaml854. **Context7**: library ID `/llmstxt/developers_deepgram_llms_txt`865. **Product docs**:87 - https://developers.deepgram.com/reference/speech-to-text/listen-flux88 - https://developers.deepgram.com/docs/flux/quickstart89 - https://developers.deepgram.com/docs/flux/language-prompting9091## Gotchas92931. **There is no REST path here.** This skill is `/v2/listen` WebSocket only.942. **Current repo typing only allows `flux-general-en`.** Treat multilingual Flux support as a product capability not yet reflected in this SDK surface.953. **Close with `sendCloseStream`, not `sendFinalize`.** Finalize is the v1 pattern.964. **`ping()` is Node-only.** `src/CustomClient.ts` throws in browsers because browser WS ping frames are not user-exposed.975. **`createConnection()` is lazy.** Call `connect()` after registering handlers.986. **The example explicitly warns about access/availability.** A 400 may mean your account or endpoint is not enabled yet, not that your socket code is wrong.997. **Omit `encoding` for containerized audio.** Keep it for raw PCM/Opus streams.100101## Example files in this repo102103- `examples/26-transcription-live-websocket-v2.ts`104- `examples/27-deepgram-session-header.ts`105106## Central product skills107108For cross-language Deepgram product knowledge — the consolidated API reference, documentation finder, focused runnable recipes, third-party integration examples, and MCP setup — install the central skills:109110```bash111npx skills add deepgram/skills112```113114This SDK ships language-idiomatic code skills; `deepgram/skills` ships cross-language product knowledge (see `api`, `docs`, `recipes`, `examples`, `starters`, `setup-mcp`).