A Python SDK for the Spotify Web API.
Project description
Spotify SDK for Python
A Python SDK for the Spotify Web API.
Full documentation is available at spotify-sdk.dev.
[!NOTE] This is an independent, community-developed library and is not affiliated with or endorsed by Spotify.
Features
- Type-safe: Full type hints with Pydantic models for all API responses
- Sync and async: Dedicated
SpotifyClientandAsyncSpotifyClientclasses - Automatic retries: Exponential backoff with jitter for rate limits and transient errors
- Context managers: Clean resource management with
withandasync withsupport
Installation
pip install spotify-sdk
Or with uv:
uv add spotify-sdk
Requirements
- Python 3.10+
Python version support follows the official Python release cycle. We support all versions that have not reached end-of-life.
Authentication
The SDK currently supports access token authentication. You'll need to obtain an access token through Spotify's authorization flows before using the SDK.
client = SpotifyClient(access_token="your-access-token")
Additional authentication methods are planned for future releases.
Quick Start
from spotify_sdk import SpotifyClient
client = SpotifyClient(access_token="your-access-token")
# Get an album
album = client.albums.get("5K79FLRUCSysQnVESLcTdb")
print(f"{album.name} by {album.artists[0].name}")
# Output: "DeBÍ TiRAR MáS FOToS by Bad Bunny"
# Get album tracks
tracks = client.albums.get_tracks(album.id)
for track in tracks.items:
print(f"{track.track_number}. {track.name}")
client.close()
Using Context Managers
from spotify_sdk import SpotifyClient
with SpotifyClient(access_token="your-access-token") as client:
album = client.albums.get("4aawyAB9vmqN3uQ7FjRGTy")
print(album.name)
Async Support
import asyncio
from spotify_sdk import AsyncSpotifyClient
async def main():
async with AsyncSpotifyClient(access_token="your-access-token") as client:
album = await client.albums.get("4Uv86qWpGTxf7fU7lG5X6F")
print(f"{album.name} by {album.artists[0].name}")
# "The College Dropout by Kanye West"
asyncio.run(main())
Services
Albums
# Get a single album
album = client.albums.get("<id>")
album = client.albums.get("<id>", market="US")
# Get multiple albums (up to 20)
albums = client.albums.get_several(["<id1>", "<id2>"])
# Get album tracks with pagination
tracks = client.albums.get_tracks("<id>", limit=10, offset=0)
Error Handling
The SDK raises specific exceptions for different error types:
from spotify_sdk import (
SpotifyClient,
AuthenticationError,
BadRequestError,
ForbiddenError,
NotFoundError,
RateLimitError,
ServerError,
)
try:
album = client.albums.get("invalid_id")
except NotFoundError as e:
print(f"Album not found: {e.message}")
except AuthenticationError as e:
print(f"Invalid token: {e.message}")
except RateLimitError as e:
print(f"Rate limited. Retry after {e.retry_after} seconds")
except ServerError as e:
print(f"Spotify server error: {e.message}")
Exception Hierarchy
| Exception | HTTP Status | Description |
|---|---|---|
SpotifyError |
- | Base exception for all SDK errors |
AuthenticationError |
401 | Invalid or expired access token |
BadRequestError |
400 | Invalid request parameters |
ForbiddenError |
403 | Insufficient permissions |
NotFoundError |
404 | Resource not found |
RateLimitError |
429 | Rate limit exceeded |
ServerError |
5xx | Spotify server error |
Configuration
Client Options
client = SpotifyClient(
access_token="your-access-token",
timeout=30.0, # Request timeout in seconds (default: 30.0)
max_retries=3, # Maximum retry attempts (default: 3)
)
Retry Behavior
The SDK automatically retries requests on:
- Connection errors and timeouts
- Rate limit responses (429) - respects
Retry-Afterheader - Server errors (5xx)
Retries use exponential backoff with jitter:
- Initial delay: 0.5 seconds
- Maximum delay: 8.0 seconds
- Multiplier: 2x per retry
Models
All API responses are returned as Pydantic models with full type hints:
album = client.albums.get("<id>")
# Access typed attributes
print(album.name) # str
print(album.release_date) # str
print(album.total_tracks) # int
print(album.artists) # list[SimplifiedArtist]
print(album.images) # list[Image]
# Models support forward compatibility
# Unknown fields from the API are preserved
Development
Clone the repository:
git clone https://github.com/jonathan343/spotify-sdk.git
cd spotify-sdk
Install dependencies with uv:
uv sync
Run tests:
uv run pytest
Run linting:
uv run ruff check .
uv run ruff format --check --preview .
Sync/Async Architecture
The SDK uses an async-first architecture. Async code under src/spotify_sdk/_async/ is the source of truth, and the sync code under src/spotify_sdk/_sync/ is auto-generated using unasync. Do not edit _sync/ files directly.
After making changes to _async/ source or tests/_async/, regenerate the sync code:
uv run python scripts/run_unasync.py
To verify sync code is up to date (same check that runs in CI):
uv run python scripts/run_unasync.py --check
License
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spotify_sdk-0.4.0.tar.gz.
File metadata
- Download URL: spotify_sdk-0.4.0.tar.gz
- Upload date:
- Size: 18.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e8cd2167b79269bc03bc2690e8be5032a1b6fb20b2d23ab6d6569fc3b6b89902
|
|
| MD5 |
dd7fd1d5a702a990e4cc653f267e6196
|
|
| BLAKE2b-256 |
3cf9f97ddfa91bd38ece79384b57af7b72246cbe14c37887b4b535fe2e3c497b
|
File details
Details for the file spotify_sdk-0.4.0-py3-none-any.whl.
File metadata
- Download URL: spotify_sdk-0.4.0-py3-none-any.whl
- Upload date:
- Size: 32.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0886f300cbae4d88cc4d8653d3104ead2b0ae082c7a925f10aa0bf346ba776b6
|
|
| MD5 |
62a249fce2cf5931dedc4e3079b1e2ce
|
|
| BLAKE2b-256 |
6b0c2afbf5d25f9412516687e0de59d4123d778dc5ede50851e176b4c44859fe
|