Multilingual Text-to-Speech API

Your words.
Any language.
Instantly.

Turn text into natural-sounding speech across 31 languages — entire documents, articles, and books. Submit a job, get notified, download one stitched audio file.

Start for free → Read the docs
quickstart.sh
# Submit a narration job — one call, any length
curl -X POST https://api.narrateai.mossforge.dev/v1/tts/async \
  -H "Authorization: Bearer nai_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Bonjour, comment puis-je vous aider?",
    "lang": "fr",
    "voice": "michael"
  }'

# → job ID back immediately
{ "job_id": "888d45c5-...", "status": "processing", "estimated_minutes": 0.5 }

# Poll for completion
curl https://api.narrateai.mossforge.dev/v1/tts/async/888d45c5-... \
  -H "Authorization: Bearer nai_your_key"

# → ready-to-play audio URL when done
{ "status": "complete", "url": "https://..." }
31+
Languages
125k
Free chars on signup
10+
Voice styles
1 file
Stitched output

Why NarrateAI

Everything you need.
Nothing you don't.

01

Works in every language

English, French, Japanese, Arabic, Hindi, and 26 more — all at the same price. No language surcharges, no separate models. One API, one key, everywhere.

02

Sounds like a real person

10 natural voice styles with inline expression tags. Add a <laugh>, <sigh>, or <breath> directly in your text for human-sounding output without post-processing.

03

Built for long-form content

Synthesise entire documents, articles, and books — not just short snippets. Submit a job, get notified when it's ready, download one stitched audio file. No babysitting required.

04

No surprise bills

Pay per character, not per minute. Track exactly how much you've used at any time. Monthly quotas enforced per key — you'll never wake up to an unexpected charge.

05

Dead simple to integrate

Two endpoints. Bearer token auth. JSON in, audio URL out. No SDKs to install, no webhooks to configure for basic usage. Works with any HTTP client in any language.

06

A free tier that's actually useful

125,000 characters on signup — roughly 1.5 hours of audio — then 10,000 characters every month, free forever. Enough to build something real before spending a penny.

Pricing

Start free.
Scale when ready.

Dev

$0

10k chars / month
+ 125k bonus on signup

  • —~1.5 hrs free to start
  • —All voices
  • —All 31 languages
  • —API access
  • +Unlimited top-ups
  • ✗Voice cloning
  • —Long-form jobs

Hobby

$19/mo

760k chars / month

  • —~8 hrs / month
  • —All voices
  • —All 31 languages
  • —API access
  • +Unlimited top-ups
  • ✗Voice cloning
  • —Long-form jobs

Studio

$99/mo

6.6M chars / month

  • —~66 hrs / month
  • —All voices
  • —All 31 languages
  • —API access
  • —Unlimited top-ups
  • —5/month voice clones (coming soon)
  • —Long-form jobs
Best value

Pro

$149/mo

14.9M chars / month

  • —~149 hrs / month
  • —All voices
  • —All 31 languages
  • —Priority inference
  • +Unlimited top-ups
  • —10/month voice clones (coming soon)
  • —Long-form jobs

Credit top-up packs — buy extra chars any time

Plan Top-ups allowed 250k pack 500k pack Rate / 1k chars
Dev 1 / month $7.50$15.00 $0.030
Hobby 2 / month $6.75$13.50 $0.027
Creator Unlimited $5.50$11.00 $0.022
Studio Unlimited $4.25$8.50 $0.017
Pro Unlimited $3.00$6.00 $0.012

Top-up credits never expire. All plans: credit packs are always more expensive per character than your subscription rate — upgrading your plan is always the better value for consistent usage.

Need more? Get in touch for volume pricing.

Get started

Your API key,
in 30 seconds.

No credit card. No lengthy signup. Enter your name and email and your key arrives immediately.

Free tier: 125,000 characters on signup, then 10,000/month forever. No spam — your email is only used to deliver your key and essential account notices.

API Reference

Simple by design.

POST/v1/tts/async

Create a narration job

Submit text for async processing. Text is split into parallel chunks and stitched into one WAV file. Returns immediately with a job ID — poll /v1/tts/async/{job_id} for status. Max 100,000 characters per job.

Request body

ParameterTypeDescription
textstring requiredText to narrate. Max 100,000 characters.
langstring optionalISO 639-1 language code. Default: en. See supported languages below.
voicestring optionalVoice name or ID (e.g. michael or m1). Default: michael.
speedfloat optionalSpeech speed. Default: 1.05.
stepsinteger optionalInference steps. Default: 8.

Response 202 Accepted

{
  "job_id": "888d45c5-1234-...",
  "status": "processing",
  "total_chunks": 4,
  "total_chars": 1240,
  "estimated_seconds": 15,
  "poll_url": "/v1/tts/async/888d45c5-1234-..."
}
GET/v1/tts/async/{job_id}

