To view this discussion visit https://groups.google.com/d/msgid/gcd-tech/132c920d6a2c28385cb17e378d301f3a%40jerviss.org.
GET /api/v2/covers/ List active cover scans
GET /api/v2/covers/{id}/ Cover scan detail
Resource semantics: Each API record maps one-to-one to an active Cover row and therefore to one owning Issue. A series does not have a separate cover entity; series covers are retrieved with the series filter. Variant covers are ordinary Cover rows owned by variant Issue rows.
Fields: id, issue (id, series id + name, descriptor, variant_of, variant_name, variant_cover_status), images (thumbnail_url, medium_url, large_url), is_wraparound, display_restricted, front_crop (detail only), created, modified, last_upload.
Filters: issue, series, publisher, variant_of, is_variant, variant_cover_status, is_wraparound, modified (range), created (range), last_upload (range).
Variant behavior: issue=<id> returns scans directly owned by that exact issue. It does not silently substitute the base issue's scan for a No Difference variant. The Issue endpoint remains the source for the effective display cover and may inherit the base cover when variant_cover_status is No Difference.
Image policy: List responses expose the identification thumbnail only. Detail responses expose all permitted generated sizes. When limit_display is true, thumbnail_url remains available while medium_url and large_url are null. Original uploads and replacement-history files are never exposed. The existing Issue cover_url behavior must be brought into alignment with this restriction.
Reprint boundary: Cover scans are not directly related to Story or Reprint rows. Cover-art reuse remains represented by cover stories and Reprint relationships. Phase 4A adds origin_story_type and target_story_type filters to /api/v2/reprints/ so clients can discover cover-to-cover and cover-to-interior reprints without assigning an inferred reprint relationship to a particular scan.
Performance and validation: Cover list/detail endpoints receive serializer, filter, view, soft-delete, conditional-request, and fixed-query-count tests. Query plans must be validated against a cover-populated beta or production-like dataset before adding any performance index; the current local production copy omits Cover rows. Any migration must be justified by measured EXPLAIN evidence rather than added speculatively.