cURL
curl --request POST \
--url https://api.ttapi.io/suno/v1/speech \
--header 'Content-Type: application/json' \
--header 'TT-API-KEY: <api-key>' \
--data '
{
"custom": true,
"prompt": "<string>",
"background_music": true,
"tags": "<string>",
"variety": "normal",
"audio_format": "mp3",
"hookUrl": "<string>"
}
'import requests
url = "https://api.ttapi.io/suno/v1/speech"
payload = {
"custom": True,
"prompt": "<string>",
"background_music": True,
"tags": "<string>",
"variety": "normal",
"audio_format": "mp3",
"hookUrl": "<string>"
}
headers = {
"TT-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'TT-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
custom: true,
prompt: '<string>',
background_music: true,
tags: '<string>',
variety: 'normal',
audio_format: 'mp3',
hookUrl: '<string>'
})
};
fetch('https://api.ttapi.io/suno/v1/speech', 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.ttapi.io/suno/v1/speech",
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([
'custom' => true,
'prompt' => '<string>',
'background_music' => true,
'tags' => '<string>',
'variety' => 'normal',
'audio_format' => 'mp3',
'hookUrl' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"TT-API-KEY: <api-key>"
],
]);
$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.ttapi.io/suno/v1/speech"
payload := strings.NewReader("{\n \"custom\": true,\n \"prompt\": \"<string>\",\n \"background_music\": true,\n \"tags\": \"<string>\",\n \"variety\": \"normal\",\n \"audio_format\": \"mp3\",\n \"hookUrl\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("TT-API-KEY", "<api-key>")
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.ttapi.io/suno/v1/speech")
.header("TT-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"custom\": true,\n \"prompt\": \"<string>\",\n \"background_music\": true,\n \"tags\": \"<string>\",\n \"variety\": \"normal\",\n \"audio_format\": \"mp3\",\n \"hookUrl\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ttapi.io/suno/v1/speech")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["TT-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"custom\": true,\n \"prompt\": \"<string>\",\n \"background_music\": true,\n \"tags\": \"<string>\",\n \"variety\": \"normal\",\n \"audio_format\": \"mp3\",\n \"hookUrl\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "SUCCESS",
"message": "success",
"data": {
"jobId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}{
"status": "FAILED",
"message": "<string>",
"data": {}
}{
"status": "FAILED",
"message": "Wrong TT-API-KEY or email is not activated."
}Suno
Suno Speech API Documentation
Use the Suno speech API to generate spoken audio. Supports inspiration mode and custom mode.
POST
/
suno
/
v1
/
speech
cURL
curl --request POST \
--url https://api.ttapi.io/suno/v1/speech \
--header 'Content-Type: application/json' \
--header 'TT-API-KEY: <api-key>' \
--data '
{
"custom": true,
"prompt": "<string>",
"background_music": true,
"tags": "<string>",
"variety": "normal",
"audio_format": "mp3",
"hookUrl": "<string>"
}
'import requests
url = "https://api.ttapi.io/suno/v1/speech"
payload = {
"custom": True,
"prompt": "<string>",
"background_music": True,
"tags": "<string>",
"variety": "normal",
"audio_format": "mp3",
"hookUrl": "<string>"
}
headers = {
"TT-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'TT-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
custom: true,
prompt: '<string>',
background_music: true,
tags: '<string>',
variety: 'normal',
audio_format: 'mp3',
hookUrl: '<string>'
})
};
fetch('https://api.ttapi.io/suno/v1/speech', 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.ttapi.io/suno/v1/speech",
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([
'custom' => true,
'prompt' => '<string>',
'background_music' => true,
'tags' => '<string>',
'variety' => 'normal',
'audio_format' => 'mp3',
'hookUrl' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"TT-API-KEY: <api-key>"
],
]);
$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.ttapi.io/suno/v1/speech"
payload := strings.NewReader("{\n \"custom\": true,\n \"prompt\": \"<string>\",\n \"background_music\": true,\n \"tags\": \"<string>\",\n \"variety\": \"normal\",\n \"audio_format\": \"mp3\",\n \"hookUrl\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("TT-API-KEY", "<api-key>")
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.ttapi.io/suno/v1/speech")
.header("TT-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"custom\": true,\n \"prompt\": \"<string>\",\n \"background_music\": true,\n \"tags\": \"<string>\",\n \"variety\": \"normal\",\n \"audio_format\": \"mp3\",\n \"hookUrl\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ttapi.io/suno/v1/speech")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["TT-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"custom\": true,\n \"prompt\": \"<string>\",\n \"background_music\": true,\n \"tags\": \"<string>\",\n \"variety\": \"normal\",\n \"audio_format\": \"mp3\",\n \"hookUrl\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "SUCCESS",
"message": "success",
"data": {
"jobId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}{
"status": "FAILED",
"message": "<string>",
"data": {}
}{
"status": "FAILED",
"message": "Wrong TT-API-KEY or email is not activated."
}Authorizations
You can obtain your API key from the TTAPI Dashboard.
Body
application/json
- Custom mode
- Inspiration mode
Custom mode, fixed to true. Audio is generated from the lyrics.
Available options:
true Text to read aloud. Required in custom mode, up to 5000 characters.
Whether to include background music. Defaults to true.
Intonation. Describes the tone, pacing, emotion, and scene to convey. Used in custom mode, up to 1000 characters.
Vocal gender.
-
Male: Male voice
-
Female: Female voice
Available options:
Male, Female Style variety. Controls how much the generated result varies from the specified style.
- off: Exact style
- normal: Balanced variety
- high: Distinct styles
- extra: Bold exploration
- max: Unreasonably varied
Available options:
off, normal, high, extra, max Audio format of audioUrl after the job succeeds.
Available options:
mp3, m4a, wav Example:
"mp3"
Callback notification URL
Last modified on October 3, 2026