---
title: "Create an audiobook (narrator and cast)"
method: POST
path: "/api/v1/audiobooks"
tags: ["Public API v1"]
---

# Create an audiobook (narrator and cast)

`POST /api/v1/audiobooks`

## Request

- Base URL: `https://api.vieneu.io`
- URL: `https://api.vieneu.io/api/v1/audiobooks`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Creates a draft book. Add chapters with POST /v1/audiobooks/{bookId}/chapters, then start it. Voices are catalogue voices of the default engine (cloned voices are not supported for audiobooks yet). LIVE keys only. Nothing is billed until chapters render.

## Request body

- CreateAudiobookDto
  - `title` string, required
  - `author` string
  - `narratorVoice` string, required: The narrator: reads titles and every segment without a character.
  - `cast` AudiobookCastEntryDto[]: Character voices (up to 30). More can be added with each chapter.
    - `speaker` string, required: A character name, as used in `segments[].speaker`.
    - `voiceId` string, required: Voice id from GET /v1/voices (engine of the book; not a cloned voice).
  - `applyPronunciation` boolean: Read the book through your account's pronunciation dictionary — the rules saved at https://vieneu.io/#/pronunciation (Từ điển phát âm), as they stand when each chapter renders. Defaults to true and changes nothing until you have saved rules. Billing stays on the script as written. A chapter the rules make longer than the chapter limit, or more than twice as long plus 1,000 characters, fails with the reason instead of being cut. Set false to read the script as written.

## Response `201`

The draft book.

- AudiobookResponseDto
  - `id` string, required
  - `title` string, required
  - `author` string, nullable, required
  - `status` 'draft' | 'queued' | 'rendering' | 'completed' | 'partial' | 'failed' | 'cancelled', required
  - `narratorVoice` string, required
  - `cast` AudiobookCastEntryDto[], required
    - `speaker` string, required: A character name, as used in `segments[].speaker`.
    - `voiceId` string, required: Voice id from GET /v1/voices (engine of the book; not a cloned voice).
  - `waitingReason` string, nullable, required: gpu_busy: books render only while the GPU fleet is idle; quota: the plan hit a limit, retried automatically; queue_full.
  - `error` string, nullable, required
  - `totals` AudiobookTotalsDto, required
    - `chapters` number, required
    - `completedChapters` number, required
    - `characters` number, required
    - `estimatedTokens` number, required: Tokens the chapters not yet rendered will cost.
    - `tokensCharged` number, required
    - `durationSeconds` number, required
  - `otherBooksWaiting` number, nullable, required: While started: how many other books are waiting too. Books take turns, a chapter each.
  - `chapterCharsMax` number, required: The longest chapter (in characters) the plan behind this key can render: a chapter is billed in one go, so it must fit the plan's daily or weekly token cap. 60,000 when the plan has no tighter cap.
  - `chapters` AudiobookChapterResponseDto[], required
    - `index` number, required
    - `title` string, required
    - `status` 'pending' | 'rendering' | 'rendered' | 'mastering' | 'completed' | 'failed' | 'cancelled', required
    - `characters` number, required
    - `segments` number, required
    - `tokenCost` number, nullable, required
    - `progress` AudiobookChapterProgressDto, required
      - `done` number, required
      - `total` number, nullable, required
    - `durationSeconds` number, nullable, required
    - `audioUrl` string, nullable, required: Presigned link (24 h) once completed.
    - `audioFormat` string, nullable, required: mp3 (wav only if mastering failed).
    - `error` string, nullable, required
  - `createdAt` string, date-time, required
  - `completedAt` string, date-time, nullable, required

## Other responses

- `400`: Unknown voice, too many characters, invalid body.
- `401`: API key missing, malformed, or revoked.

## Changes

- **2026-11-04** `9518b716e16d`: 1 info
  - added the new optional request property `applyPronunciation`
- **2026-10-10** `8e42136d02f3`: 1 info
  - added the required property `chapterCharsMax` to the response with the `201` status
- **2026-10-01** `17d7990f256f`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/vieneu/apis/vieneu-api/changes/api/v1/audiobooks/post.md)

---

[API](https://skmtc.dev/vieneu/apis/vieneu-api.md) - [All operations](https://skmtc.dev/vieneu/apis/vieneu-api/llms.txt) - [OpenAPI document](https://skmtc.dev/vieneu/apis/vieneu-api/revisions/9518b716e16d?raw)
