Suno Generate Audios (Ace Data Cloud)
21 operations and 39 fields behind one dropdown
- status
- task_id
- media_urls_json
- first_media_url
- result_json
- trace_id
Scroll past the five friendly nodes in the node picker and you hit this monster. Suno Generate Audios (Ace Data Cloud) is the full API surface as a single node: generate a fresh song, extend one, cover somebody else's, split stems, adjust speed, remaster, mashup, replace a section, and about a dozen more things - all selected by an action dropdown, all sharing the same field soup below it.
It looks intimidating, and honestly it is. But it's also the node that does everything the guided submit node can't: no 500-character prompt cap, every music model, every advanced field the API accepts.
Why it exists next to the simpler node
The guided path - prompt, model, instrumental, task ID - covers most of "make me a song." What's left is where music generation gets interesting and where the local alternative is weakest: editing a track that already exists. Extend it past its ending, cover it in a different style, pull the vocals out, swap a bad verse. Local open music models are impressive at making music; surgical editing of a finished song is a hosted-service strength, and that's the surface this node fronts.
Worth saying plainly that the community conversation about Suno is nearly all about the output, not the plumbing: suno shows up in roughly 1,177 threads across the corpus through July 2026 and the numbers climb, while the pack's vendor name draws zero. People want the songs. This node is how a song enters a graph.
Mechanism
Everything goes to POST /suno/audios on api.acedata.cloud, authenticated with your key as a Bearer token read from the process environment. For non-query actions the client sets async: true, so what you get back is a task, not audio. Paid submissions are sent once - the client's retry logic only covers read-only queries - and every payload is validated against the published Dify API contract before the request goes out.
The inputs that matter
parameters_json (default {}) plus two selectors and a long list of named fields. The two selectors both default to (from JSON/default), a sentinel meaning "take it from the JSON or the contract's default":
action- 21 options:generate,extend,upload_extend,upload_cover,concat,cover,artist_consistency,artist_consistency_vox,stems,all_stems,add_stem,extract_stem,sounds,adjust_speed,replace_section,underpainting,overpainting,remaster,mashup,samples,inspo.model- the same ten chirp IDs as the guided node.
The fields you'll actually touch first, with the contract's own limits:
prompt- free text, and notably uncapped here, unlike the guided node. This is the reason to open this node at all if your style brief is a paragraph.style- the style string;lyricis the words;titleis the title.lyric_promptasks the service to write lyrics for you.instrumentalandvocal_gender(form) decide whether there's a singer and who.duration- 10 to 360 seconds.bpm- 1 to 300.key,negative_tags.weirdnessandstyle_influence- both 0 to 1.weirdnessis the one people fiddle with: above roughly 0.5 the model starts taking liberties, which is either the point or a disaster, but it is never subtle.persona_id- reuse a persona you built with Suno Create Persona.audio_id,continue_at,stem_type- the ones that matter the moment you stop generating and start editing.
Every named field is a string widget, and the client coerces it to the contract's type, so 0.7 becomes a number and true becomes a boolean. Non-empty named fields override the JSON, and empty ones are omitted from the request instead of being sent as empty strings.
The one rule to internalise: only fill fields that belong to your chosen action. The contract is a strict oneOf, so a leftover stem_type on a generate call is a validation error, not a harmless extra.
Outputs
Six strings: status, task_id, media_urls_json, first_media_url, result_json, trace_id. Take task_id to Suno Retrieve Task, or skip polling entirely by using first_media_url for jobs that come back inline. media_urls_json exists because a submission can return multiple tracks, and the guided nodes' "first track wins" shortcut would throw the rest away.
Install
Same pack, same one-time setup. Manager → Custom Nodes → search Suno → publisher acedatacloud, package Suno by Ace Data Cloud (Registry ID ace-suno) → install → restart. From source:
cd /path/to/ComfyUI/custom_nodes
git clone https://github.com/AceDataCloud/SunoComfyUI.git
cd SunoComfyUI
python -m pip install -r requirements.txt
requests and jsonschema - that's the entire dependency list, no model downloads, no GPU work. Key into the ComfyUI process environment and restart:
export ACEDATACLOUD_API_KEY='paste-your-key-here'
python main.py
Allow /suno/audios if your Ace application restricts paths, and check the per-model price before pointing model at a legacy chirp ID.
When it goes wrong
A validation error naming a field you don't recognise. You have a stale value in a widget. Empty it. Validation happens locally before the request, so it's free.
does not meet the API's pattern constraint on a URL field. URL-ish fields require https:// and some require it explicitly - plain http:// fails.
Nothing happened and the queue is green. Expected: this is an async submission. The song lives behind the task ID.
A rejected request. Content policy, account access, or a model your application can't reach. Check the trace ID in the Ace console before re-running, and remember the node will not repeat a paid call for you - but it also won't repeat one it already sent when the connection died, so a timeout means "go look," not "run it again."
Inputs (42)
| Name | Type | Default | Description |
|---|---|---|---|
| parameters_json | STRING | {} | — |
| model | COMBO | (from JSON/default) | 11 options: (from JSON/default), chirp-v6, chirp-v6-wild, chirp-v6-mini, chirp-v5-5, chirp-v5, +5 |
| action | COMBO | (from JSON/default) | 22 options: (from JSON/default), generate, extend, upload_extend, upload_cover, concat, +16 |
| lyric | STRING | — | |
| max_mode | STRING | — | |
| variety | STRING | — | |
| style | STRING | — | |
| variation_category | STRING | — | |
| title | STRING | — | |
| custom | STRING | — | |
| prompt | STRING | — | |
| lyric_prompt | STRING | — | |
| audio_id | STRING | — | |
| stem_type | STRING | — | |
| audio_format | STRING | — | |
| sound | STRING | — | |
| sound_type | STRING | — | |
| bpm | STRING | — | |
| key | STRING | — | |
| speed_multiplier | STRING | — | |
| keep_pitch | STRING | — | |
| mashup_audio_ids | STRING | — | |
| audio_urls | STRING | — | |
| weirdness | STRING | — | |
| persona_id | STRING | — | |
| overpainting_start | STRING | — | |
| overpainting_end | STRING | — | |
| samples_start | STRING | — | |
| samples_end | STRING | — | |
| underpainting_start | STRING | — | |
| underpainting_end | STRING | — | |
| continue_at | STRING | — | |
| callback_url | STRING | — | |
| instrumental | STRING | — | |
| vocal_gender | STRING | — | |
| negative_tags | STRING | — | |
| style_influence | STRING | — | |
| audio_weight | STRING | — | |
| duration | STRING | — | |
| replace_section_end | STRING | — | |
| replace_section_result_mode | STRING | — | |
| replace_section_start | STRING | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| status | STRING | — |
| task_id | STRING | — |
| media_urls_json | STRING | — |
| first_media_url | STRING | — |
| result_json | STRING | — |
| trace_id | STRING | — |