Answering machine detection for Asterisk

Know who picked up. Before your agent says hello.

AMDSure tells your VICIdial, FreePBX or homegrown Asterisk dialer whether a person, a voicemail or a call screener answered. Your callers' audio stays on your server, and every error rate we publish comes with its sample size.

People sent to voicemail
0 of 23
Voicemails caught
74%
Verdict for people
2.55 s
Live verdictsengine v2 · East
  1. 14:02:11Personshort_greeting2.41 s
  2. 14:02:07Voicemaillong_greeting3.08 s
  3. 14:02:03Personmodel_person2.28 s
  4. 14:01:59Screenermodel_screener2.62 s
  5. 14:01:56Voicemailbeep4.87 s
  6. 14:01:52Unsuredead_air6.00 s
First six seconds after answerPerson at 2.41 s

Built for

  • VICIdial
  • FreePBX
  • Asterisk 18 to 22
  • Homegrown dialers

Measured, not claimed

Two error rates matter. We publish both.

A detector can be wrong in two directions. It can hang up on a person, or it can pass a voicemail to your agent. One "accuracy" figure hides which mistake you are paying for, so we report them apart, with the number of calls behind each.

People sent to voicemail

0of 23

Zero errors in 23 people still allows a true rate up to about 13%. It takes about 300 people with no errors to say "under 1%", and we will not say it before then.

Voicemails caught

74%163 of 221

Asterisk's built-in AMD() caught 26% of the same voicemails and was unsure on 67% of them.

Call screeners recognised

13of 14

Google Call Screen and iPhone screening get their own verdict. The built-in AMD() recognised none of them.

Time to a verdict for people

2.55s average

Measured from answer. A short hello is the clearest signal there is, so people are decided first.

Same calls, two detectors

AMDSure Built-in AMD()
Caught as voicemail
73.8%
26.2%
Left unsure
16.3%
67.4%
People sent to voicemail
0 of 23
0 of 23
How we measured

318 answered calls on RealDialer's own outbound traffic, October 6 to 9, 2026. Both detectors heard every call. The truth for each call comes from evidence the detector did not produce: what the agent marked, what the transcript shows, and how the call ended. Calls with conflicting evidence were left out of the scoring.

The voicemail figures are cross-validated: settings were chosen on four fifths of the calls and scored on the fifth they had not seen, five times over. The samples are small, from one customer and mostly one carrier mix. We will publish each larger sample as it comes in, including the ones that look worse.

How it works

A small listener on your box. The decision on ours.

  1. 01

    Listen where the call is

    A small extractor on your Asterisk server hears the first seconds of each answered call and turns them into a few hundred bytes of scores and timings: silence, speech, tones, beeps.

  2. 02

    Decide in milliseconds

    Our decision engine reads those numbers and answers person, voicemail, screener or unsure. Each answer is signed and tied to its request, so it cannot be forged or replayed.

  3. 03

    Branch like you do today

    The verdict lands in AMDSTATUS and AMDCAUSE, the variables AMD() already sets, plus AMDSURE_VERDICT for screeners. Your routes keep working.

extensions.confearly access integration
exten => s,1,Answer()
 same => n,AGI(amdsure)                ; sets AMDSTATUS, AMDCAUSE, AMDSURE_VERDICT
 same => n,GotoIf($["${AMDSURE_VERDICT}" = "screener"]?intro,1)
 same => n,GotoIf($["${AMDSTATUS}" = "MACHINE"]?drop,1)
 same => n,Goto(agent,1)               ; person or unsure: connect

Privacy by design

Your callers' audio never leaves your server.

The extractor sends numbers, not sound. We never receive audio, transcripts, phone numbers or names, so nothing of your callers sits on our side to leak, subpoena or reuse.

What the extractor sends, field by field
Your Asterisk serverCall audio stays hereextractorscores, timingsabout 300 bytessigned verdictAMDSure, East regionDecision enginereceivedinitial_silence_ms 1152first_speech_ms 608beep falseverdict person
Sent: timings, energy, tone flags, class scores. Never sent: audio, words, numbers, names.

Fails open

If we are slow, your calls are not.

The extractor waits for our answer only up to a hard deadline. Miss it, lose the network, or lose us entirely, and the call goes to Asterisk's own AMD() exactly as it would today. A person is never hung up on because our service had a bad minute.

Seconds after answer

Answer0 sVerdict2.55 sDeadline4.0 s
AMDSure answersBuilt-in AMD() takes over
Call 4f2a91Screener
  1. 0.0 sAnswered
  2. 0.5 sThe assistant starts speaking
  3. 2.6 sVerdict screener, reason model_screener
  4. 2.7 sYour dialplan plays a short intro with your name and reason
  5. 9.8 sThe person picks up. Agent connected.

Call screeners

Screeners get their own answer.

Google Call Screen and iPhone screening are not voicemail, and not a person yet. Treat them as either and you lose the call. AMDSure names them, so your dialplan can play a short introduction and connect the moment the person takes over.

Shadow mode

Try it beside what you run today.

Run AMDSure in the background for a week. It hears the same calls as your current AMD and changes nothing. You see both verdicts side by side on your own traffic, with the error rates in both directions. Switch when the numbers say so.

CallYour AMDAMDSureTruth
9c01e7UnsureVoicemailvoicemail
a7d3f0PersonPersonperson
31be5cUnsureScreenerscreener
e4402dVoicemailVoicemailvoicemail
b18c9aUnsureVoicemailvoicemail

Early access pricing

Priced per call. Free to start.

Free

$0

first 2,000 calls a month

Standard

$0.002

per answered call

Volume

$0.001

per call above 1 million a month

Prefer a fixed bill? A flat price per line is available. Early access prices are not final. Pricing details

See it on your own traffic.

A 20 minute call. We show the console with live numbers, then set up shadow mode on your dialer so you can judge for yourself.

Request a demo