---
title: "Cancel a book"
method: POST
path: "/api/v1/audiobooks/{bookId}/cancel"
tags: ["Public API v1"]
---

# Cancel a book

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

## Request

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

Chapters not started are dropped and never billed; a chapter already rendering finishes and is kept.

## Path parameters

- `bookId` string, required

## Response `200`

The cancelled 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

- `401`: API key missing, malformed, or revoked.

## 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/cancel/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)
