ApiframeApiframe Docs
Follow-up ActionsSuno

Add Vocals

Layer AI-generated vocals onto a completed Suno track.

POST /v2/music/suno/actionaction: "add_vocals"

Generates a sung vocal layer on top of one of the parent job's tracks. It is intended for instrumental parents (generated with instrumental: true), turning a backing track into a complete song. The result is a fresh pair of tracks — same shape as a generation — and can itself be extended, covered, or split into stems.

Select the track with index (1 or 2) or with the trackId from the parent's result.tracks[].id — exactly one of the two.

Request

ParameterTypeRequiredDescription
parentJobIdstring (uuid)YesID of the completed suno job to act on
actionstringYes"add_vocals"
indexnumberOne of index/trackIdWhich of the parent's tracks to add vocals to: 1 or 2
trackIdstringOne of index/trackIdTrack ID from the parent's result.tracks[].id
promptstringYesThe lyrics to sing (max 5,000 characters). Structure markers like [Verse] / [Chorus] are supported
titlestringNoTitle for the result (max 80 characters). Defaults to the source track's title
stylestringNoVocal/music style tags (max 1,000 characters). Defaults to the source track's tags
negative_tagsstringNoStyles to avoid (max 500 characters)
webhookUrlstringNoHTTPS URL that receives a JSON POST when the job reaches a subscribed event — see Webhooks for payload formats
webhookEventsstring[]NoEvents to be notified about: "progress", "completed", "failed". Defaults to ["completed", "failed"] when webhookUrl is set

The model version is always inherited from the parent.

Credits

11 credits per add-vocals (same as a generation — it produces 2 new tracks).

Example result

Once the job is COMPLETED, the result object on GET /v2/jobs/:id contains a fresh pair of tracks:

{
  "tracks": [
    {
      "id": "1d7f3a58-9c2b-4e6d-a804-5f1b8e3c7a92",
      "audioUrl": "https://cdn2.apiframe.ai/audio/d4e5f6a7-b8c9-0123-def4-567890123456-0.mp3",
      "imageUrl": "https://cdn2.apiframe.ai/audio/d4e5f6a7-b8c9-0123-def4-567890123456-0.jpeg",
      "title": "Midnight Drive (Vocal)",
      "tags": "synthwave, dreamy vocals",
      "duration": 145.3
    },
    {
      "id": "6b0e9c24-4a7f-4d1c-8f35-2e8d5a1b9c47",
      "audioUrl": "https://cdn2.apiframe.ai/audio/d4e5f6a7-b8c9-0123-def4-567890123456-1.mp3",
      "imageUrl": "https://cdn2.apiframe.ai/audio/d4e5f6a7-b8c9-0123-def4-567890123456-1.jpeg",
      "title": "Midnight Drive (Vocal)",
      "tags": "synthwave, dreamy vocals",
      "duration": 141.7
    }
  ]
}

Each of these tracks can be the parent of another follow-up action.

Code examples

curl -X POST https://api.apiframe.ai/v2/music/suno/action \
  -H "X-API-Key: afk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "parentJobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "action": "add_vocals",
    "index": 1,
    "prompt": "[Verse]\nHeadlights cut through the rain\nEvery mile erases your name\n\n[Chorus]\nMidnight drive, neon glow\nLetting go of all I know"
  }'
import requests

response = requests.post(
    "https://api.apiframe.ai/v2/music/suno/action",
    headers={
        "X-API-Key": "afk_your_api_key_here",
        "Content-Type": "application/json",
    },
    json={
        "parentJobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "action": "add_vocals",
        "index": 1,
        "prompt": (
            "[Verse]\nHeadlights cut through the rain\n"
            "Every mile erases your name\n\n"
            "[Chorus]\nMidnight drive, neon glow\nLetting go of all I know"
        ),
    },
)
print(response.json())
const response = await fetch("https://api.apiframe.ai/v2/music/suno/action", {
  method: "POST",
  headers: {
    "X-API-Key": "afk_your_api_key_here",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    parentJobId: "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    action: "add_vocals",
    index: 1,
    prompt:
      "[Verse]\nHeadlights cut through the rain\nEvery mile erases your name\n\n" +
      "[Chorus]\nMidnight drive, neon glow\nLetting go of all I know",
  }),
});
console.log(await response.json());
body := `{
  "parentJobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "action": "add_vocals",
  "index": 1,
  "prompt": "[Verse]\nHeadlights cut through the rain\n\n[Chorus]\nMidnight drive, neon glow"
}`
req, _ := http.NewRequest("POST", "https://api.apiframe.ai/v2/music/suno/action",
    strings.NewReader(body))
req.Header.Set("X-API-Key", "afk_your_api_key_here")
req.Header.Set("Content-Type", "application/json")

resp, err := http.DefaultClient.Do(req)

Try it

POST/v2/music/suno/actionTry it

On this page