***

title: detect
slug: /reference/typescript/relay/call/detect
description: Detect answering machines, fax tones, or digits on a call.
max-toc-depth: 3
---------------------

For a complete index of all SignalWire documentation pages, fetch https://signalwire.com/docs/llms.txt

[detectaction]: /docs/server-sdks/reference/typescript/relay/actions

[calling-call-detect]: /docs/server-sdks/reference/typescript/relay/call#events

[call-events]: /docs/server-sdks/reference/typescript/relay/call#events

Start audio detection on the call. Detects answering machines, fax tones, or
DTMF digits. Returns a [`DetectAction`][detectaction]
that resolves on the first detection result or when the operation finishes.

<Note>
  The `DetectAction` resolves on the **first detection result**, not when the
  detect operation finishes. This means `await action.wait()` returns as soon as
  a result is available.
</Note>

<Info>
  This method emits [`calling.call.detect`][calling-call-detect] events. See [Call Events][call-events] for payload details.
</Info>

## **Parameters**

<ParamField path="detect" type="Record<string, unknown>" required={true} toc={true}>
  Detection configuration object.
</ParamField>

<Indent>
  <ParamField path="detect.type" type="string" required={true} toc={true}>
    Detection type. Valid values:

    * `"machine"` -- answering machine detection (AMD)
    * `"fax"` -- fax tone detection (CNG/CED)
    * `"digit"` -- DTMF digit detection
  </ParamField>

  <ParamField path="detect.params" type="Record<string, unknown>" toc={true}>
    Type-specific detection parameters.
  </ParamField>
</Indent>

<ParamField path="timeout" type="number | undefined" toc={true}>
  Maximum seconds to run the detector before stopping.
</ParamField>

<ParamField path="controlId" type="string | undefined" toc={true}>
  Custom control ID. Auto-generated if not provided.
</ParamField>

<ParamField path="onCompleted" type="(event: RelayEvent) => void | Promise<void>" toc={true}>
  Callback invoked when detection completes.
</ParamField>

## **Returns**

`Promise<`[`DetectAction`][detectaction]`>` -- An action handle with
`stop()` and `wait()` methods.

## **Example**

```typescript {13}
import { RelayClient } from '@signalwire/sdk';

const client = new RelayClient({
  project: process.env.SIGNALWIRE_PROJECT_ID!,
  token: process.env.SIGNALWIRE_TOKEN!,
  contexts: ['default']
});

client.onCall(async (call) => {
  await call.answer();

  // Answering machine detection
  const action = await call.detect(
    { type: 'machine', params: {} },
    { timeout: 30 }
  );
  const event = await action.wait();

  const detectResult = event.params.detect as Record<string, unknown> ?? {};
  if (detectResult.type === 'machine') {
    console.log('Answering machine detected');
    await call.hangup();
  } else {
    console.log('Human answered');
    const playAction = await call.play([{ type: 'tts', text: 'Hello! This is a call from...' }]);
    await playAction.wait();
  }
});

await client.run();
```