Poll job status

Check the status of a narration job. Only the account that created the job may poll it. When status is complete, a presigned S3 URL is included (valid 1 hour). Audio files are purged after 7 days.

Response — processing

{
  "job_id": "888d45c5-...",
  "status": "processing",
  "total_chunks": 4,
  "completed_chunks": 2,
  "failed_chunks": 0,
  "total_chars": 1240,
  "created_at": 1748000000,
  "progress_percent": 50.0
}

Response — complete

{
  "job_id": "888d45c5-...",
  "status": "complete",
  "total_chunks": 4,
  "completed_chunks": 4,
  "failed_chunks": 0,
  "total_chars": 1240,
  "created_at": 1748000000,
  "progress_percent": 100.0,
  "url": "https://s3.amazonaws.com/...",
  "duration_seconds": 184.3
}

Response — failed

{
  "job_id": "888d45c5-...",
  "status": "failed",
  "progress_percent": 75.0,
  "error": "Job failed"
}
POST/v1/accounts

Register for an API key

Create a new account. No authentication required. Your API key is emailed immediately. The free_email tier starts with 0 credits — add a payment method via /v1/billing/activate to unlock 125,000 bonus characters.

Request body

ParameterTypeDescription
namestring requiredYour name. Max 100 characters.
emailstring requiredYour email address. Used only to deliver your key and essential account notices.

Response

{ "message": "Check your email for your API key." }
GET/v1/accounts/me/usage

Check your usage

Monthly usage summary — characters used, quota remaining, daily breakdown, language breakdown. Append ?month=YYYY-MM to query a previous month. Requires authentication.

POST/v1/billing/checkout

Create a checkout session

Create a Stripe Checkout session to subscribe to a plan or add a card. Requires authentication. Redirect the user to the returned url. On success, Stripe redirects to /billing/return?session_id=….

Request body

ParameterTypeDescription
planstring requiredfree_card (setup only, no charge) · hobby · creator · studio · pro

Response

{ "sessionId": "cs_live_...", "url": "https://checkout.stripe.com/..." }
POST/v1/billing/topup

Purchase a top-up pack

Create a one-time Stripe Checkout session to buy additional characters. Requires authentication and an existing billing account (complete a checkout first). Top-up credits never expire.

Request body

ParameterTypeDescription
tierstring requiredYour current plan tier: dev · hobby · creator · studio · pro
packstring requiredPack size: 250k · 500k

Response

{ "sessionId": "cs_live_...", "url": "https://checkout.stripe.com/..." }
POST/v1/billing/portal

Open billing portal

Create a Stripe Customer Portal session for managing subscriptions, payment methods, and invoices. Requires authentication and an existing billing account. Returns to /account on exit.

Response

{ "url": "https://billing.stripe.com/..." }
GET/v1/billing/session

Retrieve a checkout session

Look up a Stripe Checkout session after redirect — use this on your return page to confirm payment status. Requires authentication.

Query parameters

ParameterTypeDescription
session_idstring requiredThe session_id from the Stripe redirect query string.

Response

{
  "id": "cs_live_...",
  "status": "complete",
  "paymentStatus": "paid",
  "customerEmail": "ada@example.com"
}
GET/v1/billing/activate

Activate free account

Linked from the welcome email for free_email accounts. Redirects to a Stripe Checkout setup session to add a payment method and unlock 125,000 bonus characters (no charge). No authentication required — verified by the token in the link.

Query parameters

ParameterTypeDescription
tokenstring required64-character activation token from the welcome email link.

Response

# 302 redirect → Stripe Checkout setup session URL

Supported languages

CodeLanguageCodeLanguageCodeLanguage
enEnglishfrFrenchdeGerman
esSpanishptPortugueseitItalian
jaJapanesekoKoreanarArabic
hiHindiruRussiannlDutch
plPolishsvSwedishtrTurkish
ukUkrainianviVietnameseidIndonesian
daDanishfiFinnishbgBulgarian
csCzechelGreeketEstonian
hrCroatianhuHungarianltLithuanian
lvLatvianroRomanianskSlovak
slSlovenian

Voice styles

Pass either the name or the ID — both are accepted.

NameIDCharacter
michaelm1Male, natural — default
jakem2Male, natural
christianm3Male, warm
alexm4Male, expressive
richardm5Male, British accent
emilyf1Female, natural
hannahf2Female, warm
jessicaf3Female, expressive
alexisf4Female, assertive
cassandraf5Female, British accent

Error codes

StatusMeaning
400Missing or invalid parameters
401Missing or invalid API key
402No credits remaining, or account suspended — top up, upgrade, or update payment method
403Forbidden — job belongs to a different account
404Job not found
429Per-minute rate limit exceeded for your tier
500Internal error — retry with exponential backoff

Rate limits by tier

TierRequests / minute
dev10
hobby20
creator60
studio100
pro120