14 KiB
Spotizerr API Documentation
A comprehensive music download service API built with FastAPI that supports Spotify content downloading, playlist/artist watching, and user authentication.
🚀 Base URL
http://localhost:7171/api
🔐 Authentication
Authentication System
- Type: JWT-based authentication with optional SSO (Google/GitHub)
- Token: Bearer token in Authorization header
- When Disabled: System user with admin privileges automatically applied
Auth Status
Check authentication configuration and current user status.
GET /auth/status
Response:
{
"auth_enabled": true,
"authenticated": false,
"user": null,
"registration_enabled": true,
"sso_enabled": true,
"sso_providers": ["google", "github"]
}
Login & Registration
POST /auth/login
Request:
{
"username": "string",
"password": "string"
}
Response:
{
"access_token": "jwt-token",
"token_type": "bearer",
"user": {
"username": "string",
"email": "string",
"role": "user|admin",
"created_at": "2024-01-01T00:00:00",
"last_login": "2024-01-01T00:00:00",
"sso_provider": null,
"is_sso_user": false
}
}
POST /auth/register
Request:
{
"username": "string",
"password": "string",
"email": "string"
}
POST /auth/logout
Logs out the current user.
User Management (Admin Only)
GET /auth/users
List all users.
POST /auth/users/create
Request:
{
"username": "string",
"password": "string",
"email": "string",
"role": "user|admin"
}
DELETE /auth/users/{username}
Delete a user.
PUT /auth/users/{username}/role
Request:
{
"role": "user|admin"
}
PUT /auth/users/{username}/password
Admin password reset. Request:
{
"new_password": "string"
}
Profile Management
GET /auth/profile
Get current user profile.
PUT /auth/profile/password
Change own password. Request:
{
"current_password": "string",
"new_password": "string"
}
SSO Authentication
GET /auth/sso/status
Get SSO configuration and available providers.
GET /auth/sso/login/google
Redirect to Google OAuth.
GET /auth/sso/login/github
Redirect to GitHub OAuth.
GET /auth/sso/callback/google
Google OAuth callback.
GET /auth/sso/callback/github
GitHub OAuth callback.
POST /auth/sso/unlink/{provider}
Unlink SSO provider from account.
🎵 Content Download Endpoints
Track Downloads
GET /track/download/{track_id}
Download a single track. Response:
{
"task_id": "uuid"
}
Status Code: 202 (Accepted)
GET /track/download/cancel
Query Parameters:
task_id: Task ID to cancel
GET /track/info
Get track metadata. Query Parameters:
id: Spotify track ID
Response:
{
"id": "string",
"name": "string",
"artists": [{"name": "string"}],
"album": {"name": "string"},
"duration_ms": 180000,
"explicit": false,
"external_urls": {"spotify": "url"}
}
Album Downloads
GET /album/download/{album_id}
Download an entire album. Response:
{
"task_id": "uuid"
}
GET /album/download/cancel
Query Parameters:
task_id: Task ID to cancel
GET /album/info
Get album metadata. Query Parameters:
id: Spotify album IDlimit: Tracks page size (optional)offset: Tracks page offset (optional)
Playlist Downloads
GET /playlist/download/{playlist_id}
Download an entire playlist. Response:
{
"task_id": "uuid"
}
GET /playlist/download/cancel
Query Parameters:
task_id: Task ID to cancel
GET /playlist/info
Get playlist metadata. Query Parameters:
id: Spotify playlist IDinclude_tracks: true to include tracks (default: false)
GET /playlist/metadata
Get detailed playlist metadata including tracks. Query Parameters:
id: Spotify playlist ID
GET /playlist/tracks
Get playlist tracks. Query Parameters:
id: Spotify playlist ID
Artist Downloads
GET /artist/download/{artist_id}
Download artist's discography. Query Parameters:
album_type: Comma-separated values (album,single,compilation,appears_on)
Response:
{
"status": "complete",
"message": "Artist discography processing initiated. X albums queued.",
"queued_albums": ["task_id1", "task_id2"],
"duplicate_albums": ["existing_task_id"]
}
GET /artist/info
Get artist metadata. Query Parameters:
id: Spotify artist IDlimit: Albums page size (default: 10, min: 1)offset: Albums page offset (default: 0, min: 0)
📺 Watch Functionality
Monitor playlists and artists for new content and automatically download updates.
Playlist Watching
PUT /playlist/watch/{playlist_spotify_id}
Add playlist to watch list. Request:
{
"watch_new_additions": true,
"download_existing": false
}
GET /playlist/watch/{playlist_spotify_id}/status
Get playlist watch status.
DELETE /playlist/watch/{playlist_spotify_id}
Remove playlist from watch list.
POST /playlist/watch/{playlist_spotify_id}/tracks
Add specific tracks to watch for a playlist. Request:
{
"track_ids": ["track_id1", "track_id2"]
}
DELETE /playlist/watch/{playlist_spotify_id}/tracks
Remove specific tracks from watch. Request:
{
"track_ids": ["track_id1", "track_id2"]
}
GET /playlist/watch/list
List all watched playlists.
POST /playlist/watch/trigger_check
Manually trigger watch check for all playlists.
POST /playlist/watch/trigger_check/{playlist_spotify_id}
Manually trigger watch check for specific playlist.
Artist Watching
PUT /artist/watch/{artist_spotify_id}
Add artist to watch list. Request:
{
"watch_new_releases": true,
"album_types": ["album", "single"]
}
GET /artist/watch/{artist_spotify_id}/status
Get artist watch status.
DELETE /artist/watch/{artist_spotify_id}
Remove artist from watch list.
POST /artist/watch/{artist_spotify_id}/albums
Add specific albums to watch for an artist. Request:
{
"album_ids": ["album_id1", "album_id2"]
}
DELETE /artist/watch/{artist_spotify_id}/albums
Remove specific albums from watch.
GET /artist/watch/list
List all watched artists.
POST /artist/watch/trigger_check
Manually trigger watch check for all artists.
POST /artist/watch/trigger_check/{artist_spotify_id}
Manually trigger watch check for specific artist.
🔍 Search
GET /search/
Search Spotify content. Query Parameters:
q: Search query (required)search_typeortype: Content type (track,album,artist,playlist,episode,show)limit: Results limit (default: 20)main: Account context
Response:
{
"items": [
{
"id": "string",
"name": "string",
"type": "track",
"artists": [{"name": "string"}],
"external_urls": {"spotify": "url"}
}
]
}
📊 Progress & Task Management
Task Monitoring
GET /prgs/list
List tasks with pagination. Query Parameters:
page: Page number (default: 1)limit: Items per page (default: 50, max: 100)active_only: If true, only return active tasks
GET /prgs/{task_id}
Get specific task details and progress.
GET /prgs/updates
Get task updates since last check. Query Parameters:
since: Unix timestamp (required for delta updates). If omitted, returns a paginated snapshot.page: Page number for non-active tasks (default: 1)limit: Items per page for non-active tasks (default: 20, max: 100)active_only: If true, only return active tasks
GET /prgs/stream
Server-Sent Events (SSE) endpoint for real-time progress updates. Response: Continuous stream of task updates.
Task Control
POST /prgs/cancel/{task_id}
Cancel a specific task.
POST /prgs/cancel/all
Cancel all running tasks.
DELETE /prgs/delete/{task_id}
Delete completed/failed task from history.
📜 Download History
History Retrieval
GET /history/
Get download history with pagination. Query Parameters:
limit: Max records (default: 100, max: 500)offset: Records to skip (default: 0)download_type: Filter by type (track,album,playlist)status: Filter by status (completed,failed,skipped,in_progress)
Response:
{
"downloads": [
{
"task_id": "uuid",
"download_type": "track",
"url": "spotify_url",
"name": "Track Name",
"artist": "Artist Name",
"status": "completed",
"created_at": "2024-01-01T00:00:00",
"completed_at": "2024-01-01T00:05:00",
"file_path": "/path/to/file.mp3"
}
],
"pagination": {
"limit": 100,
"offset": 0,
"returned_count": 50
}
}
GET /history/{task_id}
Get specific download history entry.
GET /history/{task_id}/children
Get child tasks (for album/playlist downloads).
GET /history/stats
Get download statistics.
GET /history/search
Search download history. Query Parameters:
q: Search query (required)limit: Max results (default: 50, max: 200)
GET /history/recent
Get recent downloads. Query Parameters:
limit: Max results (default: 20, max: 100)
GET /history/failed
Get failed downloads.
POST /history/cleanup
Clean up old history entries. Request:
{
"days_old": 30
}
⚙️ System Configuration
Configuration Management
GET /config/
Get current system configuration.
POST /config/ / PUT /config/
Update system configuration. Request:
{
"maxConcurrentDownloads": 3,
"service": "spotify",
"fallback": true,
"spotifyQuality": "high",
"deezerQuality": "flac",
"realTime": true,
"downloadPath": "/downloads",
"fileFormat": "mp3"
}
GET /config/check
Validate current configuration.
POST /config/validate
Validate provided configuration.
Watch Configuration
GET /config/watch
Get watch system configuration.
POST /config/watch / PUT /config/watch
Update watch configuration. Request:
{
"enabled": true,
"check_interval": 3600,
"max_concurrent_checks": 2,
"retry_failed_after": 1800
}
POST /config/watch/validate
Validate watch configuration.
🔑 Credentials Management
Service Credentials
GET /credentials/{service}
List credentials for service (spotify or deezer).
GET /credentials/{service}/{name}
Get specific credential set.
POST /credentials/{service}/{name}
Create new credential set. Request:
{
"client_id": "string",
"client_secret": "string"
}
PUT /credentials/{service}/{name}
Update credential set.
DELETE /credentials/{service}/{name}
Delete credential set.
GET /credentials/all/{service}
Get all credentials for service.
Spotify API Configuration
GET /credentials/spotify_api_config
Get Spotify API configuration.
PUT /credentials/spotify_api_config
Update Spotify API configuration.
GET /credentials/markets
Get available Spotify markets.
🚨 Error Handling
HTTP Status Codes
- 200: Success
- 202: Accepted (async operations)
- 400: Bad Request (validation errors)
- 401: Unauthorized (auth required)
- 403: Forbidden (insufficient permissions)
- 404: Not Found
- 409: Conflict (duplicate downloads)
- 500: Internal Server Error
Error Response Format
{
"error": "Error description",
"details": "Additional details",
"traceback": "Stack trace (dev mode)"
}
Common Error Scenarios
- Duplicate Downloads: 409 status with existing task ID
- Missing Spotify Metadata: 404 when track/album/playlist not found
- Invalid Credentials: Authentication errors when service credentials are wrong
- Rate Limiting: Temporary failures when hitting Spotify API limits
💡 Usage Examples
Download a Track
curl -X GET "http://localhost:7171/api/track/download/4iV5W9uYEdYUVa79Axb7Rh" \
-H "Authorization: Bearer your-jwt-token"
Search for Music
curl -X GET "http://localhost:7171/api/search/?q=bohemian%20rhapsody&search_type=track" \
-H "Authorization: Bearer your-jwt-token"
Monitor Progress with SSE
const eventSource = new EventSource('/api/prgs/stream');
eventSource.onmessage = function(event) {
const data = JSON.parse(event.data);
console.log('Progress update:', data);
};
Add Playlist to Watch
curl -X PUT "http://localhost:7171/api/playlist/watch/37i9dQZF1DXcBWIGoYBM5M" \
-H "Authorization: Bearer your-jwt-token" \
-H "Content-Type: application/json" \
-d '{"watch_new_additions": true, "download_existing": false}'
🔧 Development Notes
Authentication Middleware
- Routes are protected by
require_auth_from_statedependency - Admin routes use
require_admin_from_statedependency - When auth is disabled, system returns mock admin user
Task System
- All downloads are async using Celery
- Progress tracked via Redis
- Real-time updates via SSE
- Task cancellation supported
File Structure
- Downloads stored in configurable directory
- Metadata stored in JSON files
- History persisted in database
Rate Limiting
- Spotify API rate limits respected
- Concurrent download limits configurable
- Retry logic for failed requests
This documentation covers all endpoints discovered in the Spotizerr routes directory. The API is designed for high-throughput music downloading with comprehensive monitoring and management capabilities.