Create Persona
curl --request POST \
--url https://api.mountsea.ai/suno/v2/persona \
--header 'Content-Type: application/json' \
--data '
{
"clip_id": "<string>",
"name": "<string>",
"is_public": true,
"description": "<string>",
"persona_type": "<string>",
"vox_audio_id": "<string>",
"vocal_start_s": 123,
"vocal_end_s": 123,
"user_input_styles": "<string>",
"image_s3_id": "<string>"
}
'import requests
url = "https://api.mountsea.ai/suno/v2/persona"
payload = {
"clip_id": "<string>",
"name": "<string>",
"is_public": True,
"description": "<string>",
"persona_type": "<string>",
"vox_audio_id": "<string>",
"vocal_start_s": 123,
"vocal_end_s": 123,
"user_input_styles": "<string>",
"image_s3_id": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
clip_id: '<string>',
name: '<string>',
is_public: true,
description: '<string>',
persona_type: '<string>',
vox_audio_id: '<string>',
vocal_start_s: 123,
vocal_end_s: 123,
user_input_styles: '<string>',
image_s3_id: '<string>'
})
};
fetch('https://api.mountsea.ai/suno/v2/persona', 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.mountsea.ai/suno/v2/persona",
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([
'clip_id' => '<string>',
'name' => '<string>',
'is_public' => true,
'description' => '<string>',
'persona_type' => '<string>',
'vox_audio_id' => '<string>',
'vocal_start_s' => 123,
'vocal_end_s' => 123,
'user_input_styles' => '<string>',
'image_s3_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"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.mountsea.ai/suno/v2/persona"
payload := strings.NewReader("{\n \"clip_id\": \"<string>\",\n \"name\": \"<string>\",\n \"is_public\": true,\n \"description\": \"<string>\",\n \"persona_type\": \"<string>\",\n \"vox_audio_id\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"user_input_styles\": \"<string>\",\n \"image_s3_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.mountsea.ai/suno/v2/persona")
.header("Content-Type", "application/json")
.body("{\n \"clip_id\": \"<string>\",\n \"name\": \"<string>\",\n \"is_public\": true,\n \"description\": \"<string>\",\n \"persona_type\": \"<string>\",\n \"vox_audio_id\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"user_input_styles\": \"<string>\",\n \"image_s3_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mountsea.ai/suno/v2/persona")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"clip_id\": \"<string>\",\n \"name\": \"<string>\",\n \"is_public\": true,\n \"description\": \"<string>\",\n \"persona_type\": \"<string>\",\n \"vox_audio_id\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"user_input_styles\": \"<string>\",\n \"image_s3_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"description": "<string>",
"persona_type": "<string>",
"is_public": true,
"clip": {},
"vocal_start_s": 123,
"vocal_end_s": 123
}Suno
Create Persona
Create a vocal persona from an audio clip
POST
/
suno
/
v2
/
persona
Create Persona
curl --request POST \
--url https://api.mountsea.ai/suno/v2/persona \
--header 'Content-Type: application/json' \
--data '
{
"clip_id": "<string>",
"name": "<string>",
"is_public": true,
"description": "<string>",
"persona_type": "<string>",
"vox_audio_id": "<string>",
"vocal_start_s": 123,
"vocal_end_s": 123,
"user_input_styles": "<string>",
"image_s3_id": "<string>"
}
'import requests
url = "https://api.mountsea.ai/suno/v2/persona"
payload = {
"clip_id": "<string>",
"name": "<string>",
"is_public": True,
"description": "<string>",
"persona_type": "<string>",
"vox_audio_id": "<string>",
"vocal_start_s": 123,
"vocal_end_s": 123,
"user_input_styles": "<string>",
"image_s3_id": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
clip_id: '<string>',
name: '<string>',
is_public: true,
description: '<string>',
persona_type: '<string>',
vox_audio_id: '<string>',
vocal_start_s: 123,
vocal_end_s: 123,
user_input_styles: '<string>',
image_s3_id: '<string>'
})
};
fetch('https://api.mountsea.ai/suno/v2/persona', 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.mountsea.ai/suno/v2/persona",
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([
'clip_id' => '<string>',
'name' => '<string>',
'is_public' => true,
'description' => '<string>',
'persona_type' => '<string>',
'vox_audio_id' => '<string>',
'vocal_start_s' => 123,
'vocal_end_s' => 123,
'user_input_styles' => '<string>',
'image_s3_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"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.mountsea.ai/suno/v2/persona"
payload := strings.NewReader("{\n \"clip_id\": \"<string>\",\n \"name\": \"<string>\",\n \"is_public\": true,\n \"description\": \"<string>\",\n \"persona_type\": \"<string>\",\n \"vox_audio_id\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"user_input_styles\": \"<string>\",\n \"image_s3_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.mountsea.ai/suno/v2/persona")
.header("Content-Type", "application/json")
.body("{\n \"clip_id\": \"<string>\",\n \"name\": \"<string>\",\n \"is_public\": true,\n \"description\": \"<string>\",\n \"persona_type\": \"<string>\",\n \"vox_audio_id\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"user_input_styles\": \"<string>\",\n \"image_s3_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mountsea.ai/suno/v2/persona")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"clip_id\": \"<string>\",\n \"name\": \"<string>\",\n \"is_public\": true,\n \"description\": \"<string>\",\n \"persona_type\": \"<string>\",\n \"vox_audio_id\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"user_input_styles\": \"<string>\",\n \"image_s3_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"description": "<string>",
"persona_type": "<string>",
"is_public": true,
"clip": {},
"vocal_start_s": 123,
"vocal_end_s": 123
}Create a persona based on an audio clip. Personas can be used to generate music with consistent vocal characteristics.
This endpoint returns the created persona directly (not a task ID). For vocal personas (
persona_type: "vox"), first extract the vocal stem using Get Vox Stem.Request Body
string
required
The audio clip ID to create persona from.
string
required
The name of the persona.
boolean
default:true
required
Whether the persona is publicly accessible.
string
A description of the persona.
string
The type of persona. Use
"vox" for vocal personas.string
The vox audio ID returned from Get Vox Stem. Required for vocal personas.
number
The start time (in seconds) of the vocal segment to use.
number
The end time (in seconds) of the vocal segment to use.
string
Style tags describing the persona (e.g., “soulful vocals, R&B, smooth harmonies”).
string
Base64 encoded image for the persona avatar (format:
data:image/png;base64,...).Response
The response contains the complete persona object with all details.string
The created persona ID.
string
The persona name.
string
The persona description.
string
The type of persona (e.g.,
"vox").boolean
Whether the persona is public.
object
The source clip information.
number
The vocal start time.
number
The vocal end time.
Example
curl -X POST https://api.mountsea.ai/suno/v2/persona \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"clip_id": "316c630b-284b-4fbd-9b35-f0551d4b98da",
"name": "My Vocal Persona",
"description": "A soulful R&B voice",
"is_public": true,
"persona_type": "vox",
"vox_audio_id": "373efa9c-a366-42bb-806c-afdfc9b306a7",
"vocal_start_s": 16.13,
"vocal_end_s": 46.13,
"user_input_styles": "soulful vocals, R&B, smooth harmonies"
}'
const response = await fetch('https://api.mountsea.ai/suno/v2/persona', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-api-key'
},
body: JSON.stringify({
clip_id: '316c630b-284b-4fbd-9b35-f0551d4b98da',
name: 'My Vocal Persona',
description: 'A soulful R&B voice',
is_public: true,
persona_type: 'vox',
vox_audio_id: '373efa9c-a366-42bb-806c-afdfc9b306a7',
vocal_start_s: 16.13,
vocal_end_s: 46.13,
user_input_styles: 'soulful vocals, R&B, smooth harmonies'
})
});
const persona = await response.json();
console.log('Created Persona ID:', persona.id);
console.log('Persona Name:', persona.name);
import requests
response = requests.post(
'https://api.mountsea.ai/suno/v2/persona',
headers={
'Content-Type': 'application/json',
'Authorization': 'Bearer your-api-key'
},
json={
'clip_id': '316c630b-284b-4fbd-9b35-f0551d4b98da',
'name': 'My Vocal Persona',
'description': 'A soulful R&B voice',
'is_public': True,
'persona_type': 'vox',
'vox_audio_id': '373efa9c-a366-42bb-806c-afdfc9b306a7',
'vocal_start_s': 16.13,
'vocal_end_s': 46.13,
'user_input_styles': 'soulful vocals, R&B, smooth harmonies'
}
)
persona = response.json()
print(f"Created Persona ID: {persona['id']}")
print(f"Persona Name: {persona['name']}")
Response Example
{
"id": "61515b86-62f5-427a-bc29-6befa382536a",
"name": "My Vocal Persona",
"description": "A soulful R&B voice",
"image_s3_id": "https://cdn2.suno.ai/image_316c630b-284b-4fbd-9b35-f0551d4b98da.jpeg",
"root_clip_id": "316c630b-284b-4fbd-9b35-f0551d4b98da",
"clip": {
"id": "316c630b-284b-4fbd-9b35-f0551d4b98da",
"status": "complete",
"title": "Roadtrip Sunrise",
"audio_url": "https://cdn1.suno.ai/316c630b-284b-4fbd-9b35-f0551d4b98da.mp3",
"image_url": "https://cdn2.suno.ai/image_316c630b-284b-4fbd-9b35-f0551d4b98da.jpeg"
},
"persona_type": "vox",
"is_public": true,
"user_input_styles": "soulful vocals, R&B, smooth harmonies",
"vocal_start_s": 16.13,
"vocal_end_s": 46.13,
"vocal_clip_id": "70149747-3f33-4e56-a4f4-8c44c30d7a0f",
"upvote_count": 0,
"clip_count": 1,
"follower_count": 0
}
Workflow: Creating a Vocal Persona
For creating a vocal persona, follow these steps:// Step 1: Get vox stem to extract vocals
const voxResponse = await fetch('https://api.mountsea.ai/suno/v2/getVoxStem', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-api-key'
},
body: JSON.stringify({ clip_id: 'your-clip-id' })
});
const voxData = await voxResponse.json();
// voxData.id is the vox_audio_id to use
// Step 2: Create persona with the extracted vox audio
const personaResponse = await fetch('https://api.mountsea.ai/suno/v2/persona', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-api-key'
},
body: JSON.stringify({
clip_id: 'your-clip-id',
name: 'My Vocal Persona',
is_public: true,
persona_type: 'vox',
vox_audio_id: voxData.id,
vocal_start_s: voxData.vocal_start_s,
vocal_end_s: voxData.vocal_end_s,
user_input_styles: 'your style description'
})
});
const persona = await personaResponse.json();
console.log('Persona created:', persona.id);
Once created, personas can be used in the Generate Music endpoint via the
persona parameter to create music with consistent vocal characteristics.⌘I