---
title: Answering Machine Detection (AMD)
slug: voice-apis/answering-machine-detection-amd
docTags: 
createdAt: 2026-06-15T09:31:52.042Z
---

**Status:** Beta. Please reach out to your Exotel account manager to have AMD enabled on your account.

### Overview

Answering Machine Detection (AMD) tells you whether an outbound call was answered by a **human** or by a **machine** (such as voicemail or an IVR). This lets you take different actions depending on who picked up — for example, playing a message only when a human answers, or skipping voicemail drops.

AMD results are delivered through Exotel's call callbacks (APIs). They are **not** shown in reports or the dashboard.

### How AMD works

When AMD is enabled, Exotel analyzes the audio at the start of the call — the greeting and the silences around it — to classify who answered. The classification is returned through two new parameters inside the Legs object of your callback payload:

| **Parameter** | **Description**                                                                                                                        |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| AnsweredBy    | The AMD result. Use this for your final classification.                                                                                |
| AmdCause      | The reason behind the result, including the values used for detection. Use this for debugging or understanding why a result was given. |

Possible AnsweredBy values

- HUMAN — the call was answered by a person
- MACHINE — the call was answered by a machine (voicemail, IVR, etc.)
- NOTSURE — detection could not reach a definitive result
- NA — AMD was not applicable for this leg

### Key behaviors

**1. AMD applies only to Leg 2 (the To leg).** Detection runs only on the number being dialled (Leg 2 / the To leg). Leg 1 (the From leg) will always return AnsweredBy: NA. When reading the payload, use the AnsweredBy value on Leg 2 for the human-vs-machine result.

**2. AMD detection is asynchronous.** Detection does not block or delay call connection or routing — the call proceeds normally while analysis happens in the background. Because detection listens to the greeting and surrounding silence, the result takes roughly **3–5 seconds** to finalize and is delivered once complete. Consume the result from the callback payload when it arrives, rather than expecting it the instant the call is answered.

### Where you receive the result

**A. StatusCallback terminal event**

To receive the AMD status via StatusCallback, you must **subscribe to terminal events**. Once subscribed, the AMD result is included in the terminal StatusCallback payload, inside the Legs object.

**Sample terminal StatusCallback payload:**

:::BlockQuote
\{
&#x20; "CallSid": "f3dec10279a310e2831754a4ec841a5f",
&#x20; "ConversationDuration": "13",
&#x20; "DateCreated": "2026-05-15 16:46:13",
&#x20; "DateUpdated": "2026-05-15 16:46:50",
&#x20; "DetailedStatus": "NA",
&#x20; "DetailedStatusSubBucket": "NA",
&#x20; "Direction": "outbound-api",
&#x20; "DisconnectedBy": "Callee",
&#x20; "EndTime": "2026-05-15 16:46:50",
&#x20; "EventTime": "2026-05-15 16:46:50",
&#x20; "EventType": "terminal",
&#x20; "From": "08203612779",
&#x20; "Legs": \[
&#x20;   \{
&#x20;     "OnCallDuration": "26",
&#x20;     "RingingDuration": "5",
&#x20;     "Status": "completed",
&#x20;     "AnsweredBy": "NA",
&#x20;     "AmdCause": ""
&#x20;   },
&#x20;   \{
&#x20;     "OnCallDuration": "13",
&#x20;     "RingingDuration": "4",
&#x20;     "Status": "completed",
&#x20;     "AnsweredBy": "HUMAN",
&#x20;     "AmdCause": "HUMAN-080-880"
&#x20;   }
&#x20; ],
&#x20; "PhoneNumberSid": "8224778996",
&#x20; "RecordingUrl": "https\://recordings.us3.qaexotel.com/exotelrecordings/ree5e1us3/f3dec10279a310...",
&#x20; "StartTime": "2026-05-15 16:46:13",
&#x20; "Status": "completed",
&#x20; "To": "08969916092"
}
:::

In this example:

- Legs\[0].AnsweredBy: NA → AMD was not applicable for the From leg (Leg 1).
- Legs\[1].AnsweredBy: HUMAN → the To number (Leg 2) was answered by a human.

