---
title: "Create an asynchronous text-to-speech job"
method: POST
path: "/v2/tts/jobs"
tags: ["Text-to-Speech"]
---

# Create an asynchronous text-to-speech job

`POST /v2/tts/jobs`

## Request

- Base URL: `https://api.sync.so`
- URL: `https://api.sync.so/v2/tts/jobs`
- Auth: API key in header `x-api-key`

Accepts the same body as `POST /v2/tts`, persists a durable job, and returns immediately with the current job state. Available to authenticated user sessions; API-key admission requires organization rollout enablement. Poll `GET /v2/tts/jobs/{id}` until the status is terminal. Reusing the same `Idempotency-Key` with the same request returns the original job; using it with a different request returns 409.

## Headers

- `idempotency-key` string

## Request body

- CreateTtsDto
  - `script` string, required
  - `voiceId` string, required
  - `provider` 'elevenlabs', required
  - `stability` number
  - `similarityBoost` number

## Response `202`

- TtsJobDto
  - `id` string, uuid, required
  - `status` 'PENDING' | 'PROCESSING' | 'SUCCESS' | 'FAILED', required
  - `url` string, nullable, required
  - `duration` number, nullable, required
  - `error` object, nullable, required
    - `code` 'CREATE_FAILED' | 'PROVIDER_FAILED' | 'PROVIDER_TIMEOUT' | 'PROVIDER_RESULT_UNKNOWN' | 'UPLOAD_FAILED' | 'TIMEOUT' | 'UNKNOWN', required
    - `message` string, required
  - `createdAt` string, date-time, required
  - `startedAt` string, date-time, nullable, required
  - `finishedAt` string, date-time, nullable, required

## Other responses

- `400`: Invalid request body or header
- `402`: Free tier limit reached (free_tier_generations_exhausted with limit and used, or generation_plan_duration_exceeded with limitSeconds), insufficient_credits, account_payment_required or account_on_hold. billingUrl is the Studio page where a person can fix it.
- `409`: Idempotency key conflict
- `422`: Voice not found
- `503`: New generation admission may be paused (generation_admission_paused) or unavailable (generation_admission_unavailable); retry after Retry-After and retain the same idempotency key. API-key async admission may be disabled for the organization (async_tts_not_enabled); use POST /v2/tts or wait for rollout enablement.

## Changes

- **2026-10-30** `e93bb609962a`: 1 info
  - added the media type `application/json` for the response with the status `402`
- …earlier changes not shown

[Operation history](https://skmtc.dev/sync/apis/sync-api-v2/changes/v2/tts/jobs/post.md)

---

[API](https://skmtc.dev/sync/apis/sync-api-v2.md) - [All operations](https://skmtc.dev/sync/apis/sync-api-v2/llms.txt) - [OpenAPI document](https://skmtc.dev/sync/apis/sync-api-v2/revisions/26662c96c138?raw)
