Technical white paper · v2.0 · 26 September 2026

Analyzing voice calls for fraud from a pass-through SIP hop

Open Voice Shield is a SIP pass-through service: your switch sends the call through it as an ordinary hop, and after hangup the audio is transcribed and scored block, review or allow, with reasons. Version 2.0 adds what shipped in September: per-destination handling and sampling, three classes of analysis model chosen per tier, caller-ID verification, data location, and an agent interface an AI can run end to end. The paper covers the threat model, the call path, each pipeline stage, what we measured and what it does not do.

Document v2.0 26 Sep 2026
Analysis starts after BYE nothing is injected into live audio
Signalling SIP UDP, TCP; TLS on onward legs
Analyzed audio G.711G.722 G.729 and G.723.1 decoded after hang-up

Section 1

Scope, and who this is for

This paper is written for the people who will deploy it: NOC engineers, call-centre operations managers, and carrier or wholesale voice teams. It assumes you read SIP ladders, know what a pcap is, and will not accept a claim without a method behind it.

Two rules govern every number on this site. We publish only figures we measured, with sample size, date and hardware attached. And we publish no fraud-detection accuracy, precision or recall figure, because we have no labelled corpus of real fraudulent and legitimate calls. What we can show (latency, transcription error against a known script, and how far independent analysis tiers agree on the same calls) is measured, and we share it with the raw data on request.

Three deployments use the same hop. A carrier or wholesale trunk routes a client, a prefix or a sample of traffic through it. A business phone system sends its calls through it on the way to and from its carrier, so every call in or out of the business is scored. A mobile operator places it as a node in the path of enrolled numbers, over SIP from the core or behind an SS7-to-SIP gateway for legacy signalling. The hosted service runs in Canada. An on-premises licence runs the same software on the operator's hardware with its own models, keys and storage.

Section 2

Threat model

What the service is designed to catch, what the adversary controls, and where the boundary of the design sits.

The adversary

A human or scripted caller placing outbound calls through a trunk you operate or terminate. They control the caller ID they present, the script they read and how long they stay on the line. They do not control your switch, and do not know the call is being analyzed.

The harm

Impersonation of a bank, card issuer, government agency, utility or tech-support desk. Harvesting of card numbers, security codes, bank details or one-time codes. Prize and debt-collection pressure. Telemarketing that ignores identification, purpose and do-not-call rules. For the operator carrying the traffic, the harm is regulatory exposure and terminating-carrier complaints as much as the victim's loss.

The observation point

A pass-through hop sees the signalling and, because the media is relayed, both audio directions on separate channels. It sees nothing the parties did outside the call. It decides after the call clears, so it protects the next call, not the one it just heard.

Out of scope

Design boundaries as of 26 September 2026. Anything not listed as shipped is not claimed.
Not addressedWhy, and what an operator should do instead
Stopping the call in progress The verdict exists after the call clears. Enforcement applies to later calls: an automation rule can block or divert an ANI for a chosen window as soon as a verdict lands.
Caller-ID attestation The platform records the ANI presented and reasons about the audio. It does not validate or issue a signed attestation. Keep your existing attestation controls. What it can do since v2.0 is prove delivery: a caller-ID check places a call through a route and reports what arrived (section 8).
Synthetic-voice and voice-clone detection Not implemented. Analysis reads what was said, not how the voice was produced.
Adversarial evasion A caller who knows they are being transcribed can code-switch, mumble, use jargon or push details to SMS. We have not measured how far that degrades a verdict.
Codecs beyond G.711 G.711 A-law and µ-law and G.722 are decoded natively. G.729 and G.723.1 are decoded offline after hang-up. Media the decoder cannot read is reported as an unsupported-codec error on that call rather than guessed at.
Sensitive values in transcripts Card numbers, codes or account details spoken on a call are in the transcript as spoken. Redaction to typed placeholders is designed and not yet built. The portal masks phone numbers by default, and recordings and transcripts sit under the account's retention and audit controls (section 13).
Content the call never carried No enrichment from external reputation feeds, credit data or social sources. The verdict rests on this call's audio and its metadata.

