Free text to speech for n8n, Make and Zapier
Send text from any workflow and get an MP3 back, usually within a second or two. It runs on the HTTP Request node that comes with n8n, so there is nothing to install, and a free FreeTTS key covers 15,000 characters a month.
Last updated by the FreeTTS team · Tested in n8n 2.43.7 · Every sample on this page was made with the API call it describes
- Free key, no card
- Nothing to install
- 318 free voices, 2,253 on PRO
- MP3 link back in one call
"voice": "en-GB-SoniaNeural",
"chars_used": 392,
"audio_url": "https://freetts.org/api/audio/…"Your FreeTTS key for n8n
n8n sends this key with every request, so FreeTTS knows whose characters to count. It is shown once, so paste it into n8n straight away.
- Credential type
- Header Auth
- Name
x-api-key- Value
- your key
n8n keeps credentials encrypted and leaves them out of downloaded workflows, so you can share the workflow file without sharing the key.
The same headline, three voices. Press play.
“This is the six o'clock news. Here are tonight's headlines.”
A free key reads with the 318 standard voices and adds a short spoken FreeTTS tag at the end of each file. A PRO key adds the HD and Signature voices, with no tag. Ultra voices like Duke come with PRO on freetts.org, and are not on the API.
Quick facts
- What it is
- A REST endpoint that turns text into speech. Your workflow sends the text and a voice name, and FreeTTS answers with a link to the MP3.
- Endpoint
POST https://freetts.org/api/v1/tts- The key
- One header,
x-api-key. In n8n that is a Header Auth credential. - What comes back
- JSON with
audio_url, the characters you have used this month and your limit, the voice that spoke, and whether a spoken tag was added. - The MP3
- Waiting at
audio_urlfor 30 days. Anyone with the link can download it. - Free key
- 15,000 characters a month, 5,000 a day and 5,000 per request, 10 requests a minute, the 318 standard voices, MP3. Each file ends with a short spoken tag. For personal, non commercial use.
- PRO
- $19 a month: 1,000,000 characters a month, 10,000 per request, 200 requests a minute, HD and Signature voices, WAV and OGG, no tag, commercial use.
- Works in
- n8n Cloud and n8n on your own server, Make, Zapier (on a paid Zapier plan), cron, and anything else that can send an HTTP request.
- Tested
- The workflow file on this page was imported and run in n8n 2.43.7 on .
Set it up in n8n: four nodes
Import the ready workflow, or build it by hand in about five minutes. Either way you end up with the same four nodes.
Import the ready workflow
Open a new workflow in n8n, open the menu with the three dots at the top right, and choose Import from URL or Import from File. You can also copy the file's contents and paste them straight onto the canvas.
https://freetts.org/text-to-speech-for-n8n/freetts-news-bulletin.json Download the workflow fileInside: both triggers, the script, the two HTTP Request nodes and a note with the three things to change. Then add your key and press Test workflow.
Or build it by hand
- Schedule Trigger for when it runs
- Edit Fields for the words and the voice
- HTTP Request to FreeTTS, which makes the audio
- HTTP Request that downloads the MP3
Add a Manual Trigger next to the schedule, so you can press Test workflow without waiting for six o'clock.
- 1
Schedule Trigger
When the workflow runs.
- Trigger Interval
- Custom (Cron)
- Expression
0 6,18 * * *
That is 06:00 and 18:00 in the workflow's time zone, which you can change in the workflow settings. Hourly is
0 * * * *, weekdays at 07:30 is30 7 * * 1-5. - 2
Edit Fields
The words, and who reads them.
- text
- String · your script
- voice
en-GB-SoniaNeural
In a real workflow the text usually comes from a node in front: RSS Read for headlines, Google Sheets for a list of lines, an AI node that writes the script, or an HTTP Request to a weather API.
- 3
HTTP Request: make the audio
The only call to FreeTTS.
- Method
- POST
- URL
https://freetts.org/api/v1/tts- Authentication
- Generic Credential Type, then Header Auth, then your FreeTTS credential
- Send Body
- On · Body Content Type JSON · Specify Body: Using JSON
JSONn8n expression{ "text": {{ JSON.stringify($json.text) }}, "voice": "{{ $json.voice }}" }JSON.stringifykeeps quote marks and line breaks in your script from breaking the request. - 4
HTTP Request: download the MP3
Turns the link into a file.
- Method
- GET
- URL
{{ $json.audio_url }}- Options
- Add option, Response, then Response Format: File
- Output field
data
The MP3 is now a binary file in
data. Send it anywhere a node takes a file:- Google Drive · Upload
- Dropbox · Upload
- FTP · Upload
- Telegram · Send Audio
- Gmail · attachment
- Amazon S3
- Read/Write Files from Disk
{
"file_id": "d7f491c4-1924-4e86-b61a-08fb0ecc4df3",
"format": "mp3",
"audio_url": "https://freetts.org/api/audio/d7f491c4-1924-4e86-b61a-08fb0ecc4df3",
"chars_used": 392,
"chars_limit": 15000,
"voice": "en-GB-SoniaNeural",
"downgraded": false,
"watermark": "end"
}audio_url- The MP3. Download it in the next node. It stays available for 30 days.
file_id- The file's ID, if you prefer to build the link yourself.
chars_used- Characters used this month, this request included.
chars_limit- Your monthly allowance: 15,000 on a free key.
voice- The voice that actually spoke.
downgraded- True only if a Signature voice hit its monthly cap and a matching voice stood in.
watermark- "end" or "mid_end" on a free key, "none" on PRO.
What comes back
The six o'clock bulletin three ways, all made with the API call above on 17 October 2026: first exactly as a free key returns it, tag included, then the same script in an HD voice and a Signature voice from a PRO key. Below it, two more everyday jobs in free voices.
Good evening. This is the six o'clock bulletin. The city council has approved a new cycle lane along the river, with work starting in the spring. Train services return to normal tomorrow morning after weekend engineering works. And in sport, the town club stays top of the league after Saturday's win. Now the weather: light rain this evening, clearing overnight, with a low of eight degrees.
A free key file of a minute or longer carries the tag once in the middle as well. Start PRO free for 3 days and hear your own script in these voices.
Good morning. Here's the weather for today. Sunny spells this morning, then cloud building after lunch, with a small chance of a shower around four. A high of nineteen and a low of eleven. If you're cycling home, the wind picks up after five.
Here's your briefing for today. You have three meetings, and the first one is at half past nine with the design team. Two invoices are due this week. And the reminder you asked for: call the printer about the new menus before noon.
The same thing in Make
Make (formerly Integromat) does it with its own HTTP modules. Five modules, no code.
- Any trigger. For fixed times, open the scenario's schedule and pick Every day at a time. For news, start with RSS, Watch RSS feed items.
- JSON, Create JSON. Build a small structure with two fields,
textandvoice. It escapes quote marks and line breaks for you. - HTTP, Make a request. URL
https://freetts.org/api/v1/tts, method POST, a headerx-api-keywith your key, body type raw with content type JSON, and the JSON string from step 2 as the request content. Turn on Parse response. - HTTP, Get a file. URL: map
audio_urlfrom step 3. - Where it goes. Google Drive, Upload a file, or Dropbox, or FTP, with the file from step 4.
And in Zapier
Zapier needs one less step, because file fields accept a link and Zapier fetches the file itself.
- Trigger: Schedule by Zapier. Every Day, at the hour you want. Or any app trigger, such as a new RSS item or a new row in Google Sheets.
- Action: Webhooks by Zapier, POST. URL
https://freetts.org/api/v1/tts, Payload Type json, Datatextwith your script andvoicewithen-GB-SoniaNeural, Headersx-api-keywith your key. - Action: Google Drive, Upload File. For File, map Audio Url from step 2. Dropbox, Slack and Gmail work the same way.
Worth knowing: Webhooks by Zapier is a premium app and this Zap has three steps, so it needs a paid Zapier plan or Zapier's free trial. Make's free plan and n8n on your own server can do it at no cost.
Cron, curl and a few lines of code
If a server or a Raspberry Pi is already running, you don't need an automation tool at all. Set FREETTS_KEY once and schedule the script.
#!/bin/sh
# bulletin.sh: turn a script into bulletin.mp3 with FreeTTS
URL=$(curl -s https://freetts.org/api/v1/tts \
-H "x-api-key: $FREETTS_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "Good evening. Here is the evening bulletin.", "voice": "en-GB-SoniaNeural"}' \
| python3 -c 'import sys, json; print(json.load(sys.stdin)["audio_url"])')
curl -s -o bulletin.mp3 "$URL"# crontab -e (runs at 06:00 and 18:00 server time)
0 6,18 * * * FREETTS_KEY=your_key /home/you/bulletin.shTimes follow the server's clock. Check it with date before you rely on six o'clock.
import os
import requests
r = requests.post(
"https://freetts.org/api/v1/tts",
headers={"x-api-key": os.environ["FREETTS_KEY"]},
json={"text": "Good evening. Here is the evening bulletin.",
"voice": "en-GB-SoniaNeural"},
timeout=60,
)
r.raise_for_status()
audio = requests.get(r.json()["audio_url"], timeout=60)
open("bulletin.mp3", "wb").write(audio.content)JavaScript, Node.js, subtitles and the full reference are on the developer page.
What people build with it
Real jobs FreeTTS keys do every day, with the number that decides whether the free plan is enough: characters a day.
A newsreader for an internet radio station
A small internet radio station in England reads its own news this way. At six in the morning and six in the evening a script gathers the latest headlines and the local weather, sends about 460 characters to FreeTTS, and the station plays the MP3 on air. Nobody sits at a microphone, and it has run twice a day, every day, since it was set up.
| Job | Trigger | Words come from | Voice | Characters a day | Free key covers |
|---|---|---|---|---|---|
| Radio news bulletin | 06:00 and 18:00 | RSS Read for headlines, a weather API | Sonia | about 920 | 16 days a month |
| Morning weather announcement | Every day at 07:00 | A weather API through HTTP Request | Ava | about 250 | The whole month |
| Your own daily briefing | Weekdays at 07:30 | Google Calendar, Gmail and an AI node | Andrew | about 600 on weekdays | The whole month |
| Smart home announcements | A Home Assistant or ioBroker event | The event itself | Jenny | about 150 | The whole month |
| Voice replies in Telegram or Discord | A new message | An AI Agent node | Andrew | about 1,000 | 15 days a month |
| Voiceover for a Short or ReelPRO for paid use | A new row in Google Sheets | The sheet | Aria at +10% | about 900 a video | 16 videos a month |
| Podcast intro and outroPRO for paid use | Every Monday | A template with the episode title | Ava HD | about 1,500 a week | Needs PRO for HD |
Free audio is for personal, non commercial use. A monetized channel, a station that runs ads, or client work needs PRO.
Voices for news, weather and announcements
The same line in eight voices. Copy an ID straight into the voice field. Six are free; the last two need PRO.
Clear and steady. The voice in our bulletin sample.
en- GB- SoniaNeuralA calm British male read.
en- GB- RyanNeuralTagged for news by Microsoft. Deep and serious.
en- US- ChristopherNeuralTagged for news. Bright, quick, confident.
en- US- AriaNeuralTagged for news. The classic announcer sound.
en- US- GuyNeuralWarm and relaxed. Good for briefings.
en- US- AndrewMultilingualNeuralHD. Reads the sentence the way a presenter would.
en- GB- Ada: DragonHDLatestNeuralSignature. Built for news and narration.
en- US- Chirp3- HD- CharonEvery voice ID is in one list, no key needed: GET https://freetts.org/api/voices. Or hear them first in the voice gallery. For another language, pick a voice whose ID starts with it, such as de-DE-KatjaNeural for German or es-MX-DaliaNeural for Mexican Spanish.
Will the free key cover your workflow?
Pick a script length and how often it runs. A minute of speech is about 900 characters, measured on the samples on this page.
The free key covers about 16 days a month. After that, requests are refused until your monthly date comes round.
PRO's 1,000,000 characters a month cover this 36 times over, with no daily limit. See plans
What each plan gives your workflows
The API uses the same character allowance as the website, so a key never doubles your plan.
| Feature | Free key | PRO | Creator |
|---|---|---|---|
| Price | $0 | $19 a month | $39 a month |
| Characters a month | 15,000 | 1,000,000 | 5,000,000 |
| Characters a day | 5,000 | No daily limit | No daily limit |
| Characters per request | 5,000 | 10,000 | 25,000 |
| Requests a minute | 10 | 200 | 1,000 |
| Voices on the API | 318 standard voices | 2,227 (all but Ultra) | 2,227 (all but Ultra) |
| Audio formats | MP3 | MP3, WAV, OGG | MP3, WAV, OGG, Opus |
| Spoken FreeTTS tag | At the end, and mid file from 60 s | None | None |
| Commercial use | No, personal use only | Yes | Yes |
| API keys | 1 | Up to 10 | Up to 10 |
If a run fails
The error n8n shows, and what to change.
401 Missing x-api-key header
The request left without your key. In the HTTP Request node, set Authentication to Generic Credential Type, then Header Auth, and pick your FreeTTS credential. The header name has to be exactly x-api-key.
401 Invalid API key
The key went in with a space or a line break, or it was replaced. Open the credential and paste it again. Keys are shown only once, so if it is lost, make a new one at the top of this page.
402 HD and Signature voices are part of PRO
A free key asked for an HD or Signature voice. Use a standard voice such as en-GB-SoniaNeural, or move to PRO. The voice table above marks which is which.
402 with a daily or monthly limit
A free key has used its 5,000 characters for the day, which come back at midnight UTC, or its 15,000 for the month, which come back on your monthly date in the dashboard. PRO has 1,000,000 a month and no daily limit.
429 Rate limit reached
More than 10 requests in one minute on a free key. In the HTTP Request node open Options, add Batching, and set Items per Batch to 1 and Batch Interval to 7000 ms. That keeps you just under the limit.
400 Text exceeds the character limit
One request holds up to 5,000 characters on a free key and 10,000 on PRO. Split a long script into parts (a Code node can split it on blank lines) and send each part as its own request.
422 This voice can't read the text
The text is in a language the voice doesn't speak. The error message lists voices that can read it. Copy one of those IDs into the voice field.
The MP3 shows up as a wall of strange text
The download node is returning JSON or text. Open Options in that HTTP Request node, add Response, and set Response Format to File.
A community node won't install on n8n Cloud
You don't need one. Everything on this page runs on the HTTP Request node that ships with n8n, on Cloud and on your own server.
Zapier says the app isn't on your plan
Webhooks by Zapier is a premium app, and a three step Zap needs a paid plan too. Use Zapier's trial, a paid plan, or n8n.
Questions people ask
Where these facts come from
The API
Request and response fields are the FreeTTS API's own. The full reference is on the developer page.
The test run
We imported the workflow file into n8n 2.43.7 and ran it on 17 October 2026: about five seconds from trigger to a saved MP3.
n8n
Node names and options follow n8n's own documentation for the HTTP Request node.
Limits and licence
Plan limits are the ones on the pricing page. What you may do with the audio is in the terms.
Your first bulletin is five minutes away
Import the workflow, paste your key, press Test workflow.
n8n is a trademark of n8n GmbH, Make of Celonis, and Zapier of Zapier, Inc. FreeTTS is independent and not affiliated with any of them.