REST API

JSON API at /api/v1 covering the same features as this site, for a mobile app or other clients. Full markdown: /api/docs. Machine catalog: GET /api.

Authentication

Every /api/v1/… route except the catalog requires an API key. Create and revoke keys on Settings (admin login). The token is shown once.

Authorization: Bearer gmk_…
X-Api-Key: gmk_…

Scopes: read for GET (analytics, library, lookups, review, status, settings). write for POST/PUT/DELETE (edits, review actions, jobs, settings, key management). A write key always includes read.

Shared query parameters

Analytics endpoints accept the same filters as the website:

  • range7d, 30d (default), 90d, 1y, all, custom
  • from / to — ISO dates when range=custom
  • q — artist / track / album search (names and aliases)
  • take — list size (default 50, max 500 on most lists)
WebsiteAPIScope
OverviewGET /api/v1/overviewread
TopsGET /api/v1/tops/{artists|tracks|albums}read
GenresGET /api/v1/tags and GET /api/v1/tags/{name}read
AudioGET /api/v1/audio, pending + PUT audio-profileread / write
DiscoveryGET /api/v1/discoveryread
PatternsGET /api/v1/patternsread
Deep cutsGET /api/v1/deep-cuts?n=10read
SessionsGET /api/v1/sessions?gap=30read
WrappedGET /api/v1/wrapped/{year} and …/htmlread
Artist / trackGET /api/v1/artists/{id}, GET /api/v1/tracks/{id}read
Recent playsGET /api/v1/scrobblesread
LibraryGET /api/v1/library, PUT /api/v1/library/{id}read / write
Fetch MBIDPOST /api/v1/tracks/{id}/enrichwrite
LookupsGET /api/v1/lookups, POST …/lookups/{id}/retryread / write
ReviewGET /api/v1/review, accept / not-found / retryread / write
ProgressGET /api/v1/statusread
JobsPOST /api/v1/jobs/{sync|backfill|pause|resume|retry-lookups|seed}write
SettingsGET/PUT /api/v1/settingsread / write
API keysGET/POST /api/v1/keys, DELETE /api/v1/keys/{id}read / write

Example

curl -H "Authorization: Bearer gmk_…" http://localhost:5107/api/v1/overview?range=30d
curl -H "Authorization: Bearer gmk_…" http://localhost:5107/api/v1/me

JSON uses camelCase. Enums are strings. Errors look like {"error":"…"}. 401 missing/invalid key, 403 wrong scope, 404 unknown id.