Real-time STT 4 min read

Deepgram Not Working?

API 401 (Token not Bearer), WebSocket not connecting, empty transcripts, Aura TTS silent, or credit balance 402? Check live status and fix it fast.

Deepgram live status

Deepgram — live status

Updated every 5 minutes. Full history at prismix.dev/service/deepgram.

Full status →

What's wrong? Diagnose fast

🔑

API 401 — "Token" not "Bearer"

Deepgram auth: Authorization: Token YOUR_API_KEY (capital T, "Token" not "Bearer"). This is different from OpenAI/Anthropic. Python SDK: DeepgramClient("YOUR_KEY"). Generate keys at console.deepgram.com/project/keys. Check you are in the right project.

📱

WebSocket not connecting

Realtime WebSocket URL: wss://api.deepgram.com/v1/listen. In browsers, pass auth as URL query param: ?token=YOUR_KEY (browsers block custom WS headers). From server: use Authorization: Token header. Required audio: raw 16-bit PCM, 16kHz, or add ?encoding=linear16&sample_rate=16000.

💬

Empty or wrong transcripts

Debug checklist: (1) use nova-3 model for best accuracy (nova-3-medical / nova-3-meeting for specialized audio); (2) add smart_format=true for punctuation; (3) set correct language=en-US; (4) check response.results.channels[0].alternatives[0].transcript; (5) for realtime, check is_final:true events.

💳

Credit balance 402

Deepgram pay-as-you-go: runs out when credit balance hits $0. Add credits at console.deepgram.com/project/billing. Free tier: $200 credit on signup (expires 12 months). Nova-3 costs $0.0043/min. For production: set up auto-reload in billing settings to avoid outages.

🔊

Aura TTS silent or wrong audio

Aura TTS: POST to /v1/speak?model=aura-asteria-en with JSON body {"text": "hello"}. Response is raw MP3 bytes. Common issues: (1) forgot Content-Type: application/json; (2) text >2,000 chars — chunk it; (3) wrong model name — valid: aura-asteria-en, aura-orpheus-en, aura-helios-en, aura-zeus-en (full list at deepgram.com/docs/tts).

📶

Callback/webhook not firing

For async transcription (batch), add callback=https://your-url.com to the request URL. The callback URL must be public HTTPS. Deepgram sends a POST with the transcript JSON when done. For realtime, use the WebSocket's onmessage event instead — no separate webhook needed.

Deepgram API quick reference

Pre-recorded transcription (REST API)

# "Token" not "Bearer" — this is the #1 auth mistake
curl -X POST "https://api.deepgram.com/v1/listen?model=nova-3&smart_format=true&language=en-US" \
  -H "Authorization: Token YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://your-public-url.com/audio.mp3"}'

# Upload a local file instead:
curl -X POST "https://api.deepgram.com/v1/listen?model=nova-3&smart_format=true" \
  -H "Authorization: Token YOUR_API_KEY" \
  -H "Content-Type: audio/mp3" \
  --data-binary @/path/to/audio.mp3

Real-time streaming (WebSocket, Node.js SDK)

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

const deepgram = createClient("YOUR_API_KEY");

const connection = deepgram.listen.live({
  model: "nova-3",        // nova-3 for best English accuracy
  language: "en-US",
  smart_format: true,     // punctuation + paragraphs
  interim_results: true,  // get partial results
});

connection.on("open", () => {
  // Start sending audio chunks (Buffer / ArrayBuffer)
  connection.send(audioChunk);
});

connection.on("transcript", (data) => {
  const transcript = data.channel.alternatives[0].transcript;
  if (data.is_final) console.log("Final:", transcript);
});

Aura TTS (text-to-speech)

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

const deepgram = createClient("YOUR_API_KEY");

const response = await deepgram.speak.request(
  { text: "Hello, this is Deepgram Aura TTS." },
  { model: "aura-asteria-en" }  // or aura-orpheus-en, aura-helios-en
);

