OpenTranscription
OpenTranscription
RankerModelsPlayground
OpenTranscription
OpenTranscription

One API to every speech-to-text model worth using. Compare them on your audio, route to the best one, pay per second.

Platform status

Product

RankerModelsTranscriptionsPlaygroundBlog

Developers

DocumentationReliabilityAPI VersioningStatus

Legal

Privacy PolicyTerms of ServiceSupport
© 2026 OpenTranscription
Back to Models$0.0058/min

Nova-2 Phone Call

Deepgram

Batch & Realtime

Optimized for low-bandwidth phone call audio

Transcribe with this modelCompare in playground

1 languages · benchmarked

About Nova-2 Phone Call

Nova-2 Phone Call is a speech-to-text model from Deepgram. In our standardized benchmarks it reaches 16.38% word error rate, ranking #17 of 35 models tested. It supports 1 language and runs at $0.006/min — mid-range on price.

Its nearest benchmarked alternative is Soniox STT (Async). Best suited for live captioning and streaming transcription and multi-speaker conversations.

Overall Score

75.7

#17 of 35

Word Error Rate

16.38%

Character Error Rate

12.42%

Match Error Rate

15.95%

Word Info Lost

21.76%

Avg Latency

1.5s

Benchmarks Run

25

Benchmark trend

last 30 runs

Word error rate

16.57%

↓ 7.6% · 30d

3 runs ago

latest

Avg latency

1.3s

↑ 30.6% · 30d

3 runs ago

latest

Cost vs. accuracy

overall WER · 35 models

Nova-2 Phone Call

field · 34 models

lower-left is better

Performance by category

8 categories

WER

lower is better

Legal

3.5%

Technical

4.2%

Medical

8.6%

Conversational

9.4%

Finance

11.3%

General

12.0%

Noisy Environment

24.1%

Code-Switching

65.7%

CategoryWERCERMERWILLatencyBenchmarks

Code-Switching

65.71%
61.74%
64.94%
68.91%

4.7s

2

Conversational

9.41%
5.20%
9.32%
12.46%

1.1s

2

Finance

11.29%
5.45%
11.21%
18.73%

799ms

2

General

11.98%
6.61%
11.82%
18.94%

1.2s

9

Legal

3.45%
1.38%
3.43%
5.42%

1.5s

2

Medical

8.57%
4.00%
8.27%
11.09%

1.5s

2

Noisy Environment

24.09%
22.64%
22.42%
32.15%

1.4s

4

Technical

4.22%
2.47%
4.20%
5.89%

1.0s

2

Performance by accent

5 accents

AccentWERBenchmarks

African

27.69%

1

Australian

18.46%

1

Indian

25.40%

1

British

11.94%

1

American

13.21%

1

Realtime Score

77.8

TTFW (P50)

975 ms

Flicker

9.0%

Cadence

0.8/s

RTF

1.01×

Word Error Rate

19.26%

Character Error Rate

12.20%

Benchmarks Run

25

Pricing

pay per second

Rate

$0.0058

/min

Per-second billing. Bring your own provider key and pay your provider directly — a 5% routing fee applies (first 100 min/mo free).

Set up BYOK

Cost estimator

1 hour

$0.35

10 hours

$3.49

100 hours

$34.92

1,000 hours

$349.20

Billed per second of audio processed.

API & usage

POST /api/v1/transcriptions

Model ID

deepgram/nova-2-phonecall

Get an API key

Authenticate every request with your secret API key as a Bearer token. Issue a key from your dashboard.

This model also supports realtime streaming over WebSocket.

Use it with your agent

Paste this into Claude Code, Cursor, Codex or any agent with a shell. It installs the CLI and the OpenTranscription skill, then transcribes with this model.

Transcribe an audio file for me with OpenTranscription, using the model deepgram/nova-2-phonecall.
Set it up first:
npm install -g @opentranscription/cli
ot login
npx skills add opentranscription/skills
Then run:
ot transcribe <my-file> --model deepgram/nova-2-phonecall
Ask me one question at a time, and give me options to pick from rather than open questions. Look for audio files here before asking which one I mean. Leave the language alone unless I tell you what it is, since the model detects it.
This model can also label speakers with --diarize, and take a vocabulary of names and jargon with --vocab "Kubernetes,Sanjay". Offer those one at a time, and only if I have not already said.
The login step opens my browser and waits for me to approve it, so stop and tell me when you reach it. The skill covers the rest.
Agent SkillTypeScript SDKPython SDKCLI on npm

