This guide helps you migrate from Deepgram JavaScript SDK v4 to v5.0.0. The v5 release introduces significant improvements including auto-generated types via Fern, versioned API namespaces, simplified error handling, and an improved WebSocket API.
- Installation
- Configuration Changes
- Authentication Changes
- API Method Changes
- Error Handling
- TypeScript Support
- Breaking Changes Summary
npm install @deepgram/sdk
# or
pnpm add @deepgram/sdk
# or
yarn add @deepgram/sdkimport { createClient } from "@deepgram/sdk";
// API key as first parameter
const deepgram = createClient("YOUR_API_KEY");
// Or with options object
const deepgram = createClient({ key: "YOUR_API_KEY" });
// Or using environment variable
const deepgram = createClient();
// With custom base URL
const deepgram = createClient("YOUR_API_KEY", {
global: { fetch: { options: { url: "https://api.beta.deepgram.com" } } },
});import { DeepgramClient } from "@deepgram/sdk";
// Options object with apiKey property
const deepgram = new DeepgramClient({ apiKey: "YOUR_API_KEY" });
// Or using environment variable (DEEPGRAM_API_KEY)
const deepgram = new DeepgramClient();
// With custom base URL
const deepgram = new DeepgramClient({
apiKey: "YOUR_API_KEY",
baseUrl: "https://api.beta.deepgram.com",
});- v4:
createClient({ accessToken: "YOUR_ACCESS_TOKEN" }) - v5.0.0:
new DeepgramClient({ accessToken: "YOUR_ACCESS_TOKEN" })
- Explicit
accessTokenparameter (highest priority) - Explicit
apiKeyparameter DEEPGRAM_API_KEYenvironment variable (lowest priority)
v4
const { result, error } = await deepgram.auth.grantToken();v5.0.0
const data = await deepgram.auth.v1.tokens.grant();v4
const { result, error } = await deepgram.listen.prerecorded.transcribeUrl(
{ url: "https://dpgr.am/spacewalk.wav" },
{
model: "nova-3",
language: "en",
punctuate: true,
}
);v5.0.0
const data = await deepgram.listen.v1.media.transcribeUrl({
url: "https://dpgr.am/spacewalk.wav",
model: "nova-3",
language: "en",
punctuate: true,
});v4
import fs from "fs";
const { result, error } = await deepgram.listen.prerecorded.transcribeFile(
fs.createReadStream("./audio.wav"),
{
model: "nova-3",
language: "en",
}
);v5.0.0
import fs from "fs";
const data = await deepgram.listen.v1.media.transcribeFile(
fs.createReadStream("./audio.wav"),
{
model: "nova-3",
language: "en",
}
);v4
const { result, error } = await deepgram.listen.prerecorded.transcribeUrl(
{ url: "https://dpgr.am/spacewalk.wav" },
{
callback: "https://your-server.com/callback",
callback_method: "POST",
model: "nova-3",
}
);v5.0.0
const data = await deepgram.listen.v1.media.transcribeUrl({
url: "https://dpgr.am/spacewalk.wav",
callback: "https://your-server.com/callback",
callback_method: "POST",
model: "nova-3",
});v4
import { LiveTranscriptionEvents } from "@deepgram/sdk";
const connection = deepgram.listen.live({
model: "nova-3",
language: "en",
punctuate: true,
interim_results: true,
});
connection.on(LiveTranscriptionEvents.Open, () => {
console.log("Connected");
});
connection.on(LiveTranscriptionEvents.Transcript, (data) => {
console.log(data);
});
connection.on(LiveTranscriptionEvents.Error, (error) => {
console.error(error);
});v5.0.0
const connection = await deepgram.listen.v1.connect({
model: "nova-3",
language: "en",
punctuate: "true",
interim_results: "true",
});
connection.on("open", () => {
console.log("Connected");
});
connection.on("message", (data) => {
if (data.type === "Results") {
console.log(data);
}
});
connection.on("error", (error) => {
console.error(error);
});
connection.connect();
await connection.waitForOpen();Note: In v5, WebSocket options that accept boolean values must be passed as strings (
"true"instead oftrue).
v5.0.0
const connection = await deepgram.listen.v2.connect({
model: "flux-general-en",
});
connection.on("open", () => {
console.log("Connected");
});
connection.on("message", (data) => {
if (data.type === "Connected") {
console.log("Connected:", data);
} else if (data.type === "TurnInfo") {
console.log("Turn Info:", data);
}
});
connection.connect();
await connection.waitForOpen();
// Send audio data
connection.sendMedia(audioChunk);
// Close stream when done
connection.sendCloseStream({ type: "CloseStream" });v4
const { result, error } = await deepgram.speak.request(
{ text: "Hello, world!" },
{
model: "aura-2-thalia-en",
encoding: "linear16",
container: "wav",
}
);v5.0.0
const data = await deepgram.speak.v1.audio.generate({
text: "Hello, world!",
model: "aura-2-thalia-en",
encoding: "linear16",
container: "wav",
});v4
const connection = deepgram.speak.live({
model: "aura-2-thalia-en",
encoding: "linear16",
container: "wav",
});
connection.on("audio", (audio) => {
// Handle audio chunks
});
connection.start();v5.0.0
const connection = await deepgram.speak.v1.connect({
model: "aura-2-thalia-en",
encoding: "linear16",
sample_rate: 24000,
});
connection.on("open", () => {
console.log("Connected");
});
connection.on("message", (data) => {
if (typeof data === "string") {
const audioBuffer = Buffer.from(data, "base64");
// Handle audio
}
});
connection.connect();
await connection.waitForOpen();
// Send text to synthesize
connection.sendSpeakV1Text({ type: "Text", text: "Hello, world!" });v4
const agent = deepgram.agent("/v1/agent/converse");
agent.on("open", () => {
console.log("Agent connected");
});
agent.on("conversation", (data) => {
console.log("Conversation:", data);
});
agent.start();v5.0.0
const connection = await deepgram.agent.v1.connect();
connection.on("open", () => {
console.log("Agent connected");
});
connection.on("message", (data) => {
if (data.type === "ConversationText") {
console.log("Conversation:", data);
}
});
connection.connect();
await connection.waitForOpen();
// Configure agent settings
connection.sendAgentV1Settings({
type: "Settings",
audio: {
input: {
encoding: "linear16",
sample_rate: 24000,
},
output: {
encoding: "linear16",
sample_rate: 16000,
container: "wav",
},
},
agent: {
language: "en",
listen: {
provider: { type: "deepgram", model: "nova-3" },
},
think: {
provider: { type: "open_ai", model: "gpt-4o-mini" },
prompt: "You are a friendly AI assistant.",
},
speak: {
provider: { type: "deepgram", model: "aura-2-thalia-en" },
},
greeting: "Hello! How can I help you today?",
},
});v4
// Analyze text
const { result, error } = await deepgram.read.analyzeText(
{ text: "Your text content here" },
{
language: "en",
topics: true,
intents: true,
sentiment: true,
summarize: true,
}
);
// Analyze URL
const { result, error } = await deepgram.read.analyzeUrl(
{ url: "https://example.com/article" },
{
language: "en",
topics: true,
sentiment: true,
}
);
// With callback
const { result, error } = await deepgram.read.analyzeTextCallback(
{ text: "Your text content here" },
"https://your-server.com/callback",
{ topics: true }
);v5.0.0
// Analyze text
const data = await deepgram.read.v1.text.analyze({
text: "Your text content here",
language: "en",
topics: true,
intents: true,
sentiment: true,
summarize: true,
});
// Analyze URL
const data = await deepgram.read.v1.text.analyze({
url: "https://example.com/article",
language: "en",
topics: true,
sentiment: true,
});
// With callback
const data = await deepgram.read.v1.text.analyze({
text: "Your text content here",
callback: "https://your-server.com/callback",
topics: true,
});Note: In v5, both text and URL analysis use the same
analyze()method. The SDK determines the analysis type based on whether you provide atextorurlproperty.
v4
// List all models
const { result, error } = await deepgram.models.getAll();
// Get a specific model
const { result, error } = await deepgram.models.getModel(modelId);v5.0.0
// List all models
const data = await deepgram.manage.v1.models.list();
// List models for a project
const data = await deepgram.manage.v1.projects.models.list(projectId);
// Get a specific model for a project
const data = await deepgram.manage.v1.projects.models.get(projectId, modelId);v4
// Get projects
const { result, error } = await deepgram.manage.getProjects();
// Get project
const { result, error } = await deepgram.manage.getProject(projectId);
// Update project
const { result, error } = await deepgram.manage.updateProject(
projectId,
options
);
// Delete project
const { error } = await deepgram.manage.deleteProject(projectId);v5.0.0
// Get projects
const data = await deepgram.manage.v1.projects.list();
// Get project
const data = await deepgram.manage.v1.projects.get(projectId);
// Update project
const data = await deepgram.manage.v1.projects.update(projectId, options);
// Delete project
await deepgram.manage.v1.projects.delete(projectId);
// Leave project
await deepgram.manage.v1.projects.leave(projectId);v4
// List keys
const { result, error } = await deepgram.manage.getProjectKeys(projectId);
// Get key
const { result, error } = await deepgram.manage.getProjectKey(
projectId,
keyId
);
// Create key
const { result, error } = await deepgram.manage.createProjectKey(
projectId,
options
);
// Delete key
const { error } = await deepgram.manage.deleteProjectKey(projectId, keyId);v5.0.0
// List keys
const data = await deepgram.manage.v1.projects.keys.list(projectId);
// Get key
const data = await deepgram.manage.v1.projects.keys.get(projectId, keyId);
// Create key
const data = await deepgram.manage.v1.projects.keys.create(projectId, options);
// Delete key
await deepgram.manage.v1.projects.keys.delete(projectId, keyId);v4
// Get members
const { result, error } = await deepgram.manage.getProjectMembers(projectId);
// Remove member
const { error } = await deepgram.manage.removeProjectMember(
projectId,
memberId
);v5.0.0
// Get members
const data = await deepgram.manage.v1.projects.members.list(projectId);
// Remove member
await deepgram.manage.v1.projects.members.delete(projectId, memberId);v4
// Get member scopes
const { result, error } = await deepgram.manage.getProjectMemberScopes(
projectId,
memberId
);
// Update scope
const { result, error } = await deepgram.manage.updateProjectMemberScope(
projectId,
memberId,
options
);v5.0.0
// Get member scopes
const data = await deepgram.manage.v1.projects.members.scopes.list(
projectId,
memberId
);
// Update scope
const data = await deepgram.manage.v1.projects.members.scopes.update(
projectId,
memberId,
options
);v4
// List invites
const { result, error } = await deepgram.manage.getProjectInvites(projectId);
// Send invite
const { result, error } = await deepgram.manage.sendProjectInvite(
projectId,
options
);
// Delete invite
const { error } = await deepgram.manage.deleteProjectInvite(projectId, email);v5.0.0
// List invites
const data = await deepgram.manage.v1.projects.members.invites.list(projectId);
// Send invite
const data = await deepgram.manage.v1.projects.members.invites.create(
projectId,
options
);
// Delete invite
await deepgram.manage.v1.projects.members.invites.delete(projectId, email);v4
// Get all requests
const { result, error } = await deepgram.manage.getProjectUsageRequests(
projectId,
options
);
// Get usage summary
const { result, error } = await deepgram.manage.getProjectUsageSummary(
projectId,
options
);
// Get usage fields
const { result, error } = await deepgram.manage.getProjectUsageFields(
projectId,
options
);v5.0.0
// Get all requests
const data = await deepgram.manage.v1.projects.requests.list(projectId, options);
// Get a specific request
const data = await deepgram.manage.v1.projects.requests.get(projectId, requestId);
// Get usage summary
const data = await deepgram.manage.v1.projects.usage.get(projectId, options);
// Get usage fields
const data = await deepgram.manage.v1.projects.usage.fields.list(projectId, options);
// Get usage breakdown
const data = await deepgram.manage.v1.projects.usage.breakdown.get(projectId, options);v4
// Get all balances
const { result, error } = await deepgram.manage.getProjectBalances(projectId);
// Get balance
const { result, error } = await deepgram.manage.getProjectBalance(
projectId,
balanceId
);v5.0.0
// Get all balances
const data = await deepgram.manage.v1.projects.billing.balances.list(projectId);
// Get balance
const data = await deepgram.manage.v1.projects.billing.balances.get(
projectId,
balanceId
);
// Get billing breakdown
const data = await deepgram.manage.v1.projects.billing.breakdown.list(
projectId,
options
);
// Get billing fields
const data = await deepgram.manage.v1.projects.billing.fields.list(projectId);
// Get purchases
const data = await deepgram.manage.v1.projects.billing.purchases.list(
projectId,
options
);v4
// List credentials
const { result, error } = await deepgram.onprem.listCredentials(projectId);
// Get credentials
const { result, error } = await deepgram.onprem.getCredentials(
projectId,
credentialId
);
// Create credentials
const { result, error } = await deepgram.onprem.createCredentials(
projectId,
options
);
// Delete credentials
const { error } = await deepgram.onprem.deleteCredentials(
projectId,
credentialId
);v5.0.0
// List credentials
const data = await deepgram.selfHosted.v1.distributionCredentials.list(
projectId
);
// Get credentials
const data = await deepgram.selfHosted.v1.distributionCredentials.get(
projectId,
credentialId
);
// Create credentials
const data = await deepgram.selfHosted.v1.distributionCredentials.create(
projectId,
options
);
// Delete credentials
await deepgram.selfHosted.v1.distributionCredentials.delete(
projectId,
credentialId
);const { result, error } = await deepgram.listen.prerecorded.transcribeUrl(
{ url: "https://dpgr.am/spacewalk.wav" },
{ model: "nova-3" }
);
if (error) {
console.error("Error:", error);
return;
}
console.log("Result:", result);try {
const data = await deepgram.listen.v1.media.transcribeUrl({
url: "https://dpgr.am/spacewalk.wav",
model: "nova-3",
});
console.log("Result:", data);
} catch (error) {
console.error("Error:", error);
// Error objects include: statusCode, body, rawResponse
}V5 provides enhanced TypeScript support with auto-generated types. All request and response types can be imported in two ways:
import { DeepgramClient } from "@deepgram/sdk";
import type {
ListenV1Response,
SpeakV1Response,
ReadV1Response,
GetProjectV1Response,
} from "@deepgram/sdk";
const deepgram = new DeepgramClient({ apiKey: "YOUR_API_KEY" });
const data: ListenV1Response = await deepgram.listen.v1.media.transcribeUrl({
url: "https://dpgr.am/spacewalk.wav",
model: "nova-3",
});import { DeepgramClient } from "@deepgram/sdk";
import type { Deepgram } from "@deepgram/sdk";
const deepgram = new DeepgramClient({ apiKey: "YOUR_API_KEY" });
const data: Deepgram.ListenV1Response =
await deepgram.listen.v1.media.transcribeUrl({
url: "https://dpgr.am/spacewalk.wav",
model: "nova-3",
});- Client Initialization:
createClient()replaced withnew DeepgramClient() - API Structure: All methods now use versioned namespaces (
v1,v2) - Error Handling:
{ result, error }pattern replaced with standard try/catch - WebSocket API: Complete redesign with async
connect()andwaitForOpen() - Type Safety: Enhanced auto-generated types via Fern
- Configuration: Simplified options object with
apiKeyandbaseUrl
createClient()function (replaced withnew DeepgramClient())keyproperty in options (replaced withapiKey){ result, error }return pattern (replaced with try/catch)LiveTranscriptionEventsenum for WebSocket events (replaced with string events)- Separate
analyzeText()/analyzeUrl()/analyzeTextCallback()methods (unified intoanalyze()) - Top-level
modelsnamespace (moved tomanage.v1.models) onpremnamespace (renamed toselfHosted)
- Auto-generated SDK: Built using Fern for better type safety and API consistency
- Listen V2: New streaming transcription endpoint with improved features
- Access Token Support: Native support for short-lived access tokens
- Session ID Tracking: Automatic session ID generation for request tracking
- Enhanced TypeScript: Auto-generated types with direct and namespace imports
- Unified Analysis: Single
analyze()method for text and URL analysis - Extended Billing: Breakdown, fields, and purchases endpoints under
billing - Extended Usage: Breakdown and per-request endpoints under
usage
- Update to latest version:
npm install @deepgram/sdk - Replace
createClient()withnew DeepgramClient() - Change
keyproperty toapiKeyin options - Update all API method calls to include version namespace (
v1,v2) - Update transcription methods:
listen.prerecorded.*→listen.v1.media.* - Update WebSocket connections to use async
connect()andwaitForOpen() - Update event handlers from named events to
messagewith type checking - Update error handling from
{ result, error }to try/catch - Update project methods:
manage.*→manage.v1.projects.* - Update keys:
manage.getProjectKeys()→manage.v1.projects.keys.list() - Update members:
manage.getProjectMembers()→manage.v1.projects.members.list() - Update scopes:
manage.getProjectMemberScopes()→manage.v1.projects.members.scopes.list() - Update invites:
manage.getProjectInvites()→manage.v1.projects.members.invites.list() - Update usage:
manage.getProjectUsageSummary()→manage.v1.projects.usage.get() - Update billing:
manage.getProjectBalances()→manage.v1.projects.billing.balances.list() - Update models API:
models.*→manage.v1.models.*ormanage.v1.projects.models.* - Update text intelligence:
read.analyzeText()/read.analyzeUrl()→read.v1.text.analyze() - Update authentication:
auth.grantToken()→auth.v1.tokens.grant() - Update text-to-speech:
speak.*→speak.v1.audio.* - Update self-hosted:
onprem.*→selfHosted.v1.distributionCredentials.* - Test all WebSocket connections and event handlers
- Review and update configuration options