A Python script to bulk download your Suno AI music library — organized by workspace, with full metadata and embedded ID3 tags.
Built with the assistance of Claude by Anthropic.
I've been using Suno for a while now and genuinely enjoy it — at some point I had accumulated well over a thousand generated tracks and wanted to back them all up properly, including lyrics, prompts and cover art.
The natural first step was to look for existing tools. I tried a couple of browser extensions. One of them handled smaller libraries fine but kept failing somewhere around 650 songs — consistently, no matter what I tried. Another one had issues when I wanted to re-download a workspace I had already partially downloaded, this time to also get the metadata files I had missed the first time around. Nothing broke catastrophically, but it just didn't behave reliably enough for my use case.
I also came across a few standalone scripts on GitHub. Some of them worked well enough for basic downloading, but what I specifically needed was workspace support — I organize my songs into workspaces on Suno, and I wanted that structure reflected locally. The ability to download a single workspace, skip one, or pick a few by name was something I couldn't find in a ready-made solution without significant modification. At that point the choice was either to keep evaluating tools or to just build something that fit my needs. With a bit of help from an AI assistant, the latter turned out to be the faster path.
This was built for personal use. I'm publishing it on the off chance that someone else finds it useful — if you do, great. If not, there are plenty of other approaches out there. Suno unfortunately doesn't offer an official bulk export, so the ecosystem of unofficial tools will likely keep growing regardless.
- 📁 Workspace-aware — downloads songs into separate folders per workspace
- 🎵 ID3 tag embedding — title, artist, year, genre and cover art are written directly into each MP3
- 🖼️ Cover art — high-resolution cover image saved as a separate file and embedded in the MP3
- 📄 Full metadata — lyrics, style prompt and all track info saved as
.txtand.jsonper song - 🔁 Resume support — already downloaded files are skipped, so you can restart at any time
- 🐢 Conservative download settings — generous delays between requests to avoid rate limiting
- 🔌 Single connection — no parallel requests, strictly sequential to be a polite API client
- 🔍 Workspace filtering — include or exclude specific workspaces via
--only/--skip
This tool is not affiliated with, endorsed by, or sponsored by Suno AI.
It is an independent, unofficial utility that uses your existing Suno session token to access your own content.
Use it responsibly and in accordance with Suno's Terms of Service.
This script was developed and tested against Suno's internal API as of March 2026. It uses endpoints that are not officially documented or supported by Suno.
Suno can change, rename or remove these endpoints at any time. If the script suddenly stops working — returning errors like 404, 405 or unexpected empty results — the API has likely changed. In that case the endpoints and/or request format in the script would need to be updated accordingly.
- Python 3.10 or higher
- A Suno account with songs in your library
# 1. Clone the repository
git clone https://github.com/geschke/suno-bulk-downloader.git
cd suno-bulk-downloader
# 2. Create a virtual environment (recommended)
python -m venv venv
# Windows
venv\Scripts\activate
# macOS / Linux
source venv/bin/activate
# 3. Install dependencies
pip install -r requirements.txtThe script authenticates using your existing Suno browser session. No password is required.
- Open Chrome or Edge and go to suno.com
- Make sure you are logged in
- Open Developer Tools: F12
- Go to the Network tab
- Reload the page: F5
- Type
feedin the filter field - Click on the
v3POST request - Under Request Headers, find the
Authorizationentry — it reads:Bearer ey... - Copy only the part after
Bearer— the longey...string
⚠️ Tokens expire after a few hours. If the script reports a401error, simply get a fresh token and restart — already downloaded files will be skipped automatically.
🔒 Your token is never stored or transmitted anywhere other than directly to Suno's own API.
python suno_download.py --list-workspaces --token "ey..."Output:
Available workspaces:
My Workspace
Der Kluft
Votfr Playlist
AT01
...
Total: 16 workspace(s)
python suno_download.py --token "ey..."python suno_download.py --only "AT01" --token "ey..."python suno_download.py --skip "My Workspace" --token "ey..."python suno_download.py --include-library --token "ey..."python suno_download.py --debug-first --token "ey..."python suno_download.py --output "D:\Music\Suno" --token "ey..."Open suno_download.py and set:
SUNO_TOKEN = "ey...your_token_here..."suno_library/
├── AT01/
│ ├── Song Title__a1b2c3d4.mp3 ← audio with embedded tags + cover
│ ├── Song Title__a1b2c3d4.jpeg ← cover art
│ ├── Song Title__a1b2c3d4.txt ← lyrics, style prompt, metadata
│ └── Song Title__a1b2c3d4.json ← full raw API response
├── Der Kluft/
│ └── ...
└── _library_all/ ← only with --include-library
└── ...
You can adjust these constants at the top of suno_download.py:
| Setting | Default | Description |
|---|---|---|
SUNO_TOKEN |
"YOUR_TOKEN_HERE" |
Your bearer token |
OUTPUT_DIR |
./suno_library |
Download destination |
DELAY_BETWEEN_DOWNLOADS |
8.0 s |
Pause between songs |
DELAY_BETWEEN_FILES |
2.5 s |
Pause between files within a song |
MAX_RETRIES |
6 |
Retry attempts on error |
MAX_BACKOFF |
120 s |
Maximum backoff wait time |
With default settings (~13 seconds per song including delays):
| Songs | Estimated time |
|---|---|
| 100 | ~22 minutes |
| 500 | ~1.8 hours |
| 1000 | ~3.6 hours |
| 1700 | ~6 hours |
The conservative timing is intentional — it keeps request rates low and reduces the risk of hitting Suno's rate limits or triggering any automated blocks.
- Built with the assistance of Claude (Anthropic) — an AI assistant that helped design, debug and iterate on this tool through conversational development
- Suno API endpoint research done by inspecting browser network traffic
MIT License — see LICENSE for details.