releases
Raw release feed and review queue
📄️ List releases ordered by `observed_at` descending. Filters compose.
List releases ordered by `observed_at` descending. Filters compose.
📄️ Resolve a link request into the concrete `series.id` it targets, shared by the single-release [`link`] handler and the [`bulk_link`] action. The `posted_at` anchor is only consulted on the provider path, where it seeds the freshly-upserted series' first-seen timestamp; callers pass the release's own `posted_at` (single link) or the anchor release's (bulk). Bulk-link a set of review-queue releases to one series. The body's `ids` (intersected with the queue statuses) select the releases; the series is named exactly as in the single-release [`link`] handler. Each release is linked individually (clearing its candidates and bumping the series' highest volume/chapter marks) so the result matches what N single links would produce. The operator is responsible for the selection being one series' releases; the endpoint links them blindly to the chosen target.
Resolve a link request into the concrete `series.id` it targets, shared by
📄️ Bulk-reject a set of review-queue releases. The body's `ids` (or, when empty, the filter fields) select the target set; every matched release is pinned to `rejected` and its candidates dropped in one set-based update.
Bulk-reject a set of review-queue releases. The body's `ids` (or, when
📄️ Bulk-retry a set of review-queue releases. The body's `ids` (or, when empty, the filter fields) select the target set (capped at the per-batch limit). Spawns a background batch under the shared retry-all lock and returns immediately; a concurrent retry-all / bulk-retry reports `skipped: true`. An empty match set is reported as `triggered: false` with `matched: 0` (no batch spawned, nothing skipped).
Bulk-retry a set of review-queue releases. The body's `ids` (or, when
📄️ Re-run the resolver against every release currently visible in the review queue (`unresolved`, `ambiguous`, `review_pending`). With `?includeResolved=true`, also walks `resolved` rows (skipping manually-linked ones). Spawns a background task and returns immediately so the request doesn't block on what can be a multi- minute walk. A dedicated per-process lock prevents a second click from spawning a parallel walk; in that case the response is `{ triggered: false, skipped: true }`.
Re-run the resolver against every release currently visible in the
📄️ Review queue: releases awaiting human attention.
Returns releases whose status is `unresolved`, `ambiguous`, or
📄️ Grouped review queue: clusters of releases sharing a cleaned search query.
Honors the same `q` / `sourceName` / `format` / `status` filters as the
📄️ Mark a release as a worthwhile standalone item that is not (and will never be) a tracked series: a guidebook, an artbook, a one-shot. Drops candidates and pins the status to `standalone` so the resolver leaves it alone; unlike `rejected`, these stay browsable in the 'Kept' view. Re-run `retry` to pull one back into the resolution pipeline.
Mark a release as a worthwhile standalone item that is not (and will
📄️ Manually link a release to a series. Body shape:
- `{ 'seriesId': 42 }` — link to an existing series row by internal id.
📄️ Mark a release as 'not a series we care about'. Drops candidates and pins the resolution status to `rejected` so the resolver leaves it alone on subsequent runs.
Mark a release as 'not a series we care about'. Drops candidates and
📄️ Re-run the resolver against a single release. Useful after a provider refresh, a config change, or a manual edit.
Re-run the resolver against a single release. Useful after a provider