Script workflow that captures tokens, keeps them fresh with a background watcher, crawls all Suno workspaces, and exports a neat Excel workbook (plus optional Parquet).
- Minor script tweaks
- EMOJIS!!
Security default: On successful completion, token files auth.json and auto.json are deleted automatically.
-
Python 3.10+
-
Install dependencies:
pip install -r requirements.txt
-
Parquet export: To export Parquet files, you’ll also need
pyarrow(pip install pyarrow). This is now included in the requirements file, but is only required if you want the Parquet export. -
Linux clipboard (for auto-watching):
sudo apt-get install -y xclip # or: sudo apt-get install -y xsel -
Troubleshooting:
If you have installation issues, try the exact versions listed inrequirements.txtas pinned comments.
-
Open https://suno.com/me in your browser.
-
DevTools → Network → filter Fetch/XHR.
-
Click “Next page” so the Network list refreshes.
-
Find the
GETstarting with:https://studio-api.prod.suno.com/...
-
Right-click → Copy → Copy as cURL (bash).
-
Run: Launch
run_collector.bat(Windows) ORrun_collector.sh(Linux/macOS) ORpython suno_metadata_collector.py
The script should automatically detect the information already in your clipboard. If not, paste this information when prompted, then press Enter on a blank line.
- Excel is saved as
suno_clips_YYYY-MM-DD.xlsx. - If that already exists, the script appends a suffix:
suno_clips_YYYY-MM-DD_1.xlsx, then_2, etc. - Parquet (optional) is saved as
suno_clips.parquetwhen--write-parquetis used andpyarrowis installed.
As of this writing, the script flattens and exports these fields. Future Suno changes may add/remove fields.
Show full field list
- project_name
- project_id
- allow_comments
- audio_url
- avatar_image_url
- caption
- comment_count
- created_at
- display_name
- display_tags
- download_disabled_reason
- entity_type
- explicit
- flag_count
- handle
- has_hook
- id
- image_large_url
- image_url
- is_contest_clip
- is_handle_updated
- is_liked
- is_public
- is_trashed
- major_model_version
- metadata.artist_clip_id
- metadata.can_publish_with_vocal
- metadata.can_remix
- metadata.concat_history
- metadata.control_sliders.audio_weight
- metadata.control_sliders.style_weight
- metadata.control_sliders.weirdness_constraint
- metadata.cover_clip_id
- metadata.duration
- metadata.edit_session_id
- metadata.edited_clip_id
- metadata.error_message
- metadata.error_type
- metadata.gpt_description_prompt
- metadata.has_stem
- metadata.has_vocal
- metadata.history
- metadata.infill
- metadata.infill_lyrics
- metadata.is_audio_upload_tos_accepted
- metadata.is_loudness_under_threshold
- metadata.is_remix
- metadata.negative_tags
- metadata.persona_id
- metadata.playlist_id
- metadata.priority
- metadata.prompt
- metadata.refund_credits
- metadata.show_remix
- metadata.speed_clip_id
- metadata.stem_from_id
- metadata.stem_task
- metadata.stem_type_group_name
- metadata.stem_type_id
- metadata.stream
- metadata.styles_lyrics_clip_id
- metadata.tags
- metadata.task
- metadata.type
- metadata.upsample_clip_id
- metadata.video_is_stale
- model_name
- persona.id
- persona.image_s3_id
- persona.is_owned
- persona.is_public
- persona.is_trashed
- persona.name
- persona.root_clip_id
- persona.user_display_name
- persona.user_handle
- persona.user_image_url
- play_count
- project.description
- project.id
- project.is_public
- project.is_trashed
- project.name
- reaction.feedback_reason
- reaction.flagged
- reaction.play_count
- reaction.reaction_type
- reaction.skip_count
- reaction.updated_at
- status
- title
- upvote_count
- user_id
- video_url
--out-dir PATH Output directory (default: suno_api_dump)
--workspace NAME Filter to specific workspace(s). Repeat for multiple.
--open-excel true|false Auto-open Excel when done (default: true)
--no-watcher Disable clipboard watcher (manual pasting only)
--write-parquet Also write suno_clips.parquet (requires pyarrow)
--log-dir PATH Directory to write logs (default: logs)
-
Waiting for auth.json refresh …or[!] 401 Unauthorized. Waiting for new token.
Copy a fresh Copy as cURL (bash). The watcher updatesauth.jsonautomatically. -
[!] 429 Too Many Requests.
Normal. The script backs off and retries. -
Progress lines:
• page 12 adding 20 new rows total # of rows 240
auth.json(deleted automatically on success)suno_api_dump/pages/*.jsonsuno_api_dump/*_clips.jsonsuno_clips_YYYY-MM-DD.xlsx(auto-suffixed if needed)suno_clips.parquet(optional, with--write-parquet)
- Code by tedy02, 2025
- Coding assistance by Chat-GPT
Here are the changes/enhancements I would like to make in the future. If you have the ability to implement any of these for me, that would be awesome. I am new to coding—this is my first GitHub project!
- Add CLI overrides to toggle feed filters: disliked, studio clips, generated stems. Today these are hardcoded to
true. A future flag would allow quick opt-in/out. - Let users exclude certain metadata/columns at export time.
- Support multiple output formats beyond Excel and Parquet, like HTML or PDF.
Feedback, questions, and contributions are welcome! Feel free to open an issue or submit a pull request. Contact email address: tedy02@nitesidedjs.com
MIT
