Text-to-Speech

Generate TTS audio and receive a permanent hosted audio URL.

llms.txt Full docs for LLMs

Generate high-quality TTS audio programmatically. Submit a script, choose a voice, and receive a permanent hosted audio URL. Uses character-based credits (see Credits & Billing).

GET /api/voices

Browse and search available ElevenLabs voices. Returns voice IDs you can use with provider=elevenlabs. For Stealth voices, use /api/voices/stealth instead.

Headers
NameTypeRequiredDescription
AuthorizationstringRequiredBearer token: Bearer YOUR_API_KEY
Query Parameters
NameTypeRequiredDefaultDescription
searchstringOptionalSearch by voice name or labels
genderstringOptionalFilter by gender: male, female, or neutral
agestringOptionalFilter by age: young, middle_aged, or old
languagestringOptionalLanguage code (e.g. en, es, fr)
accentstringOptionalFilter by accent (e.g. american, british)
sortstringOptionaltrendingSort by: trending, created_date, usage_character_count_1y
page_sizeintegerOptional30Results per page (max 100)
pageintegerOptional0Page number (0-indexed)
Example Request
# Browse trending voices curl "https://api.algrow.online/api/voices?sort=trending&page_size=10" \ -H "Authorization: Bearer YOUR_API_KEY" # Search for female English voices curl "https://api.algrow.online/api/voices?search=narrator&gender=female&language=en" \ -H "Authorization: Bearer YOUR_API_KEY"
Response 200 200
{ "success": true, "voices": [ { "voice_id": "EkK5I93UQWFDigLMpZcX", "name": "James - Husky, Engaging and Bold", "gender": "male", "age": "middle_aged", "accent": "american", "language": "en", "description": "A slightly husky and bassy voice...", "preview_url": "https://...", "category": "high_quality", "use_case": "narrative_story" } ], "has_more": true }

POST /api/generate-simple

Create a text-to-speech generation job. Returns a job_id immediately. The audio is generated asynchronously — poll /api/job-status/:job_id to check progress and retrieve the audio URL when complete.

