Suno API
Model Page: Suno API
Community model card for calling Suno through a REST API.
Suno has no official public API. This repo documents the suno model as exposed by Apiframe: text-to-music on the current V4–V5.5 line, two tracks per job, custom or auto lyrics, and follow-up actions (extend, cover, add vocals, stems).
This repository does not host weights. Suno is a closed model. Inference runs remotely.
Model description
| Architecture | Suno (default V4_5PLUS; pin V4, V4_5, V5, or V5_5) |
| Task | text-to-music; lyrics-to-music |
| Output | 2 tracks (audioUrl, imageUrl, title, duration) |
| Typical latency | ~110s |
How to use
pip install requests
import os
import time
import requests
API = "https://api.apiframe.ai/v2"
headers = {
"X-API-Key": os.environ["APIFRAME_API_KEY"],
"Content-Type": "application/json",
}
job = requests.post(
f"{API}/music/generate",
headers=headers,
json={
"model": "suno",
"prompt": "upbeat electronic track with synth arpeggios and driving bass",
"sunoParams": {
"model_version": "V4_5PLUS",
"style": "electronic, synthwave",
},
},
).json()
while True:
result = requests.get(f"{API}/jobs/{job['jobId']}", headers=headers).json()
if result["status"] in ("COMPLETED", "FAILED"):
break
time.sleep(2)
print(result.get("result"))
result["tracks"] is a list of 2 songs. Pass webhookUrl on the generate call if you do not want to poll.
With custom_mode: false (default), prompt is a description (max 500 characters). With custom_mode: true, prompt is lyrics (max 5,000 characters). Set auto_lyrics: true to keep a long prompt as a description and let Suno write the lyrics.
Custom lyrics
import os
import requests
headers = {
"X-API-Key": os.environ["APIFRAME_API_KEY"],
"Content-Type": "application/json",
}
requests.post(
"https://api.apiframe.ai/v2/music/generate",
headers=headers,
json={
"model": "suno",
"prompt": "[Verse 1]\nWalking through the city lights\nNeon glow on rainy nights\n\n[Chorus]\nWe are the dreamers, we are the stars",
"sunoParams": {
"custom_mode": True,
"title": "City Dreamers",
"style": "pop, indie",
"vocal_gender": "f",
},
},
)
Follow-up actions
import os
import requests
headers = {
"X-API-Key": os.environ["APIFRAME_API_KEY"],
"Content-Type": "application/json",
}
requests.post(
"https://api.apiframe.ai/v2/music/suno/action",
headers=headers,
json={
"parentJobId": "JOB_ID",
"action": "extend", # cover | add_vocals | stems
"index": 1, # 1-2
},
)
Limitations
- Closed model. No weights, fine-tuning, or local inference.
- Not an official Suno endpoint. Requires an Apiframe API key (
X-API-Key). - Commercial use follows Suno's terms.
- Generated media is retained on the CDN for 90 days.
License
Outputs are subject to Suno's terms. This card is documentation only. Apiframe is not affiliated with, endorsed by, or sponsored by Suno, Inc.