Documentation

VM Hunter documentation

Real-time answering machine detection for outbound dialers. Stream the first seconds of a call over a WebSocket and get HUMAN or MACHINE back in about two seconds.

Integrations

Pick the guide for your dialer. Each one ships a ready-made client, so you install a file, set your API key and add a dialplan entry.

How it works

VM Hunter never touches your SIP trunk. Your dialer keeps the call and forks the callee's audio to us the moment the call is answered.

StepWhat happens
1. AnswerThe dialer answers the outbound call and runs the VM Hunter client on the callee leg.
2. ConnectThe client opens a WebSocket to ws://app.vmhunter.com:2701 and sends a config frame with your API key.
3. StreamThe first seconds of far-end audio are streamed as raw 8 kHz PCM while the callee is greeting.
4. ClassifyThe SpeechLLM engine transcribes and analyses the greeting, tones and signal, and replies AMDSTATUS + AMDCAUSE.
5. RouteYour dialplan connects HUMAN calls to an agent and drops or dispositions MACHINE calls.

The engine listens to the first 2 seconds of audio. If the callee is still mid-sentence at that point and nothing decisive has been heard yet, it keeps listening for up to 3 seconds and stops as soon as the speaker pauses or a decisive phrase arrives.

Before you start

RequirementNotes
API keyCreate one in Dashboard → API Keys. The free plan includes 5,000 calls a month.
Outbound networkYour dialer must reach app.vmhunter.com on TCP port 2701. No inbound ports are needed.
Audio8 kHz, 16-bit signed little-endian, mono. The bundled clients produce this for you.
Python 3For the Asterisk and Twilio clients. FreeSWITCH uses its built-in Lua.

Every analysed call counts

A call is billed once its config frame is accepted, including calls that turn out to be silent. Calls that come back AMDSTATUS=FAILED are not charged.

What you get back

One JSON text frame, then the server closes the socket:

Response
{"AMDSTATUS": "MACHINE", "AMDCAUSE": "MACHINE_BEEP"}
AMDSTATUSRoute it
HUMANA live person answered. Connect to an agent.
MACHINEVoicemail, IVR, beep, static or a disconnected number. Drop or disposition; AMDCAUSE says which.
CALLGUARDCall screening (iPhone, Google Call Screen). A person is listening. Screened calls always carry AMDCAUSE=CALLGUARD_PHRASE:…, so branch on that; the bundled dialplans do.
FAILEDDetection could not run. The clients apply a fail-safe, MACHINE by default.

The full list of AMDCAUSE values, the config frame and timing details are in the WebSocket API reference.