***

title: on
slug: /reference/typescript/relay/call/on
description: Register an event listener on a call.
max-toc-depth: 3
---------------------

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

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

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

Register a listener for events on this call. The handler is called each time
an event of the specified type is received. Handlers can be regular functions
or async functions.

## **Parameters**

<ParamField path="eventType" type="string" required={true} toc={true}>
  The event type string to listen for (e.g., `"calling.call.state"`,
  `"calling.call.play"`). See the [Events section][events-section]
  on the Call page for class-level events, or individual method pages for
  method-specific events.
</ParamField>

<ParamField path="handler" type="(event: RelayEvent) => void | Promise<void>" required={true} toc={true}>
  Function to invoke when the event fires. Receives a
  [`RelayEvent`][relayevent] instance.
</ParamField>

## **Returns**

`void`

## **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();

  // Register a listener for play events
  call.on('calling.call.play', (event) => console.log(`Play state: ${event.params.state}`));

  // Register a listener for state changes
  const onStateChange = (event) => {
    console.log(`Call state changed: ${event.params.call_state}`);
  };
  call.on('calling.call.state', onStateChange);

  const action = await call.play([{ type: 'tts', text: 'Hello!' }]);
  await action.wait();
});

await client.run();
```