Guides
Models
Available public models and how to select one for a request.
The API exposes stable public model ids that hide checkpoints and infrastructure. List them:
curl -s https://api.kalpalabs.ai/v1/models -H "Authorization: Bearer $KALPA_API_KEY"{
"data": [
{
"id": "kalpa-tts-beta-v0.1",
"display_name": "Kalpa TTS beta v0.1",
"description": "English conversational speech model (dialogue + TTS) — best quality; the default.",
"modes": ["converse", "tts"],
"speakers": ["0", "1"],
"languages": ["en"],
"default": true
},
{
"id": "kalpa-tts-multilingual-beta-v0.1",
"display_name": "Kalpa TTS multilingual beta v0.1",
"description": "Multilingual conversational speech model (dialogue + TTS) — English and Hindi.",
"modes": ["converse", "tts"],
"speakers": ["0", "1"],
"languages": ["en", "hi"],
"default": false
}
]
}Both models are conversational (they serve converse and tts):
| Model | Use it for |
|---|---|
kalpa-tts-beta-v0.1 | The flagship — best English quality; the default when model is omitted. |
kalpa-tts-multilingual-beta-v0.1 | English and Hindi (Devanagari text; code-switched English words are fine). |
Each card's languages lists what the model speaks as ISO 639-1 codes. -vN increases with each new variant; newer is generally better. New variants show up in GET /v1/models — read the list rather than hardcoding ids.
Choosing a model per request
Every REST/SSE generation request takes a model field:
{ "text": "…", "model": "kalpa-tts-beta-v0.1" }- Omit it (or send
null) for the default model. JSON success bodies echo the resolved public id inmodel; SSE emits it inmeta. A WebSocket selectsmodelininitializeConnectionand receives the resolved id insessionCreated. - An unknown id, or a model that doesn't support the endpoint's mode, returns
400 invalid_request.
Speakers are per model
Each card's speakers lists the role labels that model understands, in turn order. Don't hardcode them — read the card and use its labels. The details (and why wrong labels degrade audio) are in Conversations.