const stream = await response.getStream();
const fileWriter = createWriteStream("output.mp3");
for await (const chunk of stream) {
  fileWriter.write(chunk);
}
fileWriter.end();

Deepgram models quick reference

Model ID Type Best for Price
nova-3 STT General English (best accuracy) $0.0043/min
nova-3-medical STT Medical vocabulary + clinical terms $0.0059/min
nova-2-meeting STT Multi-speaker meeting audio $0.0049/min
nova-2-phonecall STT Telephony / phone audio (8kHz) $0.0045/min
enhanced STT Legacy fallback, fast $0.0145/min
whisper-medium STT Multilingual (non-English) $0.0048/min
aura-asteria-en TTS Female voice (most used) $0.015/1k chars
aura-orpheus-en TTS Male conversational voice $0.015/1k chars
aura-helios-en TTS Male BBC-style narration $0.015/1k chars

Step-by-step fix

  1. 1

    Check live Deepgram status

    Visit prismix.dev/service/deepgram. Also status.deepgram.com. Check REST API and Realtime Streaming independently.

  2. 2

    Fix API 401 — use "Token" not "Bearer"

    Auth header: Authorization: Token YOUR_API_KEY (capital T, not "Bearer"). Python SDK: DeepgramClient("YOUR_KEY"). Generate keys at console.deepgram.com/project/keys.

  3. 3

    Fix WebSocket connection

    Endpoint: wss://api.deepgram.com/v1/listen. Browser auth: add ?token=YOUR_KEY to URL. Server: use Authorization: Token header. Set encoding=linear16&sample_rate=16000 unless sending MP3/WebM directly.

  4. 4

    Fix empty transcripts

    Use model nova-3 for English. Add smart_format=true for readable output. Check response.results.channels[0].alternatives[0].transcript. For realtime, handle is_final: true events.

  5. 5

    Fix credit balance 402

    Add credits at console.deepgram.com/project/billing. Nova-3 costs $0.0043/min. Enable auto-reload to prevent production outages. Free tier = $200 credit on signup (expires 12 months).

🔔

Get alerted when Deepgram goes down

Star Deepgram on Prismix and get emailed the moment status changes. Free, no credit card.

Frequently asked questions

Why is Deepgram not working?

Deepgram issues: (1) 401 — header is "Authorization: Token YOUR_KEY" (capital T, not Bearer); (2) WebSocket not connecting — use wss://api.deepgram.com/v1/listen, pass token in URL query param from browser; (3) empty transcript — use nova-3 model, set smart_format=true, check correct response path; (4) 402 — add credits at console.deepgram.com; (5) outage — prismix.dev/service/deepgram.

Is Deepgram down right now?

Check prismix.dev/service/deepgram for live status. Also status.deepgram.com tracks REST API and Realtime Streaming independently.

Deepgram API 401 — how to fix?

Auth header: Authorization: Token YOUR_API_KEY (capital T, not Bearer). This is unique to Deepgram — most AI APIs use "Bearer". Generate keys at console.deepgram.com/project/keys. SDK: DeepgramClient("YOUR_KEY"). No prefix character on the key itself.

Deepgram WebSocket not connecting — how to fix?

URL: wss://api.deepgram.com/v1/listen?model=nova-3&language=en-US. Pass auth as URL query param: &token=YOUR_KEY (required in browsers, which block custom WebSocket headers). Audio format: raw 16-bit PCM, 16kHz, or add &encoding=linear16&sample_rate=16000 to the URL params. Use the Deepgram SDK to handle reconnection automatically.

Deepgram transcript is empty — how to fix?

Empty transcript checklist: (1) test with a known-good audio file (Deepgram provides public examples); (2) use model=nova-3; (3) add smart_format=true for readable output with punctuation; (4) check the correct path: response.results.channels[0].alternatives[0].transcript; (5) for realtime, only emit transcript when is_final is true; (6) verify audio is not silence — Deepgram returns empty string for silent audio.

Related speech and AI APIs