Voice Production AI Public API

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


Authentication

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.


Voices

List voices

GET /v1/voices

Returns all voices available to your workspace (presets + cloned).

Response
{
  "items": [
    {
      "id": "uuid",
      "name": "Emma",
      "kind": "preset",
      "language": "en",
      ...
    }
  ]
}

Generations

Create a generation

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 generation status

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).


Voice Cloning

Clone a voice

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.


Webhooks

Register HTTPS endpoints to receive event notifications.

Events

EventFired when
generation.readyA generation completes successfully
generation.failedA generation fails
voice.clonedA voice clone job completes

Verifying webhook signatures

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)
);
}

Payload envelope

{
  "event": "generation.ready",
  "timestamp": "2025-01-01T00:00:00.000Z",
  "data": { ... }
}

Rate limits

PlanLimit
Scale60 requests / minute / workspace
When exceeded, the API returns 429 Too Many Requests with a retryAfter: 60 field.

Error codes

HTTPCodeMeaning
401unauthorizedMissing or invalid API key
402insufficient_creditsNot enough credits
403public_api_requires_scaleScale plan required
403cloning_requires_paid_planPro/Scale required for cloning
404not_foundResource not found
429rate_limit_exceededRate limit hit
All error responses follow the shape:
{ "error": "error_code" }