Suno API 的 Python 调用示例
流程四步,和语言无关;Python 这边真正要处理的是「任务没跑完但请求超时」这件事。
准备
把 Key 放服务端(环境变量或密钥管理),不要写进代码库;请求头用 Authorization: Bearer <KEY>。生成类接口按次计费,读取类免费。
四步跑通
import time, requests
BASE = "https://www.suno-api.io"
H = {"Authorization": "Bearer YOUR_API_KEY"}
# 1) 提交生成:0.6 元一次,返回 2 首
song = requests.post(f"{BASE}/api/music/create", headers=H, timeout=300, json={
"description": "明亮的中文流行,钢琴前奏,温暖女声", "model": "suno-v6"
}).json()["data"]["clips"][0]["song_id"]
# 2) 轮询到完成(建议 3-5 秒一次)
for _ in range(60):
s = requests.post(f"{BASE}/api/music/query", headers=H, timeout=60,
json={"song_id": song}).json()
if s.get("data", {}).get("status") in ("complete", "completed"):
break
time.sleep(4)
# 3) 取媒体地址(免费,可指定 wav / video / cover / midi)
url = requests.post(f"{BASE}/api/music/download-url", headers=H, timeout=60,
json={"song_id": song, "kind": "song"}).json()
print(url)
# 4) 需要落盘时用下载接口,或直接 requests.get(url)
三个必踩的坑
- 客户端超时设 30 秒:生成可能几分钟,超时只代表没等到响应,不代表没下单——先查任务状态。
- 超时后立刻重提:这是重复扣费的第一大来源。
- 把音频地址存进数据库当永久链接:地址会过期,重新取一次即可,不会再次计费。
429 怎么处理
加指数退避(1s → 2s → 4s…),并检查并发是否过高。生成类接口不要瞬发大量请求,读取类也有限流。
常见问题 / FAQ
有官方 SDK 吗?
没有。接口就是普通 HTTP,用 requests 或 httpx 都能调,不需要额外依赖。
需要异步吗?
多数场景不需要。轮询 + sleep 足够;只有你要同时跑很多首时才值得上 asyncio。
一次调用出几首?
生成类默认返回 2 首;替换段落、分轨等编辑类通常返回 1 个结果。
申请 Key、第一个请求、接口清单与报错排查
注册只需要邮箱,一次生成 0.6 元出 2 首,MP3 与 WAV 下载不限次。
看完整接口清单
注册只需要邮箱,一次生成 0.6 元出 2 首,MP3 与 WAV 下载不限次。