Section 3

Where it sits in the call path

The ingress is an ordinary SIP hop. Your switch sends it the INVITE. The source IP is matched against the per-tenant allow-list, routing is by prefix so a tech prefix or a dialled range selects the destination, and the INVITE is relayed to the destination you configured, usually your own equipment or your onward carrier. No back-to-back user agent invents a new dialog: the far end sees your call, not ours.

Media is relayed so it can be captured, one capture per stream. That is what makes a two-channel recording (caller left, callee right) possible without conferencing or injection. Nothing is played into the call, and no audio is added, removed or transcoded on the way through.

Since v2.0 the ingress decides more per destination. Each destination carries a handling mode: full analysis, record only, or relay only (nothing recorded, the CDR is the record). It carries a sampling policy: analyze one call in N and record the rest for on-demand analysis, or, at the door, carry one in N and refuse the rest with 503 so the switch fails them over and nothing is recorded or charged. A whitelisted source IP can hold several sub-customers by dial prefix, stripped before the call goes on and stamped on the record. Destinations are monitored with SIP OPTIONS and show up or down with a round-trip time. And an account chooses its data location: the region whose relay carries its media and the region whose store keeps its recordings, Canada by default, the United States on request, with call records and analyses always in Canada.

Two operational behaviours matter to a NOC.

  • The ingress fails closed. If the authorization API cannot be reached, or returns something it cannot parse, the INVITE is answered 503 Service Unavailable, so your switch takes its normal alternate route instead of losing calls silently.
  • A prepaid balance is enforced as a per-call maximum duration, returned at authorization time. The dialog ends at the cut-off rather than running up an unbounded debt.
The call path and the post-call analysis pipeline Your switch sends the INVITE to the Open Voice Shield ingress. The ingress authenticates the source IP, relays the media while capturing it, and forwards the call to your destination. After the BYE the capture is decoded to a stereo recording, transcribed per channel, scored by the analysis model, and stored as a verdict that is delivered by API, webhook and alert. Your switch, SBC or PBX Open Voice Shield ingress Your destination or carrier Post-call pipeline the trunk you already run IP allow-list, prefix routing, dialog tracking media relayed and captured: no B2BUA unchanged INVITE, relayed onward 1. decode capture → stereo 8 kHz recording 2. transcribe each channel, label CALLER / CALLEE 3. score transcript → probability, flags, verdict 4. store, deliver by API, webhook, alert, case runs after the BYE: nothing enters the live audio INVITE INVITE 200 OK / RTP 200 OK / RTP BYE
Signalling and media pass through; the analysis happens afterwards, off the call path.

Section 4

The pipeline, stage by stage

Five stages run after the dialog ends. Each is a queued job, so a burst of hangups queues rather than dropping work. A transient failure is retried with backoff. A configuration error fails the call's analysis at once, and says why.

Pipeline stages. Measured stage latencies are available on request. This table describes what each stage does and how it fails.
Stage Input → output Failure behaviour
1. Capture Relayed RTP → one capture per media stream, kept with the call No capture found after three retries marks the call failed with recording_not_found, rather than analyzed from nothing.
2. Decode Capture(s) → stereo 8 kHz 16-bit recording, caller left, callee right Timing is rebuilt from RTP timestamps, so loss and silence suppression become silence rather than drift. Unreadable payload types stop the call with unsupported_codec.
3. Transcribe Recording → speaker-labelled transcript with per-segment timestamps Each channel is transcribed separately, which gives reliable CALLER: / CALLEE: attribution instead of guessed diarization. Silent channels are skipped. The model is the tier's: OpenAI's whisper-1 or gpt-4o transcribe, Whisper large-v3 on Groq, or a faster-whisper on the worker for audio that must not leave the network.
4. Analyze Transcript + call metadata → structured verdict (schema below) The declared JSON schema is required. A refusal or unparseable answer becomes a review verdict, never a silent allow. Prompt v4 gates the score: a probability above 70 needs a hard sign in the transcript: a request for money, cards or codes, a threat, a deadline, impersonation or remote access. Absence of identification alone is not evidence.
5. Deliver Verdict → stored record, signed webhook, alert email, case, share link Webhook delivery is signed and retried. A webhook that cannot be delivered never blocks the verdict from being stored.

