> Fetch clean Markdown by appending `.md` to any page URL under https://signalwire.com/docs or requesting it with the HTTP header `Accept: text/markdown`. The root index at https://signalwire.com/docs/llms.txt lists the available documentation indexes. # setOnRequestCallback > Set a per-request callback for dynamic SWML generation. [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** **`cb`** `OnRequestCallback` — required Callback function that receives `(queryParams, bodyParams, headers)` and returns a `SwmlBuilder` or `Promise`. --- > **Note** > > On GET requests, `bodyParams` is always an empty object (`{}`). The body is only > parsed on POST requests. ## **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(); ``` > Set a per-request callback for dynamic SWML generation.