Загрузить файл книги

Файл txt, docx, fb2, fb2.zip или epub — до 20 МБ.

POST /books/upload · озвучка

Из fb2 и epub берутся название, автор, аннотация, жанр, серия и обложка. Если в файле указана серия, книга сама встанет в цикл, а голоса героев придут из прошлых томов (carried — каких героев).

Тот же файл второй раз — ответ 409 со ссылкой на уже загруженную книгу; чтобы загрузить копию, добавьте поле copy=1.

Тело запроса

multipart/form-data.

Поле Тип Обязательно Что это
file файл да Файл книги
title строка нет Своё название вместо названия из файла
copy 1 нет Загрузить копией, даже если такой файл уже есть

Что в ответе

Поле Что это
id Id книги
title / author Название и автор
status ready — можно работать, importing — ещё разбирается, failed — ошибка разбора
series Цикл, в который встала книга, или null
carried Герои, получившие голоса из прошлых томов

Ошибки

Код Когда
400 Файл пустой, больше 20 МБ или в нём нет текста
409 Этот файл уже загружен: в detail.duplicate — книга
curl -X POST "https://golosar-kniga.tech/api/v1/books/upload" \
  -H "x-api-key: $KEY" \
  -F "file=@book.fb2"
import os, requests

API = "https://golosar-kniga.tech/api/v1"
H = {"x-api-key": os.environ["GOLOSAR_KEY"]}

r = requests.post(f"{API}/books/upload", headers=H, files={"file": open("book.fb2", "rb")})
r.raise_for_status()
print(r.json())
import { openAsBlob } from "node:fs";
const API = "https://golosar-kniga.tech/api/v1";
const H = { "x-api-key": process.env.GOLOSAR_KEY };

const form = new FormData();
form.append("file", await openAsBlob("book.fb2"), "book.fb2");
const r = await fetch(`${API}/books/upload`, { method: "POST", headers: H, body: form });
if (!r.ok) throw new Error(await r.text());
console.log(await r.json());

json Ответ 200 { "book": { "id": "01a134d0-dde5-71b2-ac7d-7ee878371d38", "title": "skazka", "author": "", "status": "ready", "created_at": "2026-10-13T10:31:05.942943+00:00", "language": "ru", "subtitle": "", "series": "", "series_no": "", "genre": "", "age_rating": "", "thoughts": "hero", "sound": "studio", "check": "auto", "reading": "roles", "cover_url": null, "active_edition_id": "01a134d0-ddf5-7a75-bf2c-56b5425f2377" }, "series": null, "carried": [] }