Headers
NameTypeRequiredDescription
AuthorizationstringRequiredBearer token: Bearer YOUR_API_KEY
Content-TypestringAutoSet automatically by curl -F. If manual: multipart/form-data
Request Parameters (form-data)
NameTypeRequiredDefaultDescription
scriptstringRequiredText to convert to speech. Limit depends on plan & provider (see table below).
voice_idstringRequiredVoice ID. For ElevenLabs: e.g. 21m00Tcm4TlvDq8ikWAM. For Stealth: use the voice_id from /api/voices/stealth. For MiniMax: use the voice_id from /api/voices/minimax (clone first).
providerstringOptionalelevenlabsTTS engine. Values: elevenlabs, stealth, minimax
model_idstringOptionaleleven_multilingual_v2Model to use. Also available: eleven_v3, eleven_turbo_v2_5, eleven_flash_v2_5, eleven_turbo_v2, eleven_flash_v2
stabilityfloatOptional0.5Voice consistency. Higher = more stable, lower = more expressive. Range: 0.0 – 1.0
similarity_boostfloatOptional0.5How closely to match the original voice. Range: 0.0 – 1.0
stylefloatOptional0.0Speaking style exaggeration. Higher values amplify the voice's style. Range: 0.0 – 1.0
speedfloatOptional1.0Playback speed. Range: 0.7 – 1.2 (ElevenLabs) or 0.5 – 2.0 (MiniMax)
pitchintOptional0Pitch shift in semitones. Range: -12 – +12. (MiniMax only)
volumefloatOptional1.0Output volume multiplier. Range: 0.0 – 10.0. (MiniMax only)
voice_namestringOptionalvoice_idHuman-readable label for this voice (for your reference only)
custom_titlestringOptionalCustom filename for the output MP3 (without extension)
generate_srtstringOptionalfalseSet to true to generate an SRT subtitle file (ElevenLabs only). Bills 1.2× characters.
temperaturefloatOptional1.1Voice expressiveness (Stealth only). Higher = more expressive.
speaking_ratefloatOptional1.0Speaking speed multiplier (Stealth only).
stealth_modelstringOptional1.5Stealth model tier (Stealth only). 1.5 = standard model (1× characters, default); 2.0 = Stealth 2.0, our newest, most capable model (2× characters).
Provider-specific parameters:
When provider=stealth: only temperature, speaking_rate and stealth_model are used. Parameters stability, similarity_boost, style, speed, and model_id are ignored.
When provider=elevenlabs (default): only stability, similarity_boost, style, speed, and model_id are used. Parameters temperature and speaking_rate are ignored.
When provider=minimax: only speed, pitch, and volume are used. The voice must be cloned via /api/voices/minimax/clone first. Minimum 200 characters.
Stealth models: Two tiers, selected with stealth_model. 1.5 (default) is the standard model and bills characters. 2.0 is Stealth 2.0 — our newest, most capable model with richer expression and stronger multilingual quality — and bills characters against your Stealth balance. Both auto-chunk at ~1,900 char boundaries. Output: MP3, uploaded to CDN.
SRT subtitles: Setting generate_srt=true (ElevenLabs only) runs an extra forced-alignment pass to produce a word-timed subtitle file alongside the audio, and bills 1.2× the character count of your script. Without it, generation bills .
Per-generation character limits:
ProviderProfessionalUltimate
ElevenLabs100,000200,000
Stealth45,000100,000
MiniMax100,000200,000
Example Request (ElevenLabs)
curl -X POST "https://api.algrow.online/api/generate-simple" \ -H "Authorization: Bearer YOUR_API_KEY" \ -F "script=Hello, welcome to our channel." \ -F "voice_id=21m00Tcm4TlvDq8ikWAM" \ -F "provider=elevenlabs" \ -F "stability=0.7" \ -F "similarity_boost=0.8"
Example Request (Stealth)
curl -X POST "https://api.algrow.online/api/generate-simple" \ -H "Authorization: Bearer YOUR_API_KEY" \ -F "script=Hello, welcome to our channel." \ -F "voice_id=Evan" \ -F "provider=stealth" \ -F "temperature=1.1" \ -F "speaking_rate=1.0"
Example Request (Stealth 2.0 — bills 2x)
curl -X POST "https://api.algrow.online/api/generate-simple" \ -H "Authorization: Bearer YOUR_API_KEY" \ -F "script=Hello, welcome to our channel." \ -F "voice_id=Evan" \ -F "provider=stealth" \ -F "stealth_model=2.0" \ -F "temperature=1.1" \ -F "speaking_rate=1.0"
Response 200 200
{ "success": true, "job_id": "d477b67a-bb9d-403e-a6cf-bc8a82c93a61", "status": "pending", "status_detail": "pending", "status_detail_message": "Processing", "message": "Generation queued. Worker will process it.", "payload": { "text": "Hello, welcome to our channel.", "voice_id": "21m00Tcm4TlvDq8ikWAM", "voice_name": "21m00Tcm4TlvDq8ikWAM", "settings": { ... } } }
Response Fields
FieldTypeDescription
successbooleanWhether the request was accepted
job_idstringUnique job identifier. Use this to poll for status.
statusstringCurrent job status: pending
status_detail_messagestringHuman-readable status message
messagestringInformational message
payloadobjectEcho of the submitted parameters (text, voice_id, settings, etc.)
200 Queued 400 Validation error 401 Auth failed 402 No credits 403 Plan required 429 Too busy 500 Server error
GET /api/job-status/:job_id

Retrieve the current status and result of a generation job. Poll this endpoint every 2–3 seconds until status is completed or failed. Typical generation time is 3–15 seconds depending on script length.