Three classes of model, chosen per tier

The transcription and analysis models are not fixed. The operator sets, per customer tier, which pair runs and what the tier's per-call fee is. The customer picks the tier on the dashboard, and every call record and ledger line names the tier it was billed under. Three classes are available: frontier commercial models (OpenAI, Anthropic), large open-weight models through OpenRouter (gpt-oss 120B, Llama 3.3 70B, Mistral Small 3.2, Qwen3, DeepSeek and others, routed by throughput so a verdict takes about a second rather than most of a minute), and models on the operator's own hardware (a local Whisper on the worker). Each call records the provider, the model and what the call cost. OpenRouter reports its real charge per call, and the others are priced from a table the operator can edit. The one per-call fee a customer pays covers both the transcription and the analysis.

The tiers as configured on the hosted service, 26 September 2026. An operator with its own licence sets its own.
TierTranscriptionAnalysisFee per call
Economygpt-4o mini transcribegpt-oss 20B via OpenRouter$0.015
Power (default)Whisper large-v3 on Groqgpt-oss 120B via OpenRouter$0.02
Maxwhisper-1Claude Sonnet 5$0.05

Why the analysis is fixed work, not per-minute work

Transcription scales with call length. Analysis does not: it reads a transcript, not audio, and most of its input is fixed instructions. In the measured run, analysis latency across calls of 40 to 73 seconds stayed inside one band per tier, while transcription time tracked call length directly. That matters when you size a queue. Per-tier figures are available on request.

Section 5

What a verdict contains

Every analyzed call produces the same structured record, returned by the API, sent to your webhook and rendered in the console. Nothing in it is free-form except the fields typed as prose.

Verdict fields, as returned per call.
FieldTypeMeaning
recommendationblock | review | allow The action the platform recommends for this ANI.
probabilityinteger 0–100 How likely the call is a scam or unlawful telemarketing.
categoryenum Card scam, tech-support scam, government or bank impersonation, debt collection, prize or lottery, utility, compliant or non-compliant telemarketing, robocall, legitimate business, personal, unknown.
entitystring The organization the caller claimed to represent; empty if they named none.
caller_identitystring The identity the caller stated for themselves.
red_flagsstring[] Numbered observations, each tied to something said on the call.
tcpa_commentprose Identification, purpose, opt-out handling and misrepresentation, in TCPA / TSR terms.
summaryprose What happened on the call, in a few sentences.
titlestring A one-line description usable as a case title.
languagestring Language code detected for the conversation.
keywordsstring[] Terms that drove the classification, for search and rules.
route_alertobject | null A finding about the route rather than the caller: early answer on ringback, or a mid-call switch to recorded playback (section 7).
qosobject On the call record: estimated MOS, jitter and packet loss, overall and per leg, from the same capture (section 7).
ai_modeeconomy | power | max On the call record: the tier the call was processed and billed under (section 4).
sampled, sub_customerbool, string On the call record: whether the destination's sampling policy selected the call for analysis, and the sub-customer label from the dial prefix.

Alongside the verdict, the call keeps its recording, its speaker-labelled transcript with timestamps, its SIP ladder and its capture, so an analyst can check the reading against the evidence. All of it downloads as one offline bundle.

Section 6

Acting on a verdict

