Skip to main content

Copyright Review

Copyright Review is the combined triage surface for vote candidates — tracks that users have voted on as either copyright-infringing (blocked votes) or safe (safe votes). Unlike Copyright Reports, which covers individual report submissions one-by-one, the Review page aggregates votes across users and surfaces only the high-signal candidates needing a decision.

Where to find it

Admin sidebar → Copyright Review (/copyright-review).

Quick start

  1. Open Admin → Copyright Review.
  2. The page is split into two lists: Blocked Candidates (songs with mostly block-votes) and Safe Candidates (songs with mostly safe-votes).
  3. For each candidate, read the song, artist, block-vote count (copyright votes), and safe-vote count (safe votes).
  4. Click Approve to accept the prevailing verdict and move the track into the blocked/safe catalog.
  5. Click Dismiss to reject the candidate without changing catalog state.

Detailed walkthrough

Two-column layout

The UI renders two panels side-by-side (or stacked on narrow screens):

  • Blocked Candidates — tracks where block-votes dominate. Approving marks the track copyright-blocked globally.
  • Safe Candidates — tracks where safe-votes dominate. Approving marks the track copyright-safe globally.

Each panel shows the per-track vote tally: N copyright votes, N safe votes.

Row actions

  • Approve — calls POST /api/copyright/reports/\{reportId\}/approve and removes the row from the queue.
  • Dismiss — calls POST /api/copyright/reports/\{reportId\}/dismiss and removes the row.

Both endpoints are the same as Copyright Reports / Copyright Recommendations; the Review page is a higher-signal view over the same dataset.

Empty state

When no candidates are pending: "No candidates to review."

Common scenarios

  • High-traffic triage session — blast through both columns, approving clear majorities and dismissing ambiguous ones.
  • Policy change — review the Safe Candidates column to validate community consensus before mass-approving a new genre's picks.
  • Suspected brigading — if a single track in Blocked Candidates has an absurd vote count coming from fresh accounts, dismiss and investigate via Abuse Reports.
  • Cross-check with external copyright sources — before approving a Blocked candidate, confirm the track is actually copyrighted (Spotify's own "Content ID Block" metadata is a decent heuristic).

Permissions

ActionPermission
View candidatescopyright:read
Approve / dismisscopyright:edit

Dashboard entry requires admin:access. System admins implicitly hold both.

API

UI actionGraphQLREST
List pending vote candidatesGET /v1/copyright/reports?status=pending
Approve a candidatePOST /v1/copyright/reports/\{id\}/approve
Dismiss a candidatePOST /v1/copyright/reports/\{id\}/dismiss
User-side vote submissionPOST /v1/copyright/vote
List of vote candidates (raw)GET /v1/copyright/vote-candidates
Approve raw vote candidatePOST /v1/copyright/vote-candidates/\{track_id\}/approve
Dismiss raw vote candidatePOST /v1/copyright/vote-candidates/\{track_id\}/dismiss

The admin page fetches /api/copyright/reports?status=pending (via Next.js proxy) and splits the returned rows into the Blocked / Safe columns based on the dominant vote category. Low-level vote-candidates endpoints exist for debugging and can be called directly.

Tips & gotchas

  • Approve is not reversible from the UI. Double-check the vote tally and confirm the correct panel (Blocked vs Safe) before clicking.
  • The page is community-moderation at its rawest — brigading and sockpuppet voting are possible. Spot-check confirmation counts and reporter identities via the underlying reports endpoint.
  • Approving a Safe candidate here is equivalent to approving a recommendation in Copyright Recommendations; the endpoints overlap.
  • This page surfaces only pending candidates. For historical review use the Copyright Reports page with a status filter.