Description
After the Spotify Web API migration on March 9, 2026, all Development Mode apps lost access to the deprecated /playlists/{id}/tracks endpoint. cliamp is still using this old endpoint, which now returns 403 Forbidden for all playlist track requests.
Error
ERR: provider Spotify: tracks: spotify: list tracks: http status 403 Forbidden: {"error": {"status": 403, "message": "Forbidden" } }
Root Cause
Spotify's February 2026 Dev Mode migration renamed the playlist track endpoints:
| Removed endpoint |
Replacement |
GET /playlists/{id}/tracks |
GET /playlists/{id}/items |
POST /playlists/{id}/tracks |
POST /playlists/{id}/items |
DELETE /playlists/{id}/tracks |
DELETE /playlists/{id}/items |
PUT /playlists/{id}/tracks |
PUT /playlists/{id}/items |
The response body also renames tracks → items and tracks.track → items.item.
Verified
I confirmed this by testing both endpoints with a valid token against the same playlist:
GET /v1/playlists/{id}/tracks → 403 Forbidden
GET /v1/playlists/{id}/items → 200 OK (returns tracks correctly)
Environment
- cliamp v1.17.9 (latest)
- Linux amd64
- Spotify Premium account
- App in Development Mode with Web API enabled, user added to allowlist
Fix
Update the Spotify provider to use /playlists/{id}/items instead of /playlists/{id}/tracks, and handle the field rename (tracks → items, track → item) in the response parsing.
See: https://developer.spotify.com/documentation/web-api/tutorials/february-2026-migration-guide#playlist-endpoint-renames
Description
After the Spotify Web API migration on March 9, 2026, all Development Mode apps lost access to the deprecated
/playlists/{id}/tracksendpoint. cliamp is still using this old endpoint, which now returns 403 Forbidden for all playlist track requests.Error
Root Cause
Spotify's February 2026 Dev Mode migration renamed the playlist track endpoints:
GET /playlists/{id}/tracksGET /playlists/{id}/itemsPOST /playlists/{id}/tracksPOST /playlists/{id}/itemsDELETE /playlists/{id}/tracksDELETE /playlists/{id}/itemsPUT /playlists/{id}/tracksPUT /playlists/{id}/itemsThe response body also renames
tracks→itemsandtracks.track→items.item.Verified
I confirmed this by testing both endpoints with a valid token against the same playlist:
GET /v1/playlists/{id}/tracks→ 403 ForbiddenGET /v1/playlists/{id}/items→ 200 OK (returns tracks correctly)Environment
Fix
Update the Spotify provider to use
/playlists/{id}/itemsinstead of/playlists/{id}/tracks, and handle the field rename (tracks→items,track→item) in the response parsing.See: https://developer.spotify.com/documentation/web-api/tutorials/february-2026-migration-guide#playlist-endpoint-renames