***
id: c6cc83d7-f766-41bc-8ab2-75aed8c59197
title: detect\_machine
slug: /reference/detect-machine
description: >-
Detect whether the other end of the call is a machine (fax, voicemail, etc.)
or a human, using AMD and fax detection.
max-toc-depth: 3
----------------
[variables]: #variables
[statuscallbacks]: #statuscallbacks
A detection method that combines AMD (Answering Machine Detection) and fax detection.
Detect whether the user on the other end of the call is a `machine` (fax, voicemail, etc.) or a `human`.
The detection result(s) will be sent to the specified `status_url` as a POST request and will also be saved in the
`detect_result` [variable][variables].
## **Properties**
An object that accepts the following properties.
If `true`, stops detection on beep / end of voicemail greeting.
Comma-separated string of detectors to enable. **Valid Values:** `amd`, `fax`
How long to wait for voice activity to finish (in seconds).
How long to wait for initial voice activity before giving up (in seconds).
How long to wait for voice activity to finish before firing the READY event (in seconds).
The number of seconds of ongoing voice activity required to classify as MACHINE.
The minimum number of words that must be detected in a single utterance before classifying the call as MACHINE.
The HTTP(S) URL to deliver detector events to. Learn more about [status callbacks][statuscallbacks].
The maximum time to run the detector (in seconds).
The tone to detect. Only the remote side tone will be received. (`CED` or `CNG`) Used for fax detection.
If `false`, the detector will run asynchronously and `status_url` must be set. If `true`, the detector will wait for detection to complete before moving to the next SWML instruction.
## **Variables**
The following variables are available after the `detect_machine` method is executed and detection is complete.
You can reference these variables in your SMWL script utilizing the `${variable}` syntax.
The result of detection.
Whether a beep was detected. `true` if detected.
The number of milliseconds the detection took.
## **StatusCallbacks**
A POST request will be sent to `status_url` with a JSON payload like the following:
The type of event, always `calling.call.detect` for this method.
The channel for the event, includes the SWML session ID.
Unix timestamp (float) when the event was generated.
The project ID associated with the call.
The Space ID associated with the call.
An object containing detection-specific parameters.
The control ID for this detect operation.
Detection result details (see subfields below).
The type of detection. **Valid values:** `machine` or `fax`.
The detection result. **Valid values:** `HUMAN`, `MACHINE`, `READY`, `NOT_READY`, `UNKNOWN`, `finished`.
Present and set to `true` when a beep was detected. Absent when no beep has been detected.
The call ID.
The node handling the call.
The segment ID for this part of the call.
### Raw JSON example
```json
{
"event_type": "calling.call.detect",
"event_channel": "swml:be38xxxx-8xxx-4xxxx-9fxx-bxxxxxxxxx",
"timestamp": 1745332535.668522,
"project_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"space_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"params": {
"control_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"detect": {
"type": "machine",
"params": {
"event": "MACHINE",
"beep": true
}
},
"call_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"node_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"segment_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
```
***
## **Examples**
### Play the detection result
```yaml
version: 1.0.0
sections:
main:
- detect_machine:
status_url: 'https://example.com/detect-events'
timeout: 20
- play:
url: 'say:Detection result: ${detect_result}'
```
```json
{
"version": "1.0.0",
"sections": {
"main": [
{
"detect_machine": {
"status_url": "https://example.com/detect-events",
"timeout": 20
}
},
{
"play": {
"url": "say:Detection result: ${detect_result}"
}
}
]
}
}
```
### Conditional actions based on the detection result
```yaml
version: 1.0.0
sections:
main:
- play:
url: "say: Welcome to the machine detection test."
- detect_machine:
status_url: "https://webhook.site/5c8abf82-b8c7-41c8-b5d6-b32a40068109"
detectors: "amd,fax"
wait: true
- cond:
- when: detect_result == 'machine'
then:
- play:
url: "say: You are a machine, goodbye."
- hangup: {}
- when: detect_result == 'human'
then:
- play:
url: "say: You are a human, hello."
- hangup: {}
- when: detect_result == 'fax'
then:
- play:
url: "say: You are a fax, goodbye."
- hangup: {}
- else:
- play:
url: "say: Unable to determine if you are a human, machine, or fax, goodbye. Result was ${detect_result}"
- hangup: {}
```
```json
{
"version": "1.0.0",
"sections": {
"main": [
{
"play": {
"url": "say: Welcome to the machine detection test."
}
},
{
"detect_machine": {
"status_url": "https://webhook.site/5c8abf82-b8c7-41c8-b5d6-b32a40068109",
"detectors": "amd,fax",
"wait": true
}
},
{
"cond": [
{
"when": "detect_result == 'machine'",
"then": [
{"play": {"url": "say: You are a machine, goodbye."}},
{"hangup": {}}
]
},
{
"when": "detect_result == 'human'",
"then": [
{"play": {"url": "say: You are a human, hello."}},
{"hangup": {}}
]
},
{
"when": "detect_result == 'fax'",
"then": [
{"play": {"url": "say: You are a fax, goodbye."}},
{"hangup": {}}
]
},
{
"else": [
{"play": {"url": "say: Unable to determine if you are a human, machine, or fax, goodbye. Result was ${detect_result}"}},
{"hangup": {}}
]
}
]
}
]
}
}
```