Skip to content
For developers

Add voice to your app with one API call

Base URL: https://www.talkify.io/api/v1 · JSON in, JSON out. Every request needs an API key from your dashboard (Pro plan and above).

Quick start

const res = await fetch("https://www.talkify.io/api/v1/speech", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.VOICEGEN_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    text:     "Welcome to our channel!",
    voice:    "kavya-ta-in",   // Tamil · Friendly
    emotion:  "excited",
    format:   "mp3",
  }),
});

const { audio_url } = await res.json();  // ✓ 0.31s
200 OK · 0.31s

Authentication

Send your secret key as a Bearer token. Keys start with vg_sk_live_ (or vg_sk_test_ for testing). Keep keys on your server — never in browser or mobile code.

Authorization: Bearer vg_sk_live_••••••••••••••••

Keys can be limited to speech only. Revoke a key at any time from API keys in your dashboard.

Endpoints

MethodPathDescription
GET/voicesList voices you can use. Filters: language (e.g. en, es, ta), gender, q.
GET/languagesList supported languages with their default locale.
POST/speechTurn text into speech. Returns the request ID, audio URL, characters and duration.
GET/speech/{id}Fetch a previous request and its status.
GET/speech/{id}/audioDownload the audio file of a request.
GET/usageCharacters used and left in the current period.

Create speech

POST /speech

FieldTypeNotes
textstringRequired. Up to your plan’s limit per request. Tags such as [pause 0.5s] and [emphasis] are supported.
voicestring|intRequired. Voice slug or ID from /voices, e.g. kavya-ta-in.
emotionstringneutral · friendly · excited · calm · sad · whisper
speednumber0.5 – 2.0, default 1.0
formatstringmp3 · wav · ogg (depends on your plan)
// 200 OK
{
  "id": "req_8Hq2kLx9",
  "status": "completed",
  "audio_url": "https://www.talkify.io/api/v1/speech/req_8Hq2kLx9/audio",
  "characters": 23,
  "duration": 2,
  "format": "mp3"
}

Webhooks

Add an endpoint in API keys → Webhooks to receive speech.done and dub.done events. Each request carries an X-VoiceGen-Signature header: an HMAC-SHA256 of the raw body with your webhook secret. Verify it before trusting the payload.

const crypto = require("crypto");

function isValid(rawBody, signature, secret) {
  const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}

Errors

{ "error": { "code": "quota_exceeded", "message": "Not enough characters left." } }
HTTPCodeMeaning
401invalid_api_keyThe key is missing, wrong or revoked.
402quota_exceededNot enough characters left in this period.
403plan_requiredYour plan does not include API access, or the key lacks permission.
404not_foundThe voice or request does not exist.
422validation_errorA parameter is missing or invalid. The message says which.
429rate_limitedToo many requests. Wait a few seconds and retry.
503provider_unavailableAll speech engines are busy. Retry with exponential back-off.

Rate limits

120 requests per minute per account on Pro, 600 on Business. Every response is counted against your monthly characters only when audio is produced.

Popular voices

VoiceLanguageSlug
SophiaEnglish (US)sophia-en-us
MichaelEnglish (UK)michael-en-gb
KavyaTamilkavya-ta-in
ArjunHindiarjun-hi-in
IsabellaEnglish (UK)isabella-en-gb
EmmaEnglish (US)emma-en-us
LiamEnglish (UK)liam-en-gb
JamesEnglish (US)james-en-us