Suno Create Persona (Ace Data Cloud)
The handle that makes a voice come back
- status
- task_id
- media_urls_json
- first_media_url
- result_json
- trace_id
Generate one song you actually like the voice on, and the immediate problem is that you can't get it back. Every new prompt rolls new dice on the singer. Suno Create Persona (Ace Data Cloud) is how you turn a track you already have into a reusable identity you can point later generations at.
It's one of the pack's schema-backed tool nodes - the same shape as the other eighteen, and worth understanding once because they all work identically. See the install and troubleshooting notes below for the parts that are shared.
Inputs that matter
The node exposes parameters_json (default {}), plus named fields. Two of them are actually required by the published API contract:
audio_id- not a URL. An audio ID from a track that already exists on your account, which you'll find inside theresult_jsonoutput of a generation call. This is the part that trips people: the node takes an ID, the voice node takes a URL, and they are not interchangeable.name- what the persona is called in your library. 1–100 characters.
Optional, and only useful in specific cases:
vox_audio_id- a pre-extracted vocal track to build the persona from, rather than the full mix. That's the output of Suno Create Vox Audio, and it gives you a cleaner reference than a full song with drums over the top.vocal_start/vocal_end- numbers, in seconds, to carve the section of the track the persona should be learned from.description- free text for your own sanity.
The contract's rule is that a non-empty named field overwrites the same key in parameters_json, and empty fields are simply omitted from the request. That means you can do the whole call in JSON and ignore the widgets, or the other way round, and both are legitimate.
Outputs
Six strings, shared by every tool node in this pack:
statusandtask_id- the state and the job handle.media_urls_json- every media link the response contained, as a JSON array.first_media_url- the first of those, for when you can't be bothered parsing.result_json- the cleaned-up full response. For personas, this is the one you want: the new persona's ID lives in here, and that ID is what you feed intopersona_idon a generation node.trace_id- for the console.
Note the shape of the flow: persona ID out of result_json here, into a generation node next run. There's no magic linkage - the pack never guesses which persona you meant.
Install
If you've already got the pack, you have this node; it's part of the same 24. 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, no models, no GPU. The key goes in the environment of the ComfyUI process - Desktop included, since its process is not your terminal:
export ACEDATACLOUD_API_KEY='paste-your-key-here'
python main.py
Persona requests go to /suno/persona, so if your Ace application restricts API paths, that's the path to allow.
When it goes wrong
Invalid parameters: does not meet the API's ... constraint. This is the tool nodes' signature failure mode, and it comes from the copied API contract being strict: each action branch of the schema forbids extra properties. Every named field you fill gets merged into the request body, so filling vocal_start on a call that can't use it fails validation. Empty out the fields you don't need rather than leaving old values sitting in the node.
audio_url must be a valid uri and friends - the same validation, aimed at a malformed value. Note that vocal_start/vocal_end are typed as numbers by the contract even though the widgets are strings; the node coerces, so 12.5 is fine and about twelve is not.
Ace Data Cloud HTTP 401. Key missing from the ComfyUI process, wrong key, restricted path, or no Suno service access on that application.
Set confirm to true... won't happen here - that one belongs to the destructive nodes. Mentioned so you don't go looking for a confirmation toggle on a create call.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| parameters_json | STRING | {} | — |
| name | STRING | — | |
| audio_id | STRING | — | |
| vox_audio_id | STRING | — | |
| vocal_start | STRING | — | |
| vocal_end | STRING | — | |
| description | 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 | — |