Files
bookhoard/docs/developer/api/collections/bulk_assign.md
T
John O'Keefe 18084de7a6 docs(book-matching,collections): Beam batch 10 — 15 endpoints
WO3 sync internals resolved: the book-matching docs ARE the sync surface
(books/query, link-book, bulk/auto-link, unlinked-books, suggestions,
file-alias CRUD) + collections rule/test/bulk-assign/shelf-mapping
surface.

Dedupe resolved (Claude call): search_books.md declared
GET /api/books/match but its BODY documents POST /api/sync/books/query —
both routes exist and are distinct (query-param device protocol vs JSON
body plugin protocol). Repointed search_books.md frontmatter to the POST
route; get_book_matches.md keeps the GET.

Claude registry: 15 entries (one pre-existing link-book entry deduped).
Drift fixed by gate: auto-link request {confidence_threshold, limit} not
{device_id, threshold}; bulk-link link objects {unlinked_book_id,
media_item_id, confidence_score} not {device_id, book_id, ...};
responses {results,total,successful,failed}/{auto_linked,results}; added
missing example-responses (bare delete, remove-rule is_smart-after
semantics, bulk-assign per-book results). make test 9/9.
2026-10-24 17:59:27 -04:00

1.8 KiB

method, path, auth, area
method path auth area
POST /api/collections/:id/books jwt collections

Bulk Assign Books

Add multiple books to a collection at once.

Endpoint: POST /api/collections/{id}/books Auth: Required Content-Type: application/json

Path Parameters

Parameter Type Required Description
id string (UUID) Yes Collection UUID

Request Body

Field Type Required Description
book_ids array of UUID Yes Array of book IDs to add

Example Request

{
  "book_ids": [
    "660e8400-e29b-41d4-a716-446655440000",
    "770e8400-e29b-41d4-a716-446655440000",
    "880e8400-e29b-41d4-a716-446655440000"
  ]
}

Response (204 No Content)

Books added to collection successfully. No response body.

Notes

  • Books already in the collection are ignored
  • This is more efficient than adding books individually
  • Maximum 1000 books per request
{
  "results": [
    {
      "book_id": "660e8400-e29b-41d4-a716-446655440001",
      "status": "added"
    }
  ],
  "total": 1
}

Each result carries the operation outcome for one book (added/error variants come from the per-book loop; malformed ids report their own status instead of failing the batch).

Error Responses

Code Description
400 Invalid request (validation failed)
401 Authentication required
404 Collection or book(s) not found
500 Internal server error

Try It Out