Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Commands reference

suno [OPTIONS] <COMMAND>
CommandPurpose
syncMirror your library to a directory, including deletions.
copyDownload and update, never delete.
checkReport what sync or copy would change, touching nothing.
lsList clips in a readable table.
lsjsonList clips as newline-delimited JSON.
fetchDownload one clip by ID or URL.
configCreate and inspect the config file.
authRefresh and test authentication.
versionPrint version and environment information.
completionsEmit a shell completion script.

Global options

These apply to every command and may appear before or after the subcommand.

FlagShortEnvDescription
--account <LABEL>SUNO_ACCOUNTRun against one configured account.
--allRun every configured account in isolation (sync/copy). Conflicts with --account.
--config <PATH>SUNO_CONFIGPath to the config file.
--dry-run-nSUNO_DRY_RUNReport changes without writing to disk or deleting.
--verbose-vIncrease verbosity. Repeatable (-vv).
--quiet-qDecrease verbosity. Repeatable (-qq).
--yes-ySUNO_YESSkip confirmation prompts (such as a destructive sync).
--token <TOKEN>SUNO_TOKENThe __client token. Never printed. Overrides config and env.

Verbosity

Verbosity is relative to the default level of 0.

LevelFlagOutput
Silent-qqErrors only.
Quiet-qPer-run summary, warnings, and errors.
DefaultSummary plus a single progress line.
Verbose-vA line per clip as it is downloaded, tagged, renamed, skipped, or deleted.

Machine-readable output (ls rows and lsjson objects) goes to stdout; progress and summaries go to stderr, so a piped lsjson stays clean.

sync

Mirror selected clips into a destination: download new clips, update tags and artwork, rename or re-encode changed files, and remove local files whose clips have left your library. Deletion is governed by strict safety rules; see Sync, copy and deletion safety.

suno sync [OPTIONS] [DEST]

DEST is the local directory to mirror into. If omitted, the account’s configured root is used.

FlagDefaultDescription
--format <mp3|flac|wav>flacAudio format for downloads.
--limit <N>Mirror only the N most recent clips.
--since <SPEC>Mirror clips newer than 7d, 2w, or last-run.
--min-newest <N>1Newest clips always kept when a recency filter applies.
--retries <N>3Download retry attempts per clip.
--animated-coversoffAlso write animated WebP covers from video previews.

When sync would delete files and --yes was not passed, it lists them and asks for confirmation on an interactive terminal. Without a terminal it refuses and asks you to pass --yes or use copy.

# Mirror everything to the configured root, in FLAC:
suno sync

# Mirror the last two weeks to a specific directory, in MP3:
suno sync /music/suno --format mp3 --since 2w

copy

Additive download and update: same selection and flags as sync, but it never deletes and never prompts.

suno copy /music/suno-archive

check

Report what sync or copy would do without writing anything. It accepts every sync flag.

suno check [OPTIONS] [DEST]
FlagDescription
--exit-codeExit 1 when changes are pending, 0 when up to date (useful in CI).
suno check /music/suno --exit-code

check never touches disk, so it is safe to run at any time.

ls

List selected clips as a tab-separated table (ID, DURATION, TITLE, TAGS). The title is truncated to 48 characters. A header prints only to a terminal, so piping stays clean.

suno ls [OPTIONS]
FlagDefaultDescription
--likedoffList only liked clips.
--limit <N>Stop after the first N clips.
--since <SPEC>Show clips newer than 7d, 2w, or last-run.
--format <text|json>textOutput format; json matches lsjson.
suno ls --limit 20
suno ls --liked | column -t -s $'\t'

lsjson

List selected clips as newline-delimited JSON (one object per line). Equivalent to ls --format json, and it accepts the same flags. The schema is stable for scripting: fields are only added, never removed or renamed. Every field is present on every object; nullable fields are null when Suno supplied no value.

FieldTypeDescription
idstringSuno clip UUID.
titlestringDisplay title; Untitled when blank.
statusstringFor example complete.
durationnumberSeconds.
created_atstringISO 8601 UTC.
is_likedboolWhether the clip is liked.
has_vocalboolWhether the clip has a vocal track.
clip_typestringFor example gen or edit.
tagsstringComma-separated style tags.
promptstring | nullUser prompt.
gpt_description_promptstring | nullAuto-generated description prompt.
lyricsstring | nullLyrics text; null if instrumental.
model_namestringFor example chirp-v4.
major_model_versionstringFor example v4.
display_namestringAccount display name.
handlestringAccount handle.
album_titlestring | nullLineage album title.
root_ancestor_idstring | nullRoot clip of the lineage.
lineage_statusstring | nullFor example root.
edited_clip_idstring | nullSource clip if this is a remix.
audio_urlstringAudio CDN URL.
image_urlstringCover image URL.
image_large_urlstringLarge cover image URL.
video_urlstringClip video URL.
video_cover_urlstringVideo cover image URL.
# Titles of liked clips:
suno lsjson --liked | jq -r '.title'

fetch

Download one clip by ID or URL to a path outside any mirrored library. The clip is written directly and is never tracked or reconciled, so fetch never affects a sync destination.

suno fetch [OPTIONS] <ID_OR_URL> [DEST]

ID_OR_URL is a clip UUID or a Suno URL containing it. DEST defaults to the current directory; when it is a directory the file is named <id>.<ext>.

FlagShortDefaultDescription
--format <mp3|flac|wav>flacAudio format.
--output <PATH>-oExplicit output file path, overriding DEST and auto-naming.
suno fetch 3f2a1b4c-aaaa-bbbb-cccc-ddddeeee0001
suno fetch https://suno.com/song/3f2a1b4c-... -o track.flac

config

Manage the config file. See Configuration for the file format.

suno config init                     # interactively create a config
suno config add-account [LABEL]      # add an account to an existing config
suno config show                     # print the config with tokens redacted

auth

suno auth refresh [ACCOUNT]

Re-mint an account’s JWT to confirm its stored token still works. With no account it uses your single configured account, or --all to check every one. See Authentication.

version

suno version

Print the build version and target, the resolved config path, and the detected ffmpeg.

completions

suno completions <SHELL>

Emit a shell completion script to stdout. SHELL is one of bash, zsh, fish, powershell, or elvish. Redirect it to the location your shell reads.

suno completions bash > ~/.local/share/bash-completion/completions/suno

Summaries

A sync or copy run ends with a summary on stderr:

Sync complete: me
  downloaded    12
  tagged         3
  renamed        1
  deleted        2
  skipped      129
  failed         0
  total        147
Duration: 43.2s

A --dry-run or check run reports the pending counts instead, and makes no changes:

Dry run: me (no changes made)
  to download   12
  to tag         3
  to rename      1
  to delete      2
  up to date   129
  total        147