Suno Persona
curl --request POST \
--url https://api.snapgen.org/v1/music/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"source_task_id": "<string>",
"source_index": 123,
"name": "<string>",
"describe": "<string>",
"styles": "<string>",
"vocal_start_s": 123,
"vocal_end_s": 123,
"webhook": "<string>",
"webhook_secret": "<string>"
}
'import requests
url = "https://api.snapgen.org/v1/music/generations"
payload = {
"model": "<string>",
"source_task_id": "<string>",
"source_index": 123,
"name": "<string>",
"describe": "<string>",
"styles": "<string>",
"vocal_start_s": 123,
"vocal_end_s": 123,
"webhook": "<string>",
"webhook_secret": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
source_task_id: '<string>',
source_index: 123,
name: '<string>',
describe: '<string>',
styles: '<string>',
vocal_start_s: 123,
vocal_end_s: 123,
webhook: '<string>',
webhook_secret: '<string>'
})
};
fetch('https://api.snapgen.org/v1/music/generations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.snapgen.org/v1/music/generations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => '<string>',
'source_task_id' => '<string>',
'source_index' => 123,
'name' => '<string>',
'describe' => '<string>',
'styles' => '<string>',
'vocal_start_s' => 123,
'vocal_end_s' => 123,
'webhook' => '<string>',
'webhook_secret' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.snapgen.org/v1/music/generations"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"source_task_id\": \"<string>\",\n \"source_index\": 123,\n \"name\": \"<string>\",\n \"describe\": \"<string>\",\n \"styles\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.snapgen.org/v1/music/generations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"source_task_id\": \"<string>\",\n \"source_index\": 123,\n \"name\": \"<string>\",\n \"describe\": \"<string>\",\n \"styles\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snapgen.org/v1/music/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"source_task_id\": \"<string>\",\n \"source_index\": 123,\n \"name\": \"<string>\",\n \"describe\": \"<string>\",\n \"styles\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyVocals & stems
Suno Persona
Save the singer of a Suno track as a reusable Persona. $0.006 per request.
POST
/
v1
/
music
/
generations
Suno Persona
curl --request POST \
--url https://api.snapgen.org/v1/music/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"source_task_id": "<string>",
"source_index": 123,
"name": "<string>",
"describe": "<string>",
"styles": "<string>",
"vocal_start_s": 123,
"vocal_end_s": 123,
"webhook": "<string>",
"webhook_secret": "<string>"
}
'import requests
url = "https://api.snapgen.org/v1/music/generations"
payload = {
"model": "<string>",
"source_task_id": "<string>",
"source_index": 123,
"name": "<string>",
"describe": "<string>",
"styles": "<string>",
"vocal_start_s": 123,
"vocal_end_s": 123,
"webhook": "<string>",
"webhook_secret": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
source_task_id: '<string>',
source_index: 123,
name: '<string>',
describe: '<string>',
styles: '<string>',
vocal_start_s: 123,
vocal_end_s: 123,
webhook: '<string>',
webhook_secret: '<string>'
})
};
fetch('https://api.snapgen.org/v1/music/generations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.snapgen.org/v1/music/generations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => '<string>',
'source_task_id' => '<string>',
'source_index' => 123,
'name' => '<string>',
'describe' => '<string>',
'styles' => '<string>',
'vocal_start_s' => 123,
'vocal_end_s' => 123,
'webhook' => '<string>',
'webhook_secret' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.snapgen.org/v1/music/generations"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"source_task_id\": \"<string>\",\n \"source_index\": 123,\n \"name\": \"<string>\",\n \"describe\": \"<string>\",\n \"styles\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.snapgen.org/v1/music/generations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"source_task_id\": \"<string>\",\n \"source_index\": 123,\n \"name\": \"<string>\",\n \"describe\": \"<string>\",\n \"styles\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snapgen.org/v1/music/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"source_task_id\": \"<string>\",\n \"source_index\": 123,\n \"name\": \"<string>\",\n \"describe\": \"<string>\",\n \"styles\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"webhook\": \"<string>\",\n \"webhook_secret\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodysuno-persona saves the singer of one of your tracks as a Persona. Pass this task’s id as persona_task_id to sing later songs with that Persona.
| Property | Value |
|---|---|
| Model ID | suno-persona |
| Endpoint | POST /v1/music/generations (asynchronous task) |
| Group | Suno > Vocals & stems |
| Input | A track from one of your earlier tasks and a Persona name |
| Result | A Persona in result.persona |
| Price | $0.006 per request (0.6 credits) |
string
required
Set to
suno-persona.string
required
The
id of your earlier task that holds the source track. It must be your own task, must have succeeded, and must come from a model listed in Source tracks.integer
default:"1"
Position of the source track in that task’s
result.tracks, counting from 1 (up to 8).string
required
Persona name, up to 100 characters.
string
Description of the Persona, up to 1,000 characters.
string
Styles that suit the Persona, up to 1,000 characters.
number
Start of the vocal passage to learn from, in seconds (from 0 to 3,600).
number
End of that vocal passage, in seconds. Must be greater than
vocal_start_s.string
Optional public
https URL that receives one signed event when the task finishes. See Task webhooks.string
Required with
webhook: 16 to 256 characters, used to sign the delivery.Request rules
The gateway checks these before it reserves any balance:- When you send both,
vocal_end_smust be greater thanvocal_start_s.
Source tracks
The source task must be your own succeeded task from one of these models:suno-music, suno-inspo, suno-sounds, suno-upload, suno-upload-cover, suno-upload-extend, suno-extend, suno-cover, suno-remaster, suno-add-vocals, suno-add-instrumental, suno-add-stem, suno-replace-section, suno-remove-section, suno-crop, suno-fade-in, suno-fade-out, suno-speed, suno-concat, suno-mashup, suno-sample.
Send the task id as source_task_id and pick the track with source_index. Never send provider track or clip IDs. See Reference earlier tasks.
Request
curl https://api.snapgen.org/v1/music/generations \
-H "Authorization: Bearer $SNAPGEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-persona",
"source_task_id": "task_2f8KcX1mQpR7vT0yZa9Lb3",
"source_index": 1,
"name": "Midnight singer",
"styles": "pop"
}'
202 with a task object and a Location: /v1/tasks/{id} header. Poll GET /v1/tasks/{id} every 10 to 20 seconds until status is succeeded or failed.
Result
The Persona ID is inresult.persona.id. To sing with the Persona later, pass this task’s id as persona_task_id; you never send the Persona ID itself.
{
"urls": [],
"persona": {
"id": "persona_5e2b91"
}
}
Use it in later requests
Pass this task’sid as persona_task_id to any of these models: suno-music, suno-upload-cover, suno-upload-extend, suno-extend, suno-cover, suno-mashup. The Persona applies in custom mode and can’t be combined with custom_model_task_id.
See Music generation tasks for the task lifecycle, result fields, webhooks, and errors.