Automation rules
Match on the verdict and act on the ANI: block it, or divert it to a destination you choose, for a window you set. This is where a verdict becomes enforcement.
Cases
Group calls into an investigation with an assignee, comments and e-mail notification, so a fraud team works a pattern, not a list of rows.
Alerts and webhooks
Alert rules deliver by e-mail, or to a Slack channel each customer connects to their own workspace, on conditions you define: the verdict, or the call's quality. Outbound webhooks are signed so your receiver can verify them, and go to a pre-validated address.
Balance and cost signals
A low balance alert fires once when the prepaid balance drops under a threshold the account sets, by e-mail and to its channels, and re-arms after a top-up. Monthly invoices list call minutes, the transcription-and-analysis fee per call, caller-ID checks and plan lines.
Sharing evidence
A read-only link with a per-link password shows a call to someone without an account. The export bundle packages report, recording, capture and SIP log for offline review.
Voice AI destinations
A destination can be an AI voice agent, OpenAI (GPT-Live-1 and Realtime) or xAI, reached over TLS with SRTP media while the switch sends plain SIP and RTP, so a divert rule can hand a known fraud caller to a machine that keeps them talking, and a legacy switch can reach a modern agent at all. When the agent transfers the caller, the platform places the new call itself, so a switch without SIP REFER still gets its transfer. A test call can be placed by one of the account's agents and hold a real conversation with whatever answers. Every such call is still recorded, transcribed and analyzed, and the agent leg is metered per second. Not part of the measured pipeline in section 11.

Why the unit of action is the call: the compliance dimension

The tcpa_comment field exists because telemarketing liability in the United States accrues per communication. Statutory damages under the Telephone Consumer Protection Act (47 U.S.C. § 227) run up to $500 per illegal call or text and up to $1,500 where the violation is willful or knowing, with no cap on the aggregate. FCC forfeitures can reach tens of thousands of dollars per violation. These are citations of the statute, not measurements of ours. A per-call compliance note, surfaced minutes after hangup and enforceable through the automation rules above, matches the unit at which that exposure accrues. The operational case is laid out on TCPA penalty prevention and the arithmetic on what one illegal call costs.

The comment is a reading of the conversation against TCPA / TSR concepts, not a legal determination, and nothing in this paper is legal advice.

Section 11

What we measured

Method, corpus and raw data are available on request.

Measured figures are not published at present. Latency, transcription error against a known script and inter-tier agreement have all been measured on a development machine. We share the method, the corpus and the raw results on request.

How the open-weight tier was chosen

Before an open-weight model became the default analysis model, each candidate ran the same labelled set of synthetic scam and legitimate transcripts plus a handful of real calls from the platform, and its verdict, category and probability were compared with the frontier models in use. A separate model then scored every written analysis blind, shuffled and anonymised, for how well its red flags quoted the call and how faithful its summary was. The candidate that agreed with the frontier verdicts on the real calls, wrote evidence the judge rated close to the frontier models, and answered in about a second through the fastest hosts became the default. Transcription providers were compared the same way, by word error rate against scripted calls.

Two limits. The labelled set is small and written by us, so it ranks models and cannot yield an accuracy figure. Agreement with a frontier model is agreement, not truth. The harness (app/scripts/eval_verdicts.py) ships with the platform so an operator can run the same comparison on their own labelled calls.

Section 12

What we have not measured yet

The known gaps as of version 2.0.

Section 13

Handling of recordings and evidence

Recordings and captures are stored in a bucket we control with server-side encryption and public access blocked, in Canada by default. An account can choose the United States for its storage and for the relay that carries its media, and other regions on request. Call records, transcripts and analyses stay in the platform database in Canada whatever the choice. Retention windows are enforced with real deletion. Every endpoint scopes a call to its own tenant, phone numbers are masked in the portal until revealed, and security-relevant actions go to an audit log against the acting user. An on-premises licence keeps all of it on the operator's hardware.

The full control list is on the security page: ingress authentication, credential handling, webhook signing and SSRF protection, share-link protection, rate limiting.

Section 14

Reproducing this

The harness, the corpus and the raw result file are kept so the numbers can be checked rather than believed: the corpus carries a SHA-256 per file, and the exact command, the hardware and the per-call results behind every aggregate travel with it. Ask us and we will send the lot.

Document v2.0, published 27 August 2026 and revised 6 and 26 September 2026 by Open Voice Shield. Figures dated where they appear. Corrections: support@telecomsxchange.com.