The Voice Production AI API lets you integrate text-to-speech generation, voice cloning, and voice browsing into your applications.
Base URL: https://api.voiceproductionai.com/v1
All /v1 endpoints require an API key. Create one from Settings → API Keys in the dashboard.
Pass the key as a Bearer token:
curl https://api.voiceproductionai.com/v1/voices \
-H "Authorization: Bearer vk_live_<your-key>"
API keys are workspace-scoped. The Scale plan is required to access the public API.
GET /v1/voices
Returns all voices available to your workspace (presets + cloned).
Response{
"items": [
{
"id": "uuid",
"name": "Emma",
"kind": "preset",
"language": "en",
...
}
]
}
POST /v1/generations
Request body
{
"voiceId": "uuid",
"script": "Hello, world!",
"format": "mp3",
"settings": {
"speed": 1.0,
"pitchSemitones": 0
}
}
Response 202 Accepted
{
"id": "uuid",
"status": "queued",
"estimatedCredits": 1
}
GET /v1/generations/:id
Response
{
"id": "uuid",
"status": "ready",
"durationSec": 3,
"downloadUrl": "https://...",
"createdAt": "2025-01-01T00:00:00Z",
"completedAt": "2025-01-01T00:00:05Z"
}
Status values: queued, running, enhancing, ready, failed.
Poll until status === "ready", then use the signed downloadUrl (valid 10 minutes).
POST /v1/voices/clone
Request body
{
"samplePaths": ["uploads/sample1.wav", "uploads/sample2.wav"]
}
Response 202 Accepted
{
"id": "uuid",
"status": "queued"
}
Requires Pro or Scale plan. Upload samples first using the Upload API.
Register HTTPS endpoints to receive event notifications.
| Event | Fired when |
|---|---|
generation.ready | A generation completes successfully |
generation.failed | A generation fails |
voice.cloned | A voice clone job completes |
Every delivery includes a X-Voiceproductionai-Signature header:
X-Voiceproductionai-Signature: sha256=<hmac-hex>
Verify with your endpoint's secret:
const crypto = require('crypto');
function verifySignature(body, secret, signatureHeader) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(body)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signatureHeader),
Buffer.from(expected)
);
}
{
"event": "generation.ready",
"timestamp": "2025-01-01T00:00:00.000Z",
"data": { ... }
}
| Plan | Limit |
|---|---|
| Scale | 60 requests / minute / workspace |
429 Too Many Requests with a retryAfter: 60 field.
| HTTP | Code | Meaning |
|---|---|---|
| 401 | unauthorized | Missing or invalid API key |
| 402 | insufficient_credits | Not enough credits |
| 403 | public_api_requires_scale | Scale plan required |
| 403 | cloning_requires_paid_plan | Pro/Scale required for cloning |
| 404 | not_found | Resource not found |
| 429 | rate_limit_exceeded | Rate limit hit |
{ "error": "error_code" }