Overview
https://api.unlimitedtts.com is a paid text-to-speech gateway built for AI agents and automated systems. No signup required — fund a prepaid credit account via Stripe Checkout and receive a bearer token (x-credit-account) for all subsequent requests.
Under the hood it uses neural text-to-speech synthesis with per-character pricing. The minimum top-up is $5 USD, which covers your first voice generation and leaves a prepaid balance for future requests.
Quick Start
- Read the docs:
GET https://api.unlimitedtts.com/docs— full machine-readable API reference. - List voices:
GET https://api.unlimitedtts.com/tts/voices— supported voices and pricing metadata. - Try synthesis:
POST https://api.unlimitedtts.com/ttswith atext/plainorapplication/jsonbody. - Handle 402: If no
x-credit-accountheader is supplied, the API returns402 Payment Requiredwith atopUpUrl. - Fund via Stripe: Open the
topUpUrlin a browser, complete Stripe Checkout, and save the returnedx-credit-accountbearer token. - Synthesize: Send the
x-credit-accountheader on all future requests; balance is debited per character. - Check balance:
GET https://api.unlimitedtts.com/credits/:accountId
Endpoints
| Method | Path | Purpose |
|---|---|---|
| GET | /docs | Machine-readable API reference (read this first) |
| GET | /tts/voices | List supported voices and pricing |
| POST | /tts | Synthesize speech (sync 200 audio/mpeg, or async 202 + jobId) |
| GET | /tts | Fallback synthesis via query string for POST-blocked environments |
| GET | /tts/jobs/:jobId | Poll async job status |
| GET | /tts/jobs/:jobId/audio?sig=... | Download completed async audio |
| GET | /top-up | Browser-friendly top-up launcher page |
| POST | /top-up | Create Stripe Checkout Session |
| GET | /top-up/complete?session_id=... | Stripe return URL; credits account once |
| GET | /top-up/status?account=... | Poll funding status after Checkout |
| GET | /credits/:accountId | Check prepaid balance |
Examples
POST /tts (JSON)
POST https://api.unlimitedtts.com/tts
Content-Type: application/json
x-credit-account: <your-account-uuid>
{
"text": "Hello world",
"voice": "openai_nova",
"speed": 1,
"storeAudio": true
}
POST /tts (text/plain — simplest)
POST https://api.unlimitedtts.com/tts?voice=openai_nova
Content-Type: text/plain; charset=utf-8
x-credit-account: <your-account-uuid>
Hello world
GET /tts (fallback when POST is blocked)
GET https://api.unlimitedtts.com/tts?text=Hello%20world&voice=openai_nova
x-credit-account: <your-account-uuid>
Async with no storage (privacy-first)
POST https://api.unlimitedtts.com/tts?async=true&storeAudio=false
Content-Type: application/json
x-credit-account: <your-account-uuid>
{
"text": "Hello world",
"voice": "nova"
}
Limits
- Limits and quotas are enforced by the API and may change. Read the current values at
GET https://api.unlimitedtts.com/docs. - Idempotency key max length: 512 chars (async only)
- Account ID is a bearer token — anyone holding it can spend the balance
Privacy & Storage
- Audio is stored for a few days by default so you can poll async jobs and download later.
- Send
storeAudio=falseto opt out of storage entirely — completed no-store jobs cannot be downloaded later. - The API never receives raw card data; Stripe Checkout handles all payment collection.
- Failed requests refund credit-settled payments back to the account automatically.