---
title: "Start (or resume) rendering a book"
method: POST
path: "/api/v1/audiobooks/{bookId}/start"
tags: ["Public API v1"]
---

# Start (or resume) rendering a book

`POST /api/v1/audiobooks/{bookId}/start`

## Request

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

Queues every pending or failed chapter. Each chapter is billed in full to ONE plan — this key’s own when it can, otherwise another active plan of the account — so it is refused with 402 `insufficient_tokens` when the plans hold too little for the chapters in total, or when some chapter would find no plan able to pay it when its turn comes. Chapters then render one at a time, only while the GPU fleet is idle, each billed when it starts and refunded if it fails.

## Path parameters

- `bookId` string, required

## Response `200`

The book, queued.

- 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

- `401`: API key missing, malformed, or revoked.
- `402`: Not enough tokens for the chapters to render. For the total, `required` is the book’s estimate and `remaining` what the plans hold together; for one chapter, the message names it, `required` is its estimate and `remaining` the most any one plan would have left when its turn came.

## Changes

- **2026-10-10** `8e42136d02f3`: 1 info
  - added the required property `chapterCharsMax` to the response with the `200` status
- **2026-10-01** `17d7990f256f`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/vieneu/apis/vieneu-api/changes/api/v1/audiobooks/:bookId/start/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)