Path Parameters
NameTypeRequiredDescription
job_idstringRequiredThe job_id returned from POST /api/generate-simple
Example Request
curl "https://api.algrow.online/api/job-status/300040" \ -H "Authorization: Bearer YOUR_API_KEY"
Response — In Progress
{ "success": true, "job_id": "d477b67a-bb9d-403e-a6cf-bc8a82c93a61", "status": "processing", "status_detail": "processing", "status_detail_message": "Processing", "created_at": 1772482202.525 }
Response — Completed
{ "success": true, "job_id": "d477b67a-bb9d-403e-a6cf-bc8a82c93a61", "status": "completed", "status_detail": "completed", "status_detail_message": "Completed", "created_at": 1772482202.525, "completed_at": 1772482210.831, "audio_url": "https://audio.algrow.online/elevenlabs/tts/user123/300040.mp3", "transcript_url": "https://audio.algrow.online/elevenlabs/tts/user123/transcript_300040.srt" }
Response — Failed
{ "success": true, "job_id": "d477b67a-bb9d-403e-a6cf-bc8a82c93a61", "status": "failed", "status_detail": "failed", "status_detail_message": "Failed", "created_at": 1772482202.525, "completed_at": 1772482215.100, "error": "Async job failed: [TERMS_OF_SERVICE_VIOLATION] The text you are trying to use may violate our Terms of Service and has been blocked.", "error_code": "TERMS_OF_SERVICE_VIOLATION", "error_message": "The text you are trying to use may violate our Terms of Service and has been blocked." }
Response Fields
FieldTypeDescription
successbooleanAlways true if the job was found
job_idstringThe job identifier
statusstringOne of: pending, processing, completed, failed
status_detail_messagestringHuman-readable status: "Processing", "Completed", or "Failed"
created_atfloatUnix timestamp when the job was created
completed_atfloatUnix timestamp when the job finished (only present when done)
audio_urlstringPermanent URL to the MP3 file. After generation, audio is uploaded to Cloudflare R2 and served via our CDN at audio.algrow.online — this URL will not expire. (Only when status=completed)
transcript_urlstringPermanent URL to the SRT subtitle file. Only present when generate_srt=true was passed and the job completed successfully. Uses word-level timestamps via forced alignment. (ElevenLabs only)
errorstringError description (only when status=failed)
error_codestringMachine-readable error code, e.g. TERMS_OF_SERVICE_VIOLATION (only when status=failed, if available)
error_messagestringHuman-readable error message from the provider (only when status=failed, if available)
Status lifecycle: pendingprocessingcompleted or failed. Typical completion time is 3–15 seconds.
200 Success 401 Auth failed 404 Job not found
GET /api/jobs

List your generation jobs, sorted by creation time (newest first). Returns only jobs belonging to the authenticated user. Useful for debugging and monitoring your recent generations.

Example Request
curl "https://api.algrow.online/api/jobs" \ -H "Authorization: Bearer YOUR_API_KEY"
Response
{ "success": true, "jobs": [ { "id": "300040", "provider": "elevenlabs", "status": "completed", "script_length": 340, "created_at": 1772482202.525, "completed_at": 1772482210.831 } ] }
GET /api/health

Check API health and view your current job counts. No authentication required. Use this to verify the API is online and check how many concurrent slots you have available.

Example Request
curl "https://api.algrow.online/api/health" \ -H "Authorization: Bearer YOUR_API_KEY"
Response
{ "status": "healthy", "active_jobs": 2, "total_jobs": 15 }
POST /api/reports

Publish a self-contained HTML report to Algrow's public report host and get back a stable URL on audio.algrow.online — no storage credentials needed. Built for agent skills that render analysis reports (channel decodes, audits, idea backlogs) and want to hand the user a hosted link. Reports are namespaced per user: re-posting the same slug overwrites your own report (re-render = same URL); you can never touch another user's. Pages are served with noindex so they stay out of search engines.

Request Body (JSON)
NameTypeRequiredDefaultDescription
slugstringRequiredURL slug for the report: 3–80 chars of a-z 0-9 -, starting alphanumeric. Same slug → overwrite your own previous version.
htmlstringRequiredThe complete, self-contained HTML document (must start with <!DOCTYPE html> or <html>). Max 2 MB — inline your CSS; link external images/fonts by URL.
Limits. 50 uploads per key per 24h, on top of the standard per-key rate limit. A <meta name="robots" content="noindex"> tag is injected automatically if missing.
200 Report published 400 Bad slug / not a complete HTML document 401 Auth failed 413 HTML too large (2 MB cap) 429 Daily upload cap reached
esc
×

Buy More Credits

Boost
150
credits
$4.99
Good for:
  • ~12 min caption removal
Studio
1,000
credits
$31.49
Good for:
  • ~80 min caption removal