Text-to-speech
POST /api/ttsConvert text to speech with ElevenLabs Eleven v4 Turbo: returns audio (the base64-encoded file in the format asked for: mp3, opus, aac, flac, wav or pcm) with model, voice, format and chars (the characters spoken). Send POST /api/tts with the required field text and pay $0.120 per call over x402 or MPP (there is no free tier). It returns a JSON object with model, provider, voice, format, audio and 1 more.
The ten OpenAI voice names each map to their own ElevenLabs voice, or name one of 21 ElevenLabs voices directly; the answer names the voice that spoke. 90+ languages on ElevenLabs. If ElevenLabs is busy, throttling or down, a backup speech model with fewer voices and languages serves the call and the answer's model field names it. No API key needed; pay per call over x402 or MPP. Text capped at 2000 chars. Model-backed. For high-volume speech where timbre matters less, /api/tts-lite is the same interface on Kokoro-82M at $0.005.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
text | string | yes | Text to convert to speech (max 2000 chars) Also accepted as content, str, string, input, body, data. |
voice | string | no | Voice: alloy, ash, ballad, coral, echo, fable, nova, onyx, sage, shimmer (default: alloy), each mapped to its own ElevenLabs voice, or an ElevenLabs voice by name (george, sarah, adam, alice, bella, bill, brian, callum, charlie, chris, daniel, eric, harry, jessica, laura, liam, lily, matilda, river, roger, will) |
format | string | no | Audio format: mp3, opus, aac, flac, wav, pcm (default: mp3) |
Example request
curl -i -X POST https://agent402.tools/api/tts \
-H "Content-Type: application/json" \
-d '{"text":"Hello from Agent402!","voice":"alloy","format":"mp3"}'
Without payment this returns HTTP 402 Payment Required with the exact price for tts; any x402 v2 or MPP client pays it and retries.
Example response
{
"model": "elevenlabs/eleven-v4-turbo",
"provider": "openrouter",
"voice": "river",
"format": "mp3",
"audio": "<base64-encoded audio>",
"chars": 20
}
| Field | Type | Always present | In the example |
|---|---|---|---|
model | string | yes | elevenlabs/eleven-v4-turbo |
provider | string | yes | openrouter |
voice | string | yes | river |
format | string | yes | mp3 |
audio | string | yes | <base64-encoded audio> |
chars | number | yes | 20 |
From an MCP client
catalog.call {
"slug": "tts",
"params": {
"text": "Hello from Agent402!",
"voice": "alloy",
"format": "mp3"
}
}
The hosted connector at https://agent402.tools/mcp needs a payment for tts; the stdio package pays it from a wallet or from AGENT402_CREDITS_KEY. Local install: npx -y agent402-mcp.
Errors and behavior
textis required. An input the tool rejects returns an HTTP 4xx whose body carrieserror,tool,expected,requiredandexample, so the caller can correct it.- A paid call that ends in any status of 400 or above is not charged over x402, MPP or a prepaid credits key: settlement is cancelled when the tool fails. The exception is a Tempo push credential, a transfer the buyer sent before the call: it settles before the tool runs, so if the tool then fails the payment is recorded as a refund owed to the paying wallet.
- Wallet-only: this tool runs a model, so it has no proof-of-work tier. A prepaid card-credits key issued earlier (
Authorization: Bearer a402_...) also pays it. - Model-backed: the answer is generated by a model, so the same input can produce different wording.
- A
GETorHEADto /api/tts returns the same 402 quote, so the price can be read without a body. - An
Idempotency-Keyheader makes a retried paid call replay the first 200 instead of charging again (an answer larger than 1 MB is not replayed).
Paid call (JavaScript agent)
import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
const client = new x402Client();
client.setSpendControls?.(false); // keep your own spending ceiling in code
registerExactEvmScheme(client, { signer: privateKeyToAccount(KEY) });
const payFetch = wrapFetchWithPayment(fetch, client);
const res = await payFetch("https://agent402.tools/api/tts", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"text": "Hello from Agent402!",
"voice": "alloy",
"format": "mp3"
}),
});
Related tools
Text-to-speech (HD)
POST /api/tts-hdConvert text to speech with ElevenLabs Eleven v4, its most expressive model (inline audio tags such as [whispering] are …
Text-to-speech (lite)
POST /api/tts-liteConvert text to speech with Kokoro-82M, a fraction of the price of /api/tts. Returns base64-encoded mp3 or pcm. The same…
Text-to-speech (OpenAI-compatible)
POST /v1/audio/speechOpenAI-compatible text-to-speech over x402 - point any OpenAI SDK's audio.speech.create() at base_url https://agent402.t…
Speech-to-text
POST /api/transcribeTranscribe audio to text using OpenAI (gpt-transcribe). Provide a URL to an audio file (mp3, wav, m4a, etc.) and get bac…
Speech-to-text (Pro)
POST /api/transcribe-proTranscribe audio to text using OpenAI (gpt-transcribe) - the same model as /api/transcribe with a longer cap. Provide a …
Speech-to-text (OpenAI transcription wire)
POST /v1/audio/transcriptionsOpenAI's own transcription wire: POST multipart/form-data with a `file` part and get the transcript back. Point any Whis…