Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .claude/rules/mdx-components.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,5 @@ Custom components (registered in `docs.yml` → `fern/components/`):

- `VoiceWidget` — interactive click-to-call demo. Human-only: wrap usages in `<llms-ignore>`.
- `Skeleton` / `SkeletonText` — loading placeholders; registered, no MDX uses yet.

Fern's Markdown export flattens an untitled callout into ordinary prose. Give a `Warning` a concise title when losing the warning context could change a reader's safe interpretation—for example, legal or compliance disclaimers, credential handling, network restrictions, or service availability. Do not add titles mechanically to every callout; the title must identify the specific hazard or constraint.
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ Only credentials issued with full user (Subscriber) identity can register. Guest

Create a Subscriber Access Token (SAT) for your project using the request snippet below. Have your space name and an API token ready, with at least one of the **Voice / Messaging / Fax / Video** scopes. Both come from the API Credentials section of the SignalWire dashboard. Open the [Create Subscriber Token](/docs/apis/rest/subscribers/tokens/create-subscriber-token) reference to send the request with your space and credentials filled in.

<Warning>
<Warning title="Protect your Project API token">
The Project API Token can issue a SAT for any user in your project. Use a development project, or rotate the API token afterward.
</Warning>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ This method takes as its parameters:

If you are using Express for your application, you also have the option of using the middleware shortcut `webhook()` which doesn't require any parameters instead of the `validateRequest` method.

<Warning>
<Warning title="Local webhook validation">
If using a service like ngrok to test locally, it is preferred to use the `validateRequest` method instead of the `webhook()` middleware.
This is because `ngrok` will rewrite the request headers and protocol, which will cause the signature to fail validation.
</Warning>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ The prompt asks the agent to call `opt_out`, and the handler is what makes the o
The number lands on your do-not-call list before the agent says a word about it, so the record
exists even if the caller hangs up on the confirmation.

<Warning>
<Warning title="Not legal advice">
This is technical guidance, not legal advice.
Requirements vary by jurisdiction and by call type, and they change often.
Consult qualified counsel before launching an outbound program.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ Run the API call below to create the trunk, making sure to replace `YOUR_VAPI_PR

Save the `id` from the response - you'll need this credential ID for the next step.

<Warning>
<Warning title="Monitor SignalWire IP ranges">
These IP addresses are current as of this guide's publication, but SignalWire IPs can change and should be programmatically monitored to avoid any impact on calls. You can gather SignalWire's latest IPs by performing a DIG or nslookup of `sip.signalwire.com`.

See our guide on [allowing SignalWire IPs through firewalls][sw-firewall-guide] for more details.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ If you would like to do inbound BYOC (i.e. send your carrier traffic to SignalWi

For detailed instructions on how to create a domain application, please follow the [SIP Domain Applications](/docs/platform/voice/sip/domain-applications) guide.

<Warning>
<Warning title="Restrict custom domain traffic">

It's VERY important to whitelist the IPs that you want to allow through - if you do not select this option, anyone who has the URL could send traffic to your custom domain app.

Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/azure.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,14 @@ Microsoft's Azure platform offers an impressive array of high-quality, multiling

## Voices

<llms-ignore>

Press play to audition any Azure voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="azure" />

</llms-ignore>

<CardGroup cols={2}>
<Card title="Voices" href="https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=tts">
Browse the complete list of Azure Neural voices in Microsoft's official documentation.
Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/cartesia.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,14 @@ Cartesia account — including custom or cloned voices — will not work.
See [Custom and cloned voices](/docs/platform/voice/tts#custom-and-cloned-voices) for details.
</Warning>

<llms-ignore>

Press play to audition any Cartesia voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="cartesia" />

</llms-ignore>

Copy the voice ID from the table below:


Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/deepgram.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,14 @@ Deepgram's Aura model provides ultra-low latency text-to-speech optimized for co

## Voices

<llms-ignore>

Press play to audition any Deepgram voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="deepgram" />

</llms-ignore>

Deepgram Aura voices are designed for natural-sounding English speech. Each voice follows the pattern `aura-<name>-en`.

Popular voices include:
Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/elevenlabs.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,14 @@ ElevenLabs voice import is available by request:
see [Custom and cloned voices](/docs/platform/voice/tts#custom-and-cloned-voices) for details.
</Warning>

<llms-ignore>

Press play to audition any ElevenLabs voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="elevenlabs" />

</llms-ignore>

You can use the **Name** and **ID** values for each voice in the below table interchangeably.

| Name | ID |
Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/fish.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,14 @@ See [Fish Audio's documentation](https://docs.fish.audio/) for more detail.

## Voices

<llms-ignore>

Press play to audition any Fish Audio voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="fish" />

</llms-ignore>

A Fish Audio voice ID is a **reference ID** — a long hexadecimal string found on the voice's page
in the Fish Audio marketplace. The default voice is Energetic Male
(`802e3bc2b27e49c2995d23ef70e6ac89`).
Expand Down
10 changes: 10 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/google.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,20 @@ the `polyglot-1` voice has variants for English (Australia), English (US), Frenc

## Voices

<llms-ignore>

Press play to audition any Google Cloud voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="gcloud" />

</llms-ignore>

<llms-only>

Browse Google's table of [supported voices](https://cloud.google.com/text-to-speech/docs/voices) and copy the **Voice name** value to use as the voice ID.

</llms-only>

## Billing

Google Cloud TTS usage on SignalWire is billed according to the following SKU codes:
Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/grok.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,14 @@ never append a `:model` suffix.

## Voices

<llms-ignore>

Press play to audition any Grok voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="grok" />

</llms-ignore>

Grok provides five voices: `ara`, `eve`, `leo`, `rex`, and `sal`.
`eve` is the default, and is also used as the fallback when an unrecognized voice is requested.

Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/groq-tts.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,14 @@ Requests fail until the terms are accepted.

## Voices

<llms-ignore>

Press play to audition any Groq voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="groq-tts" />

</llms-ignore>

Groq's Orpheus deployment provides the following voices:

| Voice | Description |
Expand Down
10 changes: 10 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ Refer to each provider's documentation for up-to-date model details and service

## Browse and audition voices

<llms-ignore>

Choose a provider to browse and audition its full voice catalog. Press play to audition a voice, and use **copy config** to
grab the engine and voice values for your SWML or SDK code. Each provider's complete voice list
lives on its reference page, linked in the table below.
Expand All @@ -48,6 +50,14 @@ for supported options.

<VoiceWidget groupBy="none" />

</llms-ignore>

<llms-only>

Browse each provider's complete voice list on its reference page, linked in the table below.

</llms-only>

## Compare providers and models

SignalWire's TTS providers offer a wide range of voice engines optimized for various applications.
Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/inworld.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,14 @@ defaults to `inworld-tts-1.5-max`. Set a model explicitly to override this.

## Voices

<llms-ignore>

Press play to audition any Inworld voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="inworld" />

</llms-ignore>

Inworld provides a large library of expressive voices across many languages.
A voice's name is its voice ID — for example, `Lauren` becomes `inworld.Lauren` in the
[voice string](#usage).
Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/minimax.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,14 @@ SignalWire supports the following MiniMax models. Pick a `turbo` model for speed

## Voices

<llms-ignore>

Press play to audition any MiniMax voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="minimax" />

</llms-ignore>

MiniMax provides a large library of system voices across many languages.
A voice's **Voice ID** is what you put in the [voice string](#usage): for example,
`English_CalmWoman` becomes `minimax.English_CalmWoman`.
Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/mistral.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,14 @@ for current models.

## Voices

<llms-ignore>

Press play to audition any Mistral voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="mistral" />

</llms-ignore>

Voice IDs are passed through to Mistral's hosted voice library — a voice named `myvoice`
becomes `mistral.myvoice` in the [voice string](#usage).
Find the available voices in
Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/openai.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,14 @@ OpenAI offers two TTS models with different quality and latency characteristics:

## Voices

<llms-ignore>

Press play to audition any OpenAI voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="openai" />

</llms-ignore>

OpenAI provides 6 fully multilingual voices optimized for natural-sounding speech:

| Voice | Description |
Expand Down
10 changes: 10 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/polly.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,20 @@ SignalWire supports the following three Amazon models.

## Voices

<llms-ignore>

Press play to audition any Amazon Polly voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="polly" />

</llms-ignore>

<llms-only>

Browse Amazon's list of [available voices](https://docs.aws.amazon.com/polly/latest/dg/available-voices.html) and build the voice ID string as shown in the model cards above.

</llms-only>

## Languages

Consult AWS documentation for a comprehensive and up-to-date list of supported voices,
Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/rime.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,14 @@ Rime offers uniquely realistic voices with a focus on natural expressiveness.

## Voices

<llms-ignore>

Press play to audition any Rime voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="rime" />

</llms-ignore>

Mist v2 is the default Rime model on the SignalWire platform.
To use this model, simply set the voice ID.

Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/smallest.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,14 @@ SignalWire supports the following Waves Lightning models.

## Voices

<llms-ignore>

Press play to audition any Smallest.ai voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="smallest" />

</llms-ignore>

Smallest.ai provides roughly 250 voices in the Waves catalog. A voice's name is its voice ID —
for example, `sophia` (the default, an American English female voice) becomes `smallest.sophia`
in the [voice string](#usage).
Expand Down
4 changes: 4 additions & 0 deletions fern/products/platform/pages/calling/voice/TTS/speechify.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,14 @@ pairing fails. Test your combination before deploying.

## Voices

<llms-ignore>

Press play to audition any Speechify voice, then **copy config** to grab the value for SWML or your SDK.

<VoiceWidget provider="speechify" />

</llms-ignore>

Speechify voice IDs come from its voice list API (for example, `alicia` or `alton`) —
use the voice's **ID**, not its display name. The default voice is `alicia`,
an American English female voice.
Expand Down
2 changes: 1 addition & 1 deletion fern/products/platform/pages/platform/compliance/hipaa.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ max-toc-depth: 3

The Health Insurance Portability and Accountability Act (HIPAA) establishes requirements for protecting Protected Health Information (PHI). As a telecommunications technology company, SignalWire is built to support HIPAA-compliant applications: SignalWire APIs and WebRTC communications services are all encrypted by default via HTTPS, TLS, and/or SRTP/DTLS. When building applications — especially voice AI agents defined with [SWML](/docs/swml) or the [Server SDK](/docs/server-sdks) — that handle healthcare data, you must implement appropriate safeguards to protect PHI throughout the call lifecycle.

<Warning>
<Warning title="Not legal advice">
This guide provides technical guidance for implementing security controls relevant to HIPAA compliance. It is not legal advice. Healthcare organizations must consult with qualified healthcare compliance experts and legal counsel to ensure their specific implementation meets all applicable HIPAA requirements. Compliance is a shared responsibility between SignalWire, your organization, and your implementation choices.
</Warning>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ position: 0

SignalWire is built to support compliant communications and voice AI applications. These guides cover the technical controls — encryption, consent, disclosure, access, and audit logging — for meeting specific regulatory obligations when your application handles calls, messages, and sensitive data.

<Warning>
<Warning title="Not legal advice">
These guides provide technical guidance for implementing compliance controls. They are not legal advice. Requirements vary by jurisdiction, by use case, and by data type, and they change frequently. Always consult qualified counsel before operationalizing any program. Compliance is a shared responsibility between SignalWire, your organization, and your implementation choices.
</Warning>

Expand Down
2 changes: 1 addition & 1 deletion fern/products/platform/pages/platform/compliance/tcpa.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Each must be checked and recorded the same way on every call.
A prompt can only *ask* the model to behave; a state machine *guarantees* the behavior and leaves a record.
Treat the law's requirements as code your agent runs inside of, not as instructions you hope it follows.

<Warning>
<Warning title="Not legal advice">
This guide provides technical guidance for implementing controls relevant to TCPA compliance.
It is not legal advice.
TCPA obligations vary by jurisdiction, by call type, and by the consent standard that applies to each number, and they change frequently.
Expand Down
6 changes: 5 additions & 1 deletion scripts/check-llm-exports.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,11 @@ async function main() {
}

const baseUrl = normalizeDocsBase(rawBaseUrl);
const testCases = JSON.parse(await readFile(manifestPath, 'utf8'));
const manifest = JSON.parse(await readFile(manifestPath, 'utf8'));
const testCases = manifest.flatMap((testCase) => {
const paths = testCase.paths ?? [testCase.path];
return paths.map((path) => ({ ...testCase, path, paths: undefined }));
});
const failures = [];

await Promise.all(testCases.map(async (testCase) => {
Expand Down
Loading
Loading