Files
bookhoard/docs/developer/api/libraries/scan_library.md
T
John O'Keefe 0f1d0abbb0 feat(libraries): scope a library scan to one registered folder
POST /api/libraries/:id/scan accepts an optional {"folder_path": "..."}:
the scan then covers exactly that one registered folder's subtree instead
of the whole library. The path is validated against the library's
registered folders — anything else is a 400, never trusted. An omitted
body keeps today's full-library behavior, and coalescing (409 with the
active job) is unchanged.

The LibraryPanel folder rows get a per-folder Scan button: pure htmx
attributes posting to the same scan endpoint, with hxValsFolderScan
emitting plain eval-free JSON for hx-vals alongside the existing
hxValsFolderDelete precedent. Progress surfaces through the existing
active-scan polling; no new client code.

Safety: the scanner's archive-reconciliation guard (previous commit)
skips partially-covered libraries, so a one-folder scan cannot mark the
library's other folders' items missing.
2026-10-27 13:22:41 -04:00

1.7 KiB

method, path, auth, area
method path auth area
POST /api/libraries/:id/scan jwt+admin libraries

Scan Library

Enqueues a scan of one library's configured folders. The library id comes from the path — no request body is needed (the generic POST /api/scanner/scan variant is the one that takes folder_paths).

Per-folder scope: an optional body of {"folder_path": "…"} restricts the scan to ONE of the library's registered folders (the per-folder Scan buttons in the library panel). The path must be a registered folder — anything else is a 400. A scoped scan never runs archive reconciliation for the library's other folders, so items outside the scanned folder cannot be marked missing by it.

Scans are coalesced: if a scan for this library is already pending or running you get 409 with the active job id instead of a second scan.

Example response (202 Accepted)

{
  "message": "scan job enqueued",
  "job_id": "dd0e8400-e29b-41d4-a716-446655440000",
  "status": "pending"
}

Errors

Status Body When
400 {"error": "invalid library id"} / {"error": "library has no folders configured"} / {"error": "folder_path is not one of this library's registered folders"} malformed id / empty library / unregistered folder scope
404 {"error": "library not found or has no folders"} unknown library
409 {"error": "a scan for this library is already pending or running", "active_job_id": "..."} scan coalescing
500 {"error": "failed to enqueue scan job: ..."} queue failure