Nodes/SunoComfyUI/Suno Custom Models (Ace Data Cloud)
ComfyUI Node

Suno Custom Models (Ace Data Cloud)

Suno Custom Models is three nodes in a trench coat

By AceDataCloud·Created 3 days ago·Updated 2 days ago· 0
Suno Custom Models (Ace Data Cloud)
    • status
    • task_id
    • media_urls_json
    • first_media_url
    • result_json
    • trace_id
    ◄parameters_json{}►
    ◄action(from JSON/default)►
    ◄name►
    ◄audio_urls►
    ◄callback_url►
    ◄id►
    ◄lyric►
    ◄lyric_prompt►
    ◄style►
    ◄negative_tags►
    ◄title►
    ◄instrumental►
    ◄vocal_gender►
    ◄weirdness►
    ◄style_influence►
    ◄duration►
    ◄limit►
    ◄offset►
    ◄status►
    ◄idempotency_key►
    ◄confirmfalse►

    This is the most confusing node in the pack, and the confusion isn't the pack's fault - it's the API's. Suno Custom Models (Ace Data Cloud) fronts a create / generate / retrieve / retrieve_batch / delete family, so depending on which action you pick, you're either training a model on your own uploads, generating with it, checking on it, or deleting it. Five different jobs behind one node with a selector on it.

    The mental model that makes it click: a custom model is yours - it's built from a pile of your audio and then re-used as a reference for new songs. That's the training-your-own-artist move, and it's the hosted cousin of the thing that makes the local music story interesting: people train LoRAs on ACE-Step much the way they train checkpoint LoRAs, and the whole local-vs-API comparison is arguably sharper here than anywhere else in audio.

    The two inputs that decide everything

    action - an enum: (from JSON/default), create, generate, retrieve, retrieve_batch, delete. The sentinel means "whatever parameters_json says, or the contract's default". Pick one and the rest of the node changes meaning.

    parameters_json - a JSON object, default {}, and the only way to express most of what this endpoint accepts. The node validates it against the published contract before sending, and that contract is a oneOf with additionalProperties: false on every branch. Translation: fill only the fields that belong to the action you chose. Extra properties are rejected, not ignored - see the troubleshooting.

    The named fields are the union of all five actions, which is why there are so many: name, audio_urls, callback_url, id, lyric, lyric_prompt, style, negative_tags, title, instrumental, vocal_gender, weirdness, style_influence, duration, limit, offset, status, idempotency_key, and a confirm boolean. A non-empty named field overrides the JSON; empty ones are dropped.

    What each action actually needs, per the contract:

    • create - name (1–100 characters) plus audio_urls: 6 to 24 unique https URLs. That minimum is not a suggestion, and it's the reason this isn't a two-minute experiment.
    • generate - the model's id (a UUID) plus whichever of the musical fields you want: lyric, title, style, negative_tags, vocal_gender, instrumental, weirdness, style_influence (both 0–1), duration.
    • retrieve - just id. retrieve_batch - optional limit (1–100), offset, and status (queued, uploading, training, ready, failed, archived), which is how you watch a model train.
    • delete - id, and confirm must be true.

    Everything returns the same six strings: status, task_id, media_urls_json, first_media_url, result_json, trace_id. For create and retrieve you'll be reading result_json; for generate you'll be looking at the media URLs and then handing the task ID to a retrieve node like any other job.

    Install

    Part of the pack. Manager → Custom Nodes → search Suno → publisher acedatacloud, package Suno by Ace Data Cloud (Registry ID ace-suno) → install → restart. Or 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 model files, no GPU. Custom models live at /suno/custom-models, so allow that path if your Ace application is locked down. Key in the ComfyUI process environment:

    export ACEDATACLOUD_API_KEY='paste-your-key-here'
    python main.py
    

    When it goes wrong

    does not meet the API's additionalProperties constraint. The classic. You picked action: retrieve but left style full of text from the last run, so the request body carries a field that branch forbids. Empty the fields that don't apply. It's a validation error before the network call, so it costs you nothing but a rerun.

    does not meet the API's minItems constraint (or "uniqueItems"). Your audio_urls list is short of six, over twenty-four, or has duplicates. Note also that the entries have to be https URLs - an array of local file paths won't get past validation.

    Set confirm to true to perform this deletion or archive operation. delete is classified as destructive, so the node refuses unless confirm is ticked or the JSON says "confirm": true. That's deliberate: delete is irreversible, and the pack also flags destructive calls as non-retryable, so a connection drop after the delete lands is not something it will helpfully repeat.

    parameters_json must contain a JSON object. You gave it an array, a bare string, or JSON with a trailing comma. Single quotes are not JSON.

    HTTP 401/403. Key, path restriction, or no Suno access on that application - check the console, and check your credits before assuming a bug.

    CategoryAce Data Cloud/Suno

    Inputs (21)

    NameTypeDefaultDescription
    parameters_jsonSTRING{}—
    actionCOMBO(from JSON/default)6 options: (from JSON/default), create, generate, retrieve, retrieve_batch, delete
    nameSTRING—
    audio_urlsSTRING—
    callback_urlSTRING—
    idSTRING—
    lyricSTRING—
    lyric_promptSTRING—
    styleSTRING—
    negative_tagsSTRING—
    titleSTRING—
    instrumentalSTRING—
    vocal_genderSTRING—
    weirdnessSTRING—
    style_influenceSTRING—
    durationSTRING—
    limitSTRING—
    offsetSTRING—
    statusSTRING—
    idempotency_keySTRING—
    confirmBOOLEANfalse—

    Outputs (6)

    NameTypeDescription
    statusSTRING—
    task_idSTRING—
    media_urls_jsonSTRING—
    first_media_urlSTRING—
    result_jsonSTRING—
    trace_idSTRING—