Cover
Re-generate a completed Suno track in a new style while keeping its core melody.
POST /v2/music/suno/action — action: "cover"
Equivalent to Suno's Cover feature: re-generates one of the parent job's tracks in a different style or genre while preserving its core melody and structure. 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 to cover with index (1 or 2) or with the trackId
from the parent's result.tracks[].id — exactly one of the two.
Request
| Parameter | Type | Required | Description |
|---|---|---|---|
parentJobId | string (uuid) | Yes | ID of the completed suno job to act on |
action | string | Yes | "cover" |
index | number | One of index/trackId | Which of the parent's tracks to cover: 1 or 2 |
trackId | string | One of index/trackId | Track ID from the parent's result.tracks[].id |
prompt | string | No | Content of the cover — lyrics when the parent was generated with custom_mode: true, a description otherwise (max 5,000 characters). Omit to reuse the source material |
title | string | No | Title for the cover (max 80 characters). Defaults to the source track's title |
style | string | No | Target style/genre tags for the cover (max 1,000 characters) — this is the main lever. Defaults to the source track's tags |
negative_tags | string | No | Styles to avoid (max 500 characters) |
audio_weight | number | No | How closely the cover follows the source audio, 0–1. Higher values stay closer to the original melody; lower values give Suno more creative freedom |
webhookUrl | string | No | HTTPS URL that receives a JSON POST when the job reaches a subscribed event — see Webhooks for payload formats |
webhookEvents | string[] | No | Events to be notified about: "progress", "completed", "failed". Defaults to ["completed", "failed"] when webhookUrl is set |
The model version and generation mode (custom_mode, instrumental) are
always inherited from the parent.
Credits
11 credits per cover (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": "5f1c8a92-6d3e-4b7a-8e29-3c0d7f5a1b86",
"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": "Neon Skyline (Acoustic)",
"tags": "acoustic, folk, warm",
"duration": 131.2
},
{
"id": "9a4e2b07-1f6d-4c8a-b573-8d2e6a0c4f19",
"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": "Neon Skyline (Acoustic)",
"tags": "acoustic, folk, warm",
"duration": 127.6
}
]
}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": "cover",
"index": 1,
"style": "acoustic folk, warm, fingerpicked guitar"
}'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": "cover",
"index": 1,
"style": "acoustic folk, warm, fingerpicked guitar",
},
)
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: "cover",
index: 1,
style: "acoustic folk, warm, fingerpicked guitar",
}),
});
console.log(await response.json());body := `{
"parentJobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"action": "cover",
"index": 1,
"style": "acoustic folk, warm, fingerpicked guitar"
}`
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)Stay close to the original melody
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": "cover",
"trackId": "8b2f64d1-3c5e-4a7f-9d2b-6e1a0c4f8b3d",
"style": "orchestral, cinematic",
"audio_weight": 0.8,
"title": "Neon Skyline (Orchestral)"
}'Try it
/v2/music/suno/actionTry it