SSML text to speech
This text to speech endpoint accepts the SSML-tagged text your pipeline already produces, as well as plain text.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
It reads the spoken words out of the markup and synthesizes them into natural-sounding audio, so an existing SSML workflow can point at it without first stripping tags back to plain text. Be clear on the boundary up front: this engine renders the words, not the fine-grained acoustic controls SSML can describe.
What SSML is and why it exists
Speech Synthesis Markup Language is a W3C standard built so a writer can describe how a voice engine should say something, not just what to say: where to pause, which syllable to stress, how to pronounce an acronym, whether a string of digits is a date, a phone number or a plain quantity. It has been the industry convention for controlling synthesized speech for years, precisely because plain text is genuinely ambiguous — '2/3' can be a date, a fraction or a score, and only markup resolves that in the abstract. That is the format this endpoint accepts on input; what it does with each tag is described plainly in the next section.
How the request and response work
You submit SSML-tagged text (or plain text) in the request body. The service extracts the spoken words from the markup and synthesizes them; the tags themselves are stripped to their text before synthesis. The task is queued asynchronously and returns a task_id immediately; the rendered audio is delivered afterward via a signed webhook or a signed link valid for 24 hours. Because the words are what gets synthesized, submitting SSML and submitting the equivalent plain text produce the same natural narration — the markup is accepted for compatibility, not because each tag changes the sound.
What this engine does and does not render
This is the honest boundary, stated so nothing on this page oversells it. The current voice engine reads the text content and produces natural, well-paced speech. It does not acoustically apply the fine-grained SSML controls: emphasis, phoneme pronunciation, prosody and exact break durations are accepted in the input and then stripped, not rendered. So a two-second break tag does not hold the line for two seconds, and an emphasis tag does not stress that word harder than the model would on its own. If your use depends on those controls being rendered precisely, that capability is not available on this engine yet — this endpoint exists so an SSML pipeline can produce audio today without a separate plain-text branch.
Fitting it into automated content
SSML is just structured text, so it is easy to generate programmatically — a content pipeline can wrap numbers in tags, insert breaks between sections, or mark up a name with a phonetic hint, all without human intervention. The value of this endpoint for that audience is that it accepts the SSML they already emit as-is: they do not have to build and maintain a second code path that strips their markup down to plain text before sending it. Pricing reflects the light, targeted nature of the task — a small per-request base plus a per-1000-character rate on the submitted text, with failed tasks never billed after automatic retries.
Access and how results are handled
This endpoint requires prepaid balance like every other one in the API; a request without balance returns HTTP 402 rather than a partial or degraded result. Submitted text and generated audio are removed after the retention period and are never used to train models — delivery is strictly through your webhook or a temporary signed link, and nothing is kept beyond that window.
What you can do with it
Drop-in for an existing SSML pipeline
Point a workflow that already emits SSML at this endpoint and get spoken audio back without writing your own step to strip the tags to plain text first.
Narration from generated scripts
Turn algorithmically generated scripts into natural-sounding spoken audio as one automated step in a content pipeline.
Long-form text to audio
Convert articles, notes or documentation into audio for listeners who prefer to hear content rather than read it.
Multilingual voice output
Produce spoken audio across the supported languages from the same request shape, driven by the language field.
FAQ
What is SSML and how does this text to speech API use it?
SSML is a markup standard for describing speech synthesis. This endpoint accepts SSML-tagged text, reads the spoken words out of the markup, and synthesizes them into natural audio. It accepts the format for compatibility; see the next answer for which SSML controls are actually rendered.
Does it render emphasis, phoneme and prosody tags?
No — not on the current voice engine. Those tags, along with exact break durations, are accepted in the input and then stripped to their text; the audio reads the words naturally rather than applying the marked emphasis, pronunciation or pauses. Precise acoustic rendering of those controls is not available yet.
Is this text to speech API free?
There's no free tier — free tiers get abused and slow everyone down. Access runs on a prepaid ForHosting KIT balance: top up from $10.00 (it never expires) and each request is charged at its published price, so a call with no balance returns HTTP 402. No subscription, no tokens, no invented credits, and a failed task is never charged.
How much does it cost?
It costs $0.002 per request plus $0.0025 per 1000 characters of submitted text.
Do I need SSML for basic text to speech?
No. If you just need natural-sounding audio from plain text, the standard text to speech endpoint is simpler and produces the same kind of narration. Both plain text and SSML input come out as natural speech here.
How do I get the generated audio?
The task runs asynchronously and returns a task_id immediately; the finished audio is delivered via a signed webhook or a signed link valid for 24 hours.
What happens if my SSML markup is invalid?
Because the markup is reduced to its spoken text before synthesis, malformed tags do not fail the request — you still get audio of the readable words. Nothing is rejected for a tag being wrong, so don't rely on this endpoint to validate your SSML.
Can I use it to control the pronunciation of names or acronyms?
Not acoustically — phoneme control is not rendered on this engine, so a phoneme tag will not force a specific pronunciation. If a name must be said a particular way, spell it phonetically in the text itself so the words carry the pronunciation.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/voice/tts-ssml \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"ssml":"<speak>Hola <break time=\"500ms\"/> mundo.</speak>"}'const res = await fetch("https://api.kit.forhosting.com/voice/tts-ssml", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"ssml": "<speak>Hola <break time=\"500ms\"/> mundo.</speak>"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/voice/tts-ssml",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"ssml": "<speak>Hola <break time=\"500ms\"/> mundo.</speak>"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/voice/tts-ssml", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"ssml":"<speak>Hola <break time=\\"500ms\\"/> mundo.</speak>"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"ssml":"<speak>Hola <break time=\"500ms\"/> mundo.</speak>"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/voice/tts-ssml", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"ssml": "<speak>Hola <break time=\"500ms\"/> mundo.</speak>"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "voice.tts_ssml",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 200 |
max_minutes | 180 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |