API 使用指南
用最简单的话,告诉你 Suno 音乐 API 怎么用
⚠️ 先搞清楚:API 和网站是两回事
🌐 网站(给普通用户)
- • 打开网页,填描述,点按钮,等音乐
- • 有界面、有播放器,所见即所得
- • 不需要写代码
🔌 API(给开发者)
- • 用代码发 HTTP 请求,拿 JSON 结果
- • 适合接入自己的产品、批量处理
- • 需要会写代码
如果你不是开发者,不需要用这个网站。想做音乐请直接去 www.suno.cn。
想接入 OpenClaw、扣子等 AI 助手?个人用户建议直接访问 www.suno.cn 页面上的「OpenClaw 接入」入口,无需写代码。
开始之前
获取 API Key:
- 注册并登录商户后台
- 进入「API 密钥管理」页面
- 点击「创建新 API 密钥」,拿到你的 access_key
每次请求都要带上这两个 Header:
Authorization: Bearer 你的access_key Content-Type: application/json
基础地址:/api/v1
🔄 核心调用流程(必读)
几乎所有 Suno 接口都是异步的,调用流程都一样:
// 第一步:提交生成任务
POST /api/v1/music/generate
→ 返回 { "data": { "task_ids": [204, 205] } }
// 第二步:每 5~10 秒查一次
GET /api/v1/music/task?id=204
→ status: "pending" / "processing" / "completed" / "failed"
// 第三步:status 为 completed 时,从 result 里取音频地址⚠️ 重要区分:task_id 是任务 ID(数字),custom_id 是 Suno 音乐 ID(UUID 字符串)。后续操作(延长、翻唱、合成整首歌等)用的是 custom_id,不是 task_id。
🎵 生成音乐 — POST /music/generate
核心接口,支持 4 种创作模式。提交后返回 2 个 task_id(Suno 每次生成 2 首)。
🎤 灵感模式
给个描述让 AI 自由发挥,最简单的用法。
{
"gpt_description_prompt": "一首欢快的流行歌,关于夏天的美好回忆",
"make_instrumental": false, // true=纯音乐 false=有人声
"mv": "chirp-v4", // 模型版本
"title": "夏日回忆" // 歌名
}📝 自定义歌词
自己写歌词 + 风格标签,精确控制。
{
"prompt": "阳光洒在肩上\n微风轻轻吹过脸庞\n[Chorus]\n这就是青春的模样",
"tags": "pop, acoustic, summer, female vocals",
"make_instrumental": false,
"mv": "chirp-v4",
"title": "青春的模样"
}🔄 延长模式
把一首歌续写下去。
{
"task": "extend",
"continue_clip_id": "之前的custom_id",
"mv": "chirp-v4",
"title": "夏日回忆(续)"
}🎙️ 翻唱模式
用新风格翻唱已有歌曲。
{
"task": "cover",
"cover_clip_id": "要翻唱的custom_id",
"tags": "jazz, piano, male vocals",
"mv": "chirp-v4",
"title": "夏日回忆(爵士版)"
}💡 模型版本说明
- •
chirp-fenix— Suno V5.5(最新) - •
chirp-crow— Suno V5 - •
chirp-v4— Suno V4(推荐) - •
chirp-v3-5— Suno V3.5 - •
chirp-v3-0— Suno V3
🔍 查询任务
单个查询 — GET /music/task
GET /api/v1/music/task?id=204 // 注意:这里是数字 ID,不是 UUID
返回的关键字段:status(任务状态)、result.custom_id(Suno 音乐 ID)、result.fileInfo.mp3Url(音频地址)
批量查询 — GET /music/tasks
GET /api/v1/music/tasks?ids=204,205&page=1&size=20
一次查多个任务,适合生成音乐后同时查 2 个 task_id。
⚠️ 响应数据中的关键字段
- •
result.custom_id— Suno 音乐 ID(UUID),后续延长/翻唱/合成整首歌都用它 - •
result.fileInfo.mp3Url— 音频下载地址 - •
result.fileInfo.cosUrl— 封面图地址 - •
result.fileInfo.duration— 音频时长(秒) - •
result.extend— JSON 字符串,需要 JSON.parse 后使用,包含完整歌曲信息
📤 上传参考音频 — POST /music/upload
上传一首已有的歌,拿到 custom_id 后可以用来延长或翻唱。
{
"audio_url": "https://example.com/my-song.mp3" // 音频文件的公开 URL
}提交后拿到 task_id → 轮询查询 → 完成后从 result.custom_id 拿到音乐 ID,就可以用在延长/翻唱模式里了。
🛠️ 后期处理
音乐生成后的各种加工操作,都是异步的,流程和生成音乐一样(提交 → 拿 task_id → 轮询)。
🎼 合成整首歌
POST /music/whole-song
{ "clip_id": "custom_id" }把多段续写的片段合并成一首完整的歌。
📜 歌词时间戳对齐
POST /music/aligned-lyrics
{
"lyrics": "歌词内容",
"suno_id": "custom_id"
}给歌词加上时间戳,做字幕用。
🔊 Remaster 升采样
POST /music/upsample
{
"clip_id": "custom_id",
"model_name": "chirp-v4"
}提升音质,返回 2 个 task_id。
🎬 生成音乐 MV
POST /music/video
{
"task_id": 204, // 数字 task_id
"suno_id": "custom_id"
}为歌曲生成一段 MV 视频。
🎧 转 WAV 格式
POST /music/convert-wav
{
"task_id": 204,
"suno_id": "custom_id"
}把 MP3 转成无损 WAV 格式。
✂️ 裁剪音乐
POST /music/crop
{
"clip_id": "custom_id",
"start_time": 10, // 开始秒数
"end_time": 60 // 结束秒数
}⏩ 变速处理
POST /music/speed
{
"clip_id": "custom_id",
"speed": 1.5 // 倍速,如 0.5=慢放 2.0=加速
}💰 积分相关
查余额 — GET /points/balance
GET /api/v1/points/balance
// 返回 { "data": { "remaining_points": 1500 } }查流水 — GET /points/logs
GET /api/v1/points/logs?page=1&limit=20 // type: 1=消耗 2=充值 3=手动调整 4=退还
❓ 常见问题
task_id 和 custom_id 到底有什么区别?
task_id 是我们平台的任务编号(数字),用来查询任务状态。custom_id 是 Suno 的音乐 ID(UUID 字符串), 后续所有操作(延长、翻唱、合成整首歌、裁剪、变速等)都要用 custom_id,不是 task_id。
为什么生成音乐返回 2 个 task_id?
Suno 每次生成会产出 2 首歌(2 个版本),所以返回 2 个 task_id,你需要分别查询。
extend 字段怎么用?
extend 是一个 JSON 字符串,需要 JSON.parse 后使用。里面是歌曲的完整信息数组, 用 extend 数组里的 id 和外层的 custom_id 对应上,就能找到当前歌曲的详细数据(标题、歌词、风格等)。
任务失败了积分会退吗?
会的,自动退还。查询任务时 points_refunded 为 true 就说明已退。
报 429 怎么办?
请求太频繁被限流了,降低频率就行。
📋 完整代码示例
生成音乐 + 轮询查结果(JavaScript)
// 第一步:提交生成任务
const res = await fetch('/api/v1/music/generate', {
method: 'POST',
headers: {
'Authorization': 'Bearer 你的access_key',
'Content-Type': 'application/json'
},
body: JSON.stringify({
gpt_description_prompt: '一首轻快的夏日流行曲',
make_instrumental: false,
mv: 'chirp-v4',
title: '夏日微风'
})
})
const { data } = await res.json()
const taskIds = data.task_ids // [204, 205] 两首歌
// 第二步:轮询查结果(以第一首为例)
for (let i = 0; i < 60; i++) {
await new Promise(r => setTimeout(r, 5000)) // 等 5 秒
const query = await fetch(
`/api/v1/music/task?id=${taskIds[0]}`,
{ headers: { 'Authorization': 'Bearer 你的access_key' } }
)
const { data: task } = await query.json()
if (task.status === 'completed') {
console.log('音频地址:', task.result.fileInfo.mp3Url)
console.log('音乐ID:', task.result.custom_id) // 后续操作用这个
break
}
if (task.status === 'failed') {
console.error('生成失败:', task.result?.errormsg)
break
}
}🚨 错误码速查
| 错误码 | 意思 | 怎么办 |
|---|---|---|
| 200 | 成功 | ✅ |
| 400 | 参数不对 | 检查请求参数 |
| 401 | 认证失败 | 检查 API Key |
| 402 | 积分不够 | 去后台充值 |
| 429 | 请求太频繁 | 降低频率 |
| 500 | 服务器出错 | 稍后重试 |