> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stateset.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Voice SDKs

> TypeScript, Python, and the browser Web SDK for in-page voice calls.

# Voice SDKs

Three client paths, all against the same REST API and media pipeline.

## TypeScript

Generated from the OpenAPI spec, or hand-rolled against the REST API. Configure a base URL and
an auth header, and an outbound call is a handful of lines.

The SDK guide covers:

* Placing an outbound call, minimally
* Outbound calls **with idempotency and retries**
* Inbound webhook handlers for **Express** and **Next.js App Router**

<Tip>
  Send an `Idempotency-Key` on `POST /make-call`. It gives you 24-hour replay protection, so a
  retry after a network timeout will not place a second real call.
</Tip>

## Python

The same surface for Python services, including webhook signature verification.

## Web SDK (browser calls)

`POST /voice/web-calls` mints a **signed browser voice session** — a WebSocket URL plus a start
message.

```
 Browser mic + speaker  ◀──WS: start / media / stop──▶  StateSet Voice
```

Because a web call uses the same media protocol and pipeline as a phone call, it inherits the
entire platform — agents, custom tools, transfers with no-answer recovery, evals, billing — with
nothing extra to configure.

<Note>
  No phone number is involved, so a browser call needs no Twilio number provisioning. It is the
  fastest way to exercise an agent end to end while building.
</Note>

## Verifying webhooks

All three SDK paths need the same verification: HMAC-SHA256 over the **raw** request body,
compared in constant time. See [Webhooks](/stateset-voice/webhooks#verifying-signatures).

The same helper also covers **custom tool call** invocations, which are signed identically.

## Related

* [Voice API](/stateset-voice/api)
* [Webhooks](/stateset-voice/webhooks)
* [Quickstart](/stateset-voice/quickstart)
