Lifetime Deal: $199 one-time — PRO forever41d 12h 25m 15s87/100claimed·13 leftClaim your spot →
Home›Developers
REST API · Free Key · Free Forever

Free Text to Speech API
for Developers

A real REST endpoint backed by 2,253 premium neural voices. POST your text, get an MP3 back. A free key, no OAuth dance, no $0.006/character meter running in the background.

# Step 1: Generate audio (free key — grab yours in the dashboard)
curl -X POST https://freetts.org/api/v1/tts \
  -H "Content-Type: application/json" \
  -H "x-api-key: $FREETTS_API_KEY" \
  -d '{"text":"Hello from FreeTTS API","voice":"en-US-JennyNeural","rate":"+0%","pitch":"+0Hz"}' \
  -o response.json

# Step 2: Extract file_id and download MP3
FILE_ID=$(cat response.json | python3 -c "import sys,json; print(json.load(sys.stdin)['file_id'])")
curl https://freetts.org/api/audio/$FILE_ID -o speech.mp3
import os
import requests

# Generate speech
response = requests.post(
    "https://freetts.org/api/v1/tts",
    headers={"x-api-key": os.environ["FREETTS_API_KEY"]},
    json={
        "text": "Hello from FreeTTS API",
        "voice": "en-US-JennyNeural",
        "rate": "+0%",
        "pitch": "+0Hz",
    },
)
file_id = response.json()["file_id"]

# Download the MP3
audio = requests.get(f"https://freetts.org/api/audio/{file_id}")
with open("speech.mp3", "wb") as f:
    f.write(audio.content)

print(f"Done. Saved as speech.mp3")
// Generate speech (keep the key server-side — never ship it to a browser)
const res = await fetch('https://freetts.org/api/v1/tts', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-api-key': process.env.FREETTS_API_KEY
  },
  body: JSON.stringify({
    text: 'Hello from FreeTTS API',
    voice: 'en-US-JennyNeural',
    rate: '+0%',
    pitch: '+0Hz'
  })
});
const { file_id } = await res.json();

// Download MP3
const audio = await fetch(`https://freetts.org/api/audio/${file_id}`);
const blob = await audio.blob();
const url = URL.createObjectURL(blob);

// Play it
new Audio(url).play();
const https = require('https');
const fs = require('fs');

function tts(text, voice = 'en-US-JennyNeural') {
  return new Promise((resolve, reject) => {
    const body = JSON.stringify({ text, voice, rate: '+0%', pitch: '+0Hz' });
    const req = https.request({
      hostname: 'freetts.org',
      path: '/api/v1/tts',
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Content-Length': Buffer.byteLength(body),
        'x-api-key': process.env.FREETTS_API_KEY
      }
    }, res => {
      let data = '';
      res.on('data', chunk => data += chunk);
      res.on('end', () => resolve(JSON.parse(data).file_id));
    });
    req.on('error', reject);
    req.write(body);
    req.end();
  });
}

tts('Hello from Node.js').then(id => {
  https.get(`https://freetts.org/api/audio/${id}`, res => {
    res.pipe(fs.createWriteStream('speech.mp3'));
  });
});
200 OK speech.mp3
4Endpoints
2,250+Neural Voices
10/minFree Rate Limit
$0Cost

Get audio in under 60 seconds

No sales call, no waiting for an API key email that never arrives. Create a free account, mint your key in the dashboard, then pick your language, copy the code and run it. That's it.

The code is in the terminal above — pick your language with the tabs, then use the copy icon in its corner. Every code box on this page has one.

Endpoints

Four endpoints, all straightforward. Generate audio, download it, grab the subtitles, or fetch the full voice list.

Base URLhttps://freetts.org/api
POST/tts

Generate text to speech audio. Send JSON with your text and voice preferences, get back a file_id you can use to download the MP3 and SRT.

ParameterTypeRequiredDefaultDescription
textstringrequired—The text to synthesize. Max 1,000 characters (free tier). PRO: 10,000. Creator: 25,000.
voicestringoptionalen-US-JennyNeuralVoice name from GET /voices. Format: locale-NameNeural.
ratestringoptional+0%Speaking speed as percentage offset. Range: -50% to +100%.
pitchstringoptional+0HzPitch offset in Hz from baseline. Range: -20Hz to +20Hz.
output_formatstringoptionalmp3Audio format to return: mp3, mp3-hd, wav, or ogg (Ogg/Opus). All formats are mono (single channel), so no downmixing is needed on your end.
Response — 200 OK
JSON
{ "file_id": "a3f7c012-58b4-4e2a-9d1c-0f83abc12345" }
GET/audio/{file_id}

Download the generated MP3 file. Use the file_id returned by POST /tts. Files are available for 1 hour after generation.