**B. Passthru payload**

When AMD is enabled, the Passthru payload also includes AnsweredBy and AmdCause inside the Legs object.

**Sample Passthru payload:**

:::BlockQuote
\{
&#x20; "CallSid": "afc75285632df2acd33b7ea1fecb1a4h",
&#x20; "CallFrom": "06203612779",
&#x20; "CallTo": "02247789996",
&#x20; "Direction": "outbound-dial",
&#x20; "DialCallDuration": 27,
&#x20; "DialCallStatus": "completed",
&#x20; "StartTime": "2026-04-17 19:02:06",
&#x20; "CurrentTime": "2026-04-17 19:02:38",
&#x20; "Legs": \[
&#x20;   \{
&#x20;     "Number": "06355212721",
&#x20;     "Type": "single",
&#x20;     "OnCallDuration": 18,
&#x20;     "CauseCode": "NORMAL\_CLEARING",
&#x20;     "AnsweredBy": "HUMAN",
&#x20;     "AmdCause": "HUMAN-800-800"
&#x20;   }
&#x20; ]
}
:::

In this example:

- AnsweredBy: HUMAN → the call was detected as answered by a human.
- AmdCause: HUMAN-800-800 → a short greeting was detected, followed by silence — typical human behavior, where the person says "Hello?" and waits for a response.

### AMD Cause reference

Use AnsweredBy for your final classification, and AmdCause to understand why that classification was made. Values shown in \{curly braces} are the actual measured/threshold figures used during detection.

| **AnsweredBy** | **AmdCause**                                               | **What it means**                                                                                     |
| -------------- | ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| MACHINE        | INITIALSILENCE-&#x7B;detected}-&#x7B;threshold}            | Long silence before any voice started. Machines often have a delay or beep before the greeting plays. |
| MACHINE        | MAXWORDS-&#x7B;wordsDetected}-&#x7B;maxAllowed}            | Too many words were spoken in the greeting. Machines usually have longer greetings.                   |
| MACHINE        | LONGGREETING-&#x7B;voiceDuration}-&#x7B;greetingLimit}     | The total voice duration of the greeting was too long.                                                |
| MACHINE        | MAXWORDLENGTH-&#x7B;consecutiveVoiceDuration}              | A single continuous stretch of voice without a pause was too long.                                    |
| HUMAN          | HUMAN-&#x7B;silenceDuration}-&#x7B;afterGreetingThreshold} | A short greeting was spoken, followed by silence.                                                     |
| NOTSURE        | TOOLONG-&#x7B;totalTime}                                   | The analysis window ended before a definitive result could be detected.                               |
| NOTSURE        | NOAUDIODATA-&#x7B;totalTime}                               | No audio frames were received during the analysis window.                                             |
|                |                                                            |                                                                                                       |

### Accuracy

Exotel detects voicemail using heuristic algorithms based on maximum words spoken, silence, and greeting length. Detection typically takes **3–5 seconds**, with an accuracy of **60–75%**, which is on par with industry standards.

There is no consistent signaling difference between a call picked up by a human and one picked up by a machine, so detection relies on audio cues such as tone of voice and speed of words spoken.

### FAQ

**Q: A call went to voicemail. Will its status change to "no-answer," or stay in the success bucket?**

It stays in the success bucket. The call was successfully connected and answered (by a machine), and these are billable seconds, so the call is not moved to a non-successful state. Use the AnsweredBy parameter separately to determine whether the answer was a human or a machine.

**Q: Will the AMD result appear in my reports or dashboard?**

No. AMD results are available only through the API callbacks (StatusCallback terminal event and Passthru payload), not in reports or the dashboard.

**Q: Which leg does AMD apply to?**

Only Leg 2 (the To leg). Leg 1 (the From leg) always returns AnsweredBy: NA.

**Q: Is AMD real-time? Will it delay my call?**

No delay. AMD is asynchronous — the call connects and proceeds normally while detection runs in the background. The result is delivered through the callback once detection completes (roughly 3–5 seconds).
