API reference

Lifelike Malayalam & Indic text-to-speech over a simple REST API. Free while in beta.

Quickstart

  1. Create an API key in your dashboard.
  2. Set it as SKILLIES_API_KEY.
  3. Call the endpoint — you get back a WAV.
curl https://voice.skillies.ai/v1/text-to-speech \
  -H "Authorization: Bearer $SKILLIES_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"നമസ്കാരം! Welcome to Skillies Voice.","voice_id":"ehsan"}' \
  --output speech.wav

POST /v1/text-to-speech

Synthesize speech. Returns audio/wav(24 kHz, mono).

text
string, required
The text to speak. Malayalam, English, or mixed. Max 800 chars.
voice_id
string, required
A voice from GET /v1/voices (e.g. "ehsan").
language
string, optional
BCP-47-ish hint (e.g. "ml"). Auto-detected if omitted.
Node.js
const res = await fetch("https://voice.skillies.ai/v1/text-to-speech", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.SKILLIES_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ text: "നമസ്കാരം!", voice_id: "ehsan" }),
});
const buf = Buffer.from(await res.arrayBuffer());
require("fs").writeFileSync("speech.wav", buf);
Python
import os, requests

res = requests.post(
    "https://voice.skillies.ai/v1/text-to-speech",
    headers={"Authorization": f"Bearer {os.environ['SKILLIES_API_KEY']}"},
    json={"text": "നമസ്കാരം!", "voice_id": "ehsan"},
)
open("speech.wav", "wb").write(res.content)

GET /v1/voices

List the voices you can synthesize with.

curl https://voice.skillies.ai/v1/voices \
  -H "Authorization: Bearer $SKILLIES_API_KEY"

Errors & limits

401 unauthorized
Missing or invalid/revoked API key.
400 invalid_input
Bad body — check text length and voice_id.
404 unknown_voice
That voice_id isn't in your catalog.
429 rate_limited
Slow down (60 requests/min per key in beta).
502 synthesis_failed
Voice engine hiccup — retry. First call may be slow (cold start).

Errors are JSON: { "error": "code", "message": "..." }. Every synth response carries an x-request-id header.