API Reference
The Speakr API lets you generate speech, transcribe audio, manage voices, and pull usage programmatically. Everything you can do in the dashboard is available via the API.
Authentication
All endpoints require a Bearer token. Get one at /keys.
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Base URL: https://speakr.flexifunnels.com/api/v1
Generate speech
/tts/generatescope: tts:generatecurl -X POST https://speakr.flexifunnels.com/api/v1/tts/generate \
-H "Authorization: Bearer $SPEAKR_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Hello from the Speakr API.",
"voice_id": "uuid-of-your-voice",
"emotion": "calm",
"speed": 1.0,
"cfg": 2.0,
"inference_timesteps": 10
}'Returns audio_url (signed, 24h expiry), duration_s, and inference_ms.
Transcribe audio
/transcribescope: (any scope)Multipart form with an audio file:
curl -X POST https://speakr.flexifunnels.com/api/v1/transcribe \ -H "Authorization: Bearer $SPEAKR_KEY" \ -F "audio=@recording.wav" \ -F "language=auto"
Or JSON with a URL:
curl -X POST https://speakr.flexifunnels.com/api/v1/transcribe \
-H "Authorization: Bearer $SPEAKR_KEY" \
-H "Content-Type: application/json" \
-d '{ "audio_url": "https://...", "language": "en" }'Voices
/voicesscope: voices:readList voices. Query params: ?limit=20&kind=clone&status=ready
curl https://speakr.flexifunnels.com/api/v1/voices \ -H "Authorization: Bearer $SPEAKR_KEY"
/voicesscope: voices:writeClone a voice from public URLs:
curl -X POST https://speakr.flexifunnels.com/api/v1/voices \
-H "Authorization: Bearer $SPEAKR_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "My Voice",
"language": "en",
"reference_audio_url": "https://example.com/me.wav",
"consent_audio_url": "https://example.com/me-consent.wav"
}'/voices/designscope: voices:writeDesign a voice from text description:
curl -X POST https://speakr.flexifunnels.com/api/v1/voices/design \
-H "Authorization: Bearer $SPEAKR_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Aurora",
"description": "Warm young woman with a soft British accent",
"language": "en"
}'/voices/{id}scope: voices:read/voices/{id}scope: voices:writeGenerations history
/generationsscope: generations:readList recent generations. Query params: ?limit=50&status=succeeded&voice_id=...
curl https://speakr.flexifunnels.com/api/v1/generations \ -H "Authorization: Bearer $SPEAKR_KEY"
/generations/{id}scope: generations:readReturns a fresh signed audio_url (1h expiry).
Account usage
/usagescope: (any scope)curl https://speakr.flexifunnels.com/api/v1/usage \
-H "Authorization: Bearer $SPEAKR_KEY"
# Response:
{
"plan": "creator",
"subscription_status": "active",
"audio": { "seconds_used": 1200, "seconds_limit": 18000, "percent_used": 7 },
"voices": { "used": 3, "limit": 50, "remaining": 47 }
}Errors
All errors return a consistent shape:
{ "error": { "message": "Voice quota reached.", "code": "quota_exceeded" } }Common codes: unauthorized, scope_required, quota_exceeded, not_found, voice_not_ready.
Scopes
When you create an API key, you can scope it down:
tts:generate— call /tts/generatevoices:read— list and fetch voicesvoices:write— clone, design, delete voicesgenerations:read— list and fetch past generations
New keys default to all four scopes. /transcribe and /usage need any valid key.