VoiceOps
01
Hosted beta Self-host free

What each call cost, how long callers waited, why SIP failed.

One collector in your voice agent; one dashboard with what each call cost, how long the caller waited, and why SIP calls failed. Built for agencies and multi-tenant SaaS that resell voice, and for small teams self-hosting LiveKit.

Demo agency · last 14 days Synthetic data
Cost / min$0.071
Margin72%
Turns > 1.2 s17%
  • SIP 486 ×14

    Busy Here on the latest calls

    Likely a concurrent-call limit, not a busy line. Check the trunk's channel/CPS cap.

  • −$2.63

    Harbor HVAC loses money

    $0.087/min cost against what you charge them.

  • Slow turns

    Time lost in LLM first token

    Most turns over 1.2 s wait on the LLM, not on end-of-turn or TTS.

  • Unpriced

    rime / mistv2 in 8 calls

    Flagged instead of counted as $0 until you add a price.

From voiceops demo: fictional customers, generated calls. Exact numbers vary per run.
02

Three dashboards per vendor, and still no answer

A voice agent touches speech-to-text, an LLM, text-to-speech and a carrier on every call. Each one has its own bill, its own logs and its own idea of "fast". These come from public posts (Reddit, the LiveKit forum, X) we read while researching how teams run voice agents in production.

Cost · one team said

"Which customer is the expensive one?"

A team self-hosting LiveKit, paying three provider invoices, could not tell. A developer elsewhere was surprised a 10-minute call came to $1.50–2.00 once everything was added up.

Latency · one team said

"The dashboards said we were fast"

Meanwhile callers heard about 950 ms of silence. Another team called matching each provider's dashboard by timestamp "archaeology", not observability.

SIP · one team said

"Our trunk disappeared after 7–8 hours"

Outbound calls just started failing. Others hit 404 "No trunk found" on every inbound call, or 486 Busy Here from about 14 concurrent calls in load tests.

03

How it works

One event stream, three views. Built on three open-source packages in the same repo: CallCost, CallTrace and SIPWatch.

  1. Create a project: one API key per project

    Agencies can run one project per client, or one project with every event tagged by customer_id.

  2. Attach the collector: one call in your agent

    attach_livekit(session, ...) for LiveKit Agents Python. Any other stack can POST /v0/events with plain JSON.

  3. Watch and get paged: dashboard plus Slack alerts

    Cost, margin, turn latency and SIP failures per project. Alerts open once and send "resolved" when the problem stops.

04

What the dashboard shows

Per project, from the same events.

Cost per call and per minute

Split by STT, LLM, TTS and telephony, so you see where the money goes.

Margin per customer

Enter what you charge each customer; see who is profitable and who is not.

p50 / p95 turn latency

And which step slow turns lose time in: end-of-turn detection, LLM first token or TTS first audio.

SIP failures with a likely cause

For example 486 around ~14 concurrent calls, or 404 "No trunk found" from "+" formatting, each with a suggested fix.

Unpriced models flagged

A model with no price shows up as a warning instead of a silent $0.

Recent calls and a page per call

Line items for every cost and a waterfall of every turn.

Slack alerts
  • Cost per minute over your limit
  • p95 turn latency over your limit
  • Repeated SIP failures
  • No calls for N minutes (a trunk that silently stopped routing)
  • Calls using models without a price
05

Quickstart

Self-host with one Docker container and SQLite, or use the hosted beta. The demo needs no third-party accounts.

Self-hosted: server and a demo project
# from a clone of the repo: source code coming soon
pip install ./cost-call ./call-traces ./sip-monitor ./voice-ops
voiceops demo           # demo project + its API key
voiceops serve          # http://127.0.0.1:8080

# one project per client (prints its API key)
voiceops project create "Acme Dental"

# or one Docker container, SQLite on a volume
docker build -f voice-ops/Dockerfile -t voiceops .
docker run -p 8080:8080 -v voiceops-data:/data voiceops
In your LiveKit agent (Python)
from voiceops.collect import attach_livekit

attach_livekit(
    session,
    api_key=os.environ["VOICEOPS_KEY"],
    customer_id="acme-dental",
)
Any other stack: plain HTTP
curl -X POST https://<your-voiceops-host>/v0/events \
  -H "Authorization: Bearer $VOICEOPS_KEY" \
  -H "Content-Type: application/json" \
  -d '{"v":0,"ts":1793900000,"call_id":"c-1","kind":"llm","customer_id":"acme-dental",
       "provider":"openai","model":"gpt-4o-mini","prompt_tokens":812,"completion_tokens":64}'

VoiceOps stores metrics, not audio or conversation text. A TypeScript snippet for LiveKit Agents JS is in the repo but not tested yet. Pipecat: cost only for now.

06

Pricing

Provisional. These prices may change before general availability.

Self-hosted · open source Free

One Docker container, SQLite, your own servers. Same dashboard, alerts and collector.

Hosted beta · provisional Free for design partners

The first design partners use the hosted beta free. After that:

  • Free up to 10,000 minutes a month
  • Then 5% of the provider spend VoiceOps tracks
  • $49/month minimum, capped at $499/month
07

Not there yet

Honest list. No billing or self-serve signup: beta access is given by hand from the waitlist. No OpenTelemetry export, no Telnyx configuration checks, no audio quality analysis. The TypeScript collector is untested and Pipecat sends cost only. Latency is measured inside the agent process, so the phone leg to the caller's ear is not included.

08

Request hosted beta access

We are looking for a few agencies, multi-tenant voice SaaS teams or self-hosted LiveKit teams (roughly 10k–500k minutes a month) to use it on their own calls.

We only use your email to contact you about this. Privacy.