Quickstart

Upload your audio, create a job with this model, then poll the job or set a webhook_url to be notified when it completes.

// npm install @opentranscription/sdk
import { readFile } from 'node:fs/promises';
import { OpenTranscription } from '@opentranscription/sdk';
const ot = new OpenTranscription({ apiKey: process.env.OT_API_KEY! });
// Uploads the audio and opens the job. The signed-URL round trip is inside.
const job = await ot.transcribe({
file: await readFile('interview.mp3'),
fileName: 'interview.mp3',
model: 'deepgram/nova-2-phonecall',
language: 'en',
diarization: true,
customWords: ['Kubernetes', 'Grafana', 'Sanjay Bhattacharya'],
webhookUrl: 'https://your-app.com/webhooks/ot',
});
// We POST a signed event to that URL when the job finishes: no polling required.

Key parameters

file_path

string

required

Storage path returned by the upload step.

model

string

required

The model to run this job on.

models

string[]

Ordered fallback chain: primary first, then backups tried in order if a provider fails.

language

string

ISO 639-1 language code. Omit to auto-detect.

diarization

boolean

Label speakers (A, B, …) in the output.

custom_words

string[]

Names, jargon and product terms to bias the model toward. Up to 1000 entries.

vocabulary_list_id

uuid

A vocabulary list saved in your workspace. Merged with custom_words when both are sent.

webhook_url

string

HTTPS URL notified with the result when the job completes. Delivered events are signed (X-OT-Signature).

title

string

Display name for this job in the dashboard. Falls back to the file name.

Response

A completed job returns the transcript in the OpenTranscription Unified Schema (OTUS).

{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "completed",
"transcript": {
"text": "Welcome to the meeting, everyone.",
"language": "en",
"confidence": 0.97,
"segments": [
{
"id": 0,
"start": 0,
"end": 3.5,
"text": "Welcome to the meeting, everyone.",
"speaker": "A"
}
],
"words": [
{
"word": "Welcome",
"start": 0,
"end": 0.42,
"confidence": 0.99
}
]
}
}

Webhooks — skip polling

We POST a signed event to your webhook_url when a job completes or fails; verify the X-OT-Signature (HMAC-SHA256, reject if older than 300 s) and dedupe on the event id, then fetch the full transcript via GET /api/v1/transcriptions/{id}.

import { createHmac, timingSafeEqual } from "node:crypto";
// Your signing secret from Settings → API keys.
const SECRET = process.env.OT_WEBHOOK_SECRET ?? "";
function verify(
rawBody: string,
header: string,
nowSeconds = Math.floor(Date.now() / 1000),
): boolean {
const segments = header.split(",");
// Exactly one t= segment, finite, within the replay window.
const tValues = segments.filter((s) => s.startsWith("t=")).map((s) => s.slice(2));
if (tValues.length !== 1) return false;
const t = Number(tValues[0]);
if (!Number.isFinite(t) || Math.abs(nowSeconds - t) > 300) return false;
const expected = createHmac("sha256", SECRET)
.update(`${t}.${rawBody}`)
.digest("hex");
// Header may carry multiple v1 sigs (key rotation). Match any.
return segments
.filter((s) => s.startsWith("v1="))
.some((s) => {
const got = Buffer.from(s.slice(3), "hex");
const exp = Buffer.from(expected, "hex");
return got.length === exp.length && timingSafeEqual(got, exp);
});
}
// Express example. Use the RAW body buffer, not the parsed JSON.
// The X-OT-Signature header carries t=<unix>,v1=<hmac-hex>.
app.post("/webhooks/ot", express.raw({ type: "application/json" }), (req, res) => {
const sig = req.headers["x-ot-signature"] as string;
if (!verify(req.body.toString(), sig)) {
return res.sendStatus(400);
}
const event = JSON.parse(req.body.toString());
// Dedupe on event.id (at-least-once delivery), then enqueue + return 2xx fast.
res.sendStatus(200);
});
Get your signing secret

Rate-limited per tier — see the X-RateLimit-* response headers.

Full API reference

Similar models

from the same field

More accurate

Soniox STT (Async)

Soniox

8.73% WER

$0.0017/min

Compare →

Cheaper

Whisper Large V3 Turbo

Groq

14.31% WER

$0.0007/min

Compare →

Supported Languages

English

Supported Formats

mp3wavflacm4aoggwebm

Features

DiarizationCode-switchingWord Timestamps+1

Limits

Max file size

2 GB

Max duration

No documented limit