ParameterTypeRequiredDescription
file_idstring (UUID)requiredThe file_id from the POST /tts response. Valid for 1 hour.
Response — 200 OK
Headers
Content-Type: audio/mpeg
Content-Disposition: attachment; filename="speech.mp3"
GET/srt/{file_id}

Download the SRT subtitle file generated alongside the MP3. Same file_id, different endpoint. Word-level timestamps synchronized to the audio.

Response — 200 OK (sample)
SRT
1
00:00:00,000 --> 00:00:00,620
Hello

2
00:00:00,620 --> 00:00:01,100
from

3
00:00:01,100 --> 00:00:01,680
FreeTTS API
GET/voices

Returns the complete list of available voices. Use the ShortName field as the voice parameter in POST /tts.

Response — 200 OK (truncated)
JSON
[
  {
    "ShortName": "en-US-JennyNeural",
    "Gender": "Female",
    "Locale": "en-US",
    "LocaleName": "English (United States)"
  },
  {
    "ShortName": "en-US-GuyNeural",
    "Gender": "Male",
    "Locale": "en-US",
    "LocaleName": "English (United States)"
  },
  // ... 2,250+ more
]

Parameters in depth

Everything you need to know about voice, rate, and pitch. With examples.

voice

Any ShortName from our voice catalog. 2,250+ options. Format is always locale-NameNeural. Defaults to en-US-JennyNeural if omitted.

Browse the full gallery at freetts.org/voices or fetch the list dynamically from GET /api/voices.

en-US-JennyNeuralen-US-GuyNeuralen-GB-SoniaNeuralfr-FR-DeniseNeuralde-DE-KatjaNeuralja-JP-NanamiNeuralzh-CN-XiaoxiaoNeuralar-SA-ZariyahNeural

rate

Speaking speed as a percentage offset from the voice's default. +0% is normal speed. +50% is 50% faster. -20% is 20% slower. Range: -50% to +100%.

-50%-20%-10%+0%+10%+25%+50%+100%

pitch

Pitch offset in Hertz relative to the voice's baseline pitch. +0Hz is the default. Higher values raise pitch, lower values deepen it. Range: -20Hz to +20Hz.

-20Hz-10Hz-5Hz+0Hz+5Hz+10Hz+20Hz

Free tier limits

The API is free. These limits keep it that way.

20Requests per minute per IP
1,000Max characters per request (free)
1 hrFile availability window

Hitting the limit returns HTTP 429. Wait 60 seconds and try again. The window resets per IP, per minute.

The free tier allows 5,000 chars per generation, 2,000 chars per day, 15,000 chars per month. If you are building something that needs higher limits, 200 req/min with 10K characters per request and 1,000,000 chars/month is available on the PRO API.

Need more? FreeTTS PRO gives you 200 req/min, 10K characters per generation, WAV/OGG export, SSML support, and priority processing for $19/month.

Popular voices to get you started

Here are some of the most-used voices. Full list of 2,250+ at freetts.org/voices or via the API.

ShortNameLanguageGenderNotes
en-US-JennyNeuralEnglish (US)FemaleDefault. Friendly, conversational.
en-US-GuyNeuralEnglish (US)MaleNatural, newscaster-style.
en-US-AriaNeuralEnglish (US)Female16 emotional styles.
en-US-DavisNeuralEnglish (US)Male11 styles, great for character voices.
en-GB-SoniaNeuralEnglish (UK)FemaleClear British accent, British English.
fr-FR-DeniseNeuralFrench (France)FemaleNatural French, 8 styles.
de-DE-KatjaNeuralGerman (Germany)FemaleClear German pronunciation.
ja-JP-NanamiNeuralJapaneseFemale7 styles including crying.
zh-CN-XiaoxiaoNeuralChinese (Mandarin)FemaleMost styles: 20. Best for Chinese.
ar-SA-ZariyahNeuralArabic (Saudi Arabia)FemaleMSA Arabic.

What developers build with it

No fluff. Real things people have actually shipped.

🔌

Browser Extensions

Read any selected text on any webpage. Highlight, right-click, hear it. Zero backend required if you call the API from the extension directly.

🤖

Discord & Slack Bots

Bot receives a slash command, generates TTS, plays it in voice channel. Single API call, no audio processing libraries.

♿

Accessibility Layers

Add listen buttons to existing web apps without a full TTS integration. One POST, stream the audio back, done.

🎧

Podcast Automation

Generate episode intros, ads, or summaries automatically. Push to RSS feed. Whole workflow in a Python script under 50 lines.

📚

E-Learning Tools

Convert lesson content to audio as it's authored. Students get audio automatically. No manual recording, no studio time.

🌐

Language Learning Apps

Pronunciation examples on demand. User types a word, app generates native speech. Works across 149 languages.

Drop a TTS widget on any page

One script tag. No configuration required. Adds a minimal text-to-speech widget to any HTML page.

Add this to your HTML and users get a listen button that reads your page content. Works on any static site, WordPress, or web app.

HTML
<script src="https://freetts.org/widget.js" 
  data-voice="en-US-JennyNeural"
  data-theme="dark"
  data-autoplay="false">
</script>
AttributeTypeDefaultDescription
data-voicestringen-US-JennyNeuralDefault voice for the widget
data-themestringautolight, dark, or auto (follows OS preference)
data-autoplaybooleanfalseAuto-play when page loads

How the API works under the hood

No jargon. Just the relevant details for integration.

Backend: The API uses Microsoft Azure Cognitive Services Neural TTS. We proxy the request through our server, handle caching, format the response, and return a file_id. You never talk to Azure directly. No Azure account needed.

Audio format: Free tier returns 48kHz MP3. PRO adds WAV (48kHz, 16-bit PCM) and OGG (Ogg container, Opus codec, 48kHz). Every format we return is mono — that is the format we request from Azure, not something we downmix afterwards, so there is no post-processing needed on yours.

SRT generation: Word-level timestamps come from Azure's viseme data which we convert to SRT format. Each word gets its own timestamp entry, synchronized to the exact millisecond in the audio.

SSML support: You can pass raw SSML if you set the text field to a complete SSML document. Useful for multi-voice conversations, pauses, or emphasis. PRO plan has a dedicated SSML endpoint with validation.

CORS note: The API does not emit CORS headers by default. If you are calling it from a browser frontend, go through your own backend proxy to avoid blocked requests. The browser-based demo at freetts.org works because it goes through our own server, not directly to the API endpoint.

Frequently asked questions

Do I need an API key?
▾
Yes, and it is free. Create a free FreeTTS account, open API Keys in the dashboard and mint a key, then send it as the x-api-key header to POST /api/v1/tts. The free key covers the standard voice catalogue at 10 requests per minute and up to 5,000 characters a month, drawing on the same character counter as the website rather than a second pool, and its audio carries the spoken FreeTTS tag. PRO ($19/mo) raises that to 1,000,000 characters a month at 200 requests per minute, removes the tag and unlocks HD and Signature voices.
Is it free for commercial use?
▾
The free API tier is for personal, non-commercial use only and includes an audio watermark. Commercial use requires a PRO ($19/mo) or Creator plan, which includes watermark-free audio and a commercial license. Attribution is appreciated but not required on paid plans.
How long are files available after generation?
▾
Free-tier files are kept for one hour, then deleted automatically. PRO files are kept for 30 days. Download your MP3 and SRT within that window. If you need a file again, just regenerate it — it takes 1-3 seconds.
Can I get SRT subtitle files via the API?
▾
Yes. Every /api/v1/tts call generates both an MP3 and an SRT file. Use the same file_id with GET /api/srt/{file_id} to download the subtitle file. The timestamps are word-level and synchronised to your audio.
What voice names can I use?
▾
Any voice name returned by GET /api/voices. That endpoint returns the full list of 2,253 voices with their ShortName field — that is the value you pass as the voice parameter in POST /tts.
What happens when I hit the rate limit?
▾
HTTP 429 with the message "Too many requests. Please wait a minute." Wait 60 seconds and the window resets. A free API key is 10 requests per minute, PRO is 200 per minute, and Creator is 1,000 per minute.
What audio formats can I get, and can I get mono?
▾
Pass output_format on the request. The values are mp3 (default, 24kHz), mp3-hd (48kHz), wav (48kHz 16-bit PCM), and ogg (Ogg container with the Opus codec, 48kHz). Every format is mono, single channel, so there is no channels parameter and no downmixing needed on your end. If you specifically need Ogg Vorbis rather than Ogg Opus, contact us.
How do I authenticate the developer API?
▾
Create an API key in your dashboard under API Keys, then send it as the x-api-key header to POST /api/v1/tts. Free accounts get one key, PRO and Creator up to ten, and revoking a key stops it working instantly. Confirm your email address first — keys are only issued to verified accounts.
How many characters can I send in one request?
▾
5,000 characters per request on the free tier, 10,000 on PRO, and 25,000 on Creator. Longer text is split and stitched automatically on the paid plans, so a single call can return one continuous audio file.
What is the monthly character allowance?
▾
A free API key includes 5,000 characters per month, PRO includes 1,000,000 and Creator includes 5,000,000. Every generate call returns chars_used and chars_limit in the response, so you can track usage without a separate request.
Can I use SSML for pauses, emphasis and multiple voices?
▾
Yes. Set the text field to a complete SSML document and it is passed through instead of being treated as plain text. This is how you add breaks, emphasis, phonemes and multi-voice conversations. PRO also has a dedicated SSML endpoint with validation.
Do you support expressive styles like cheerful or sad?
▾
Yes, on PRO and Creator. Pass style along with an optional style_degree between 0.01 and 2.0 to control intensity. There are 95 styles including cheerful, sad, angry, whispering and newscast. Not every voice supports every style, so check the voice list first.