Read Lists organize individual books in a defined sequence. They are useful for:
Crossover events spanning multiple series
Recommended reading orders for complex universes
Personal “to-read” queues
Curated book-club selections
For series-level grouping, use Collections. Generated operations return { data, error, request, response }; pass flat parameters first and { client } second. Creating, updating, and deleting a read list requires the ADMIN role.
Use ordered: true for a sequence where next/previous navigation matters. Use ordered: false for a thematic grouping where the server does not need to preserve a reading order.
The path parameter is named id. The returned page preserves the read-list order; unpaged: true is useful when progress or export code needs every book:
import { getBooksByReadListId } from 'komga-sdk';const result = await getBooksByReadListId( { id: 'readlist-123', page: 0, size: 50 }, { client },);for (const book of result.data?.content ?? []) { console.log(`${book.metadata.title} (${book.metadata.number})`);}
matchComicRackList accepts the uploaded .cbl file directly. The result contains one request entry per requested book and its candidate matches; inspect these before creating a list:
import { matchComicRackList } from 'komga-sdk';const file = new File([cblBlob], 'reading-order.cbl', { type: 'text/xml' });const result = await matchComicRackList({ file }, { client });if (result.data) { for (const request of result.data.requests) { const bestMatch = request.matches[0]; console.log(`${request.request.series.join(', ')} #${request.request.number}: ${bestMatch?.books.length ?? 0} matches`); }}
A missing or ambiguous match is not a successful book selection. Resolve those entries in the UI or by a follow-up search before sending bookIds to createReadList.
At a boundary the server may return no book. Check error first; only treat an undefined data value as “end” or “beginning” when the request itself succeeded: