***

title: setOnRequestCallback
slug: /reference/typescript/agents/swml-service/set-on-request-callback
description: Set a per-request callback for dynamic SWML generation.
max-toc-depth: 3
---------------------

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

[swmlbuilder]: /docs/server-sdks/reference/typescript/agents/swml-builder

Set a callback invoked per-request to dynamically build SWML. When set, the
static SwmlBuilder is ignored and the callback's returned
[`SwmlBuilder`][swmlbuilder] is used instead.

## **Parameters**

<ParamField path="cb" type="OnRequestCallback" required={true} toc={true}>
  Callback function that receives `(queryParams, bodyParams, headers)` and
  returns a `SwmlBuilder` or `Promise<SwmlBuilder>`.
</ParamField>

<Note>
  On GET requests, `bodyParams` is always an empty object (`{}`). The body is only
  parsed on POST requests.
</Note>

## **Returns**

`this` -- Returns the service for method chaining.

## **Example**

```typescript {5}
import { SWMLService, SwmlBuilder } from '@signalwire/sdk';

const service = new SWMLService({ name: 'dynamic-ivr' });

service.setOnRequestCallback(async (queryParams, bodyParams, headers) => {
  const builder = new SwmlBuilder();
  builder.addVerb('answer', {});

  if (queryParams.lang === 'es') {
    builder.addVerb('play', { url: 'https://example.com/greeting-es.mp3' });
  } else {
    builder.addVerb('play', { url: 'https://example.com/greeting-en.mp3' });
  }

  builder.addVerb('hangup', {});
  return builder;
});

await service.run();
```