***

title: SWMLService
slug: /reference/typescript/agents/swml-service
description: Lightweight HTTP service for non-AI SWML documents.
max-toc-depth: 3
---------------------

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

[agentbase]: /docs/server-sdks/reference/typescript/agents/agent-base

[swml]: /docs/swml/reference/ai

[swml-reference]: /docs/swml/reference/ai

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

[addverb]: /docs/server-sdks/reference/typescript/agents/swml-service/add-verb

[getapp]: /docs/server-sdks/reference/typescript/agents/swml-service/get-app

[renderswml]: /docs/server-sdks/reference/typescript/agents/swml-service/render-swml

[run]: /docs/server-sdks/reference/typescript/agents/swml-service/run

[setonrequestcallback]: /docs/server-sdks/reference/typescript/agents/swml-service/set-on-request-callback

SWMLService is a lightweight HTTP service for serving non-AI SWML documents.
Unlike [`AgentBase`][agentbase] (which always produces an AI block), SWMLService
generates pure SWML call-flow documents: IVR menus, voicemail, call recording, etc.

It uses a [`SwmlBuilder`][swmlbuilder] internally for verb construction and
[Hono](https://hono.dev) for HTTP serving.

<Info>
  SWMLService generates and serves [SWML][swml] documents over HTTP.
  See the [SWML reference][swml-reference] for the full document specification.
</Info>

## **Constructor**

<ParamField path="opts" type="SWMLServiceOptions" toc={true}>
  Optional configuration object.
</ParamField>

<Indent>
  <ParamField path="opts.name" type="string" default="swml-service" toc={true}>
    Service display name used in logging and startup messages.
  </ParamField>

  <ParamField path="opts.route" type="string" default="/" toc={true}>
    HTTP route path where the service is accessible.
  </ParamField>

  <ParamField path="opts.basicAuth" type="[string, string]" toc={true}>
    Basic auth credentials as `[username, password]`. Unlike `AgentBase`,
    `SWMLService` does not fall back to environment variables — credentials
    must be provided explicitly.
  </ParamField>
</Indent>

## **Properties**

<ParamField path="name" type="string" toc={true}>
  Service display name.
</ParamField>

<ParamField path="route" type="string" toc={true}>
  HTTP route path where this service is accessible.
</ParamField>

## **Methods**

<CardGroup cols={3}>
  <Card title="addVerb" href="/docs/server-sdks/reference/typescript/agents/swml-service/add-verb">
    Add a SWML verb to the document.
  </Card>

  <Card title="renderSwml" href="/docs/server-sdks/reference/typescript/agents/swml-service/render-swml">
    Render the SWML document as an object.
  </Card>

  <Card title="setOnRequestCallback" href="/docs/server-sdks/reference/typescript/agents/swml-service/set-on-request-callback">
    Set a per-request callback for dynamic SWML generation.
  </Card>

  <Card title="getApp" href="/docs/server-sdks/reference/typescript/agents/swml-service/get-app">
    Get the Hono app for mounting or testing.
  </Card>

  <Card title="getBuilder" href="/docs/server-sdks/reference/typescript/agents/swml-service/get-builder">
    Get the underlying SwmlBuilder instance.
  </Card>

  <Card title="run" href="/docs/server-sdks/reference/typescript/agents/swml-service/run">
    Start the HTTP server.
  </Card>
</CardGroup>

## **Example**

```typescript {3}
import { SWMLService } from '@signalwire/sdk';

const service = new SWMLService({ name: 'my-ivr', route: '/' });
service.addVerb('answer', {});
service.addVerb('play', { url: 'https://example.com/greeting.mp3' });
service.addVerb('hangup', {});

await service.run();
```