
Suno API Key:创建密钥、发送请求并获取第一首歌曲
获取用于 reAPI 的 Suno API key,配置 Bearer 鉴权,使用四种语言发送首次请求、轮询音频结果,并排查常见密钥、余额及任务错误。
要获取用于 reAPI 接入的 Suno API key,请登录 reAPI,打开 API Keys 并创建密钥。请求 https://reapi.ai/api/v1 时,通过 Authorization: Bearer <key> 携带它。这是用于 reAPI 端点的 reAPI 凭据,不是 Suno 官方签发的开发者密钥。[1]
截至 2026 年 9 月 14 日,本系列核查的 Suno 官方资料指向合作伙伴意向申请,尚未发现有公开文档支持的自助密钥流程。官方 API 状态文章解释了两者区别。本文按 reAPI 的流程,从创建密钥走到首次请求和音频生成完成。[2]
要点速览
- 在 reAPI 的 API Keys 设置中创建密钥,显示时立即保存;鉴权文档说明完整密钥只展示一次。[1]
- 从服务端发送 Bearer 请求头。Suno 网站登录或订阅不能替代这个 API 凭据。
- 向音频生成端点提交
model: "suno-music"和version: "V6"。[3] - 保存返回的
id,再轮询任务。仅凭 HTTP 200 不能判断歌曲已成功生成。[4] - 一次完成的歌曲请求收费 60 credits($0.06),包含两份结果。轮询免费,提交前应检查余额。[3]
为 reAPI 接入创建 Suno API key
你需要 reAPI 账户、API Keys 设置访问权限,以及足够支付所选操作的 credits。下面示例可使用终端、安装了 requests 的 Python、内置 fetch 的 Node.js,或 Go。任选一种即可;四个示例全部运行会创建四次生成请求。
- 登录并打开 API Keys 设置。
- 点击 CREATE API KEY,这是在线页面实际显示的按钮名称。鉴权文档称其为“Create new key”。
- 为密钥起一个易于识别的名称,例如
music-development。 - 在显示时复制密钥,存入服务端密钥管理器,或已排除版本控制的本地环境文件。[1]
在运行示例的进程环境中设置 REAPI_API_KEY。这是示例使用的变量名,不是 API 必填字段。不要将真实密钥写进代码、浏览器打包文件、仓库、URL 或支持工单。文档中的生产密钥前缀为 rk_live_;返回模拟结果的 rk_test_ 仍标为“coming soon”,本指南不能将其当作可用的免费测试通道。[1]
Suno API 接口怎么调用:发送首个鉴权请求
四个示例提交相同的灵感模式请求。custom_mode: false 表示 prompt 是歌曲描述;instrumental: false 表示需要人声。model 选择操作,version 选择生成版本。使用当前的 snake_case 字段名。[3]
示例中的 30 秒是网络请求超时,不是歌曲完成期限。提交后生成会异步继续。每个示例检查 HTTP 错误并打印任务 ID;它们都是提交步骤的不同写法,之后还需执行轮询。
cURL
该版本还使用 jq 提取 id。环境变量应已设置为你的密钥。
: "${REAPI_API_KEY:?Set REAPI_API_KEY in your environment}"
curl --fail-with-body --silent --show-error --max-time 30 \
https://reapi.ai/api/v1/audio/generations \
-H "Authorization: Bearer $REAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-music",
"version": "V6",
"custom_mode": false,
"instrumental": false,
"prompt": "An upbeat acoustic song about taking the first train home"
}' > suno-submit.json && jq -er '.id' suno-submit.jsonPython
如果尚未安装,请先安装 requests。在服务端或本地终端保存并运行下面的代码。
import os
import requests
response = requests.post(
"https://reapi.ai/api/v1/audio/generations",
headers={"Authorization": f"Bearer {os.environ['REAPI_API_KEY']}"},
json={
"model": "suno-music",
"version": "V6",
"custom_mode": False,
"instrumental": False,
"prompt": "An upbeat acoustic song about taking the first train home",
},
timeout=30,
)
response.raise_for_status()
print(response.json()["id"])Node.js
保存为 submit.mjs,设置环境变量后执行 node submit.mjs。
const key = process.env.REAPI_API_KEY;
if (!key) throw new Error("Set REAPI_API_KEY in your environment");
const response = await fetch("https://reapi.ai/api/v1/audio/generations", {
method: "POST",
headers: {
Authorization: `Bearer ${key}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "suno-music",
version: "V6",
custom_mode: false,
instrumental: false,
prompt: "An upbeat acoustic song about taking the first train home",
}),
signal: AbortSignal.timeout(30_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const task = await response.json();
if (!task.id) throw new Error("Submission response has no task id");
console.log(task.id);Go
保存为 main.go,执行 go run main.go。该示例仅使用标准库。
package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
"time"
)
func main() {
if err := submit(); err != nil {
log.Fatal(err)
}
}
func submit() error {
key := os.Getenv("REAPI_API_KEY")
if key == "" {
return fmt.Errorf("set REAPI_API_KEY in your environment")
}
payload := `{"model":"suno-music","version":"V6","custom_mode":false,"instrumental":false,"prompt":"An upbeat acoustic song about taking the first train home"}`
req, err := http.NewRequest("POST",
"https://reapi.ai/api/v1/audio/generations", strings.NewReader(payload))
if err != nil {
return err
}
req.Header.Set("Authorization", "Bearer "+key)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: 30 * time.Second}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return err
}
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
return fmt.Errorf("HTTP %d: %s", resp.StatusCode, body)
}
var task struct { ID string `json:"id"` }
if err := json.Unmarshal(body, &task); err != nil {
return err
}
if task.ID == "" {
return fmt.Errorf("submission response has no task id")
}
fmt.Println(task.ID)
return nil
}保存任务 ID,轮询直到音频就绪
提交响应包含 id、model、status 和 created_at。需要保存的字段是 id,即使说明文字将它称为 task ID。不要从响应中读取不存在的顶层 task_id。[3]
用实际返回的 ID 替换下面的占位值。这条命令只查询一次状态;任务处于 processing 时,可大约每三秒查询一次,并按应用需要设置客户端等待上限。任务文档建议控制查询频率,轮询不会消耗 credits。[4]
: "${REAPI_API_KEY:?Set REAPI_API_KEY in your environment}"
TASK_ID='replace-with-the-returned-id'
curl --fail-with-body --silent --show-error --max-time 30 \
"https://reapi.ai/api/v1/tasks/$TASK_ID" \
-H "Authorization: Bearer $REAPI_API_KEY"检查 JSON 状态,而不只是 HTTP 状态:
processing:保留 ID,等待后继续查询。completed:读取output.audio_urls以及 Suno 文档定义的tracks记录。failed:停止当前轮询,检查error.code、error.message和usage.credits。[3][4]
本系列的生产环境核查已完成一次生成,并返回两个音频 URL。这验证了一次生成流程,不是延迟基准,也不保证所有请求都成功。Suno 文档保证每条歌曲记录有 url;歌曲 ID、歌词和时长等元数据为空时可能省略。后续编辑需要 ID 时,应在它们返回时保存。[3]
如果已拿到 ID,但本地等待超时,之后可以继续查询同一个任务。不要仅因客户端停止等待就立即重新生成。需要长期保存时,请把已完成音频复制到自己的存储;任务协议没有承诺 CDN 永久保留。[4]
排查鉴权、余额和参数错误
公开错误文档区分 HTTP 错误与任务失败。查询到的任务可以返回 HTTP 200,同时在 JSON 中给出 status: "failed" 和 8xxxx 错误。[5]
| HTTP 或任务结果 | 检查内容 | 下一步 |
|---|---|---|
401,10001–10004 | Bearer 头缺失或格式错误,密钥无效或已撤销 | 修正请求头或替换密钥 |
400,20002–20004 | 缺少字段、值无效或端点不支持该模型 | 使用音频端点、suno-music、version 和当前字段名 |
402,30001 | credits 不足以支付请求 | 再提交前检查余额 |
404,40001 | 任务不存在或属于另一用户 | 使用返回的 ID 和对应账户 |
429,50001 | 超过请求频率限制 | 按 Retry-After 等待 |
200,且 status: "failed" | error.code 中的执行错误 | 读取任务错误,不把 HTTP 200 当作成功 |
错误响应中有 request_id 时,应连同请求方法和大致时间保存。这些信息可用于排查,无需分享 API 密钥。先修复参数、鉴权或余额问题,再重试。[5]
免费额度和密钥轮换的实际含义
密钥负责鉴权,不会让生成免费。假设账户余额为 $0.10,即 100 credits;一次完成歌曲请求扣除 60 credits,可完成一次请求,剩余 40 credits,不够第二次完整歌曲请求。请检查账户实际优惠资格与可用余额,不要把它理解成无限免费的 Suno API key。[3]
编辑与导出费用见 Suno API 价格指南。密钥泄露后应在设置中撤销。常规轮换时,先创建替代密钥,更新服务端配置,验证新凭据,再撤销旧密钥。鉴权文档说明,撤销前已提交的待完成任务会继续执行,也可能继续计费;撤销阻止新请求,不会取消那些任务。[1]
常见问题
从哪里获取 Suno API key?
使用 reAPI 接入时,请前往 API Keys 设置,创建的是 reAPI 凭据。Suno 官方开发者意向表属于另一套合作伙伴申请流程。[1][2]
Suno 订阅包含这个密钥吗?
不包含。Suno 订阅与 reAPI 账户彼此独立。调用哪个服务的端点,就使用该服务签发的凭据;详情见官方接入说明。
能获取无限生成的免费 Suno API key 吗?
凭据不等于无限额度。请检查账户余额与操作单价。示例中的 $0.10 只能支付一次 $0.06 的歌曲请求,不能持续免费生成。[3]
Suno API 文档要求怎样鉴权?
生成 POST 和任务 GET 都发送 Authorization: Bearer <key>。密钥应留在服务端,不要写入 JSON 的 prompt 请求正文。[1]
为什么 HTTP 200 却没有歌曲?
提交是异步的。保存 id 并轮询,直到 JSON 状态为 completed 或 failed。任务失败时,查询响应也可能是 HTTP 200。[4][5]
切换 V6 Mini 或 Wild 要换密钥吗?
Bearer 鉴权流程不变。在支持的操作中,将 version 设为 V6_MINI 或 V6_WILD;不要用版本名替换 model。V6 接入指南说明了参数规则。[3]
先完成一次请求
可用的 Suno API key 只是第一步。保留任务 ID,处理成功与失败两个终态,并保存完成任务的音频。这个小流程跑通后,再按 Suno 文档添加自定义歌词、其他 V6 版本或后续编辑,同时遵守对应参数与费用规则。
参考资料
- reAPI. Authentication and key management. Retrieved September 14, 2026 from Authentication; key-creation button also checked at API Keys.
- Suno. Developer API partner-interest application. Retrieved September 14, 2026 from official application.
- reAPI. Suno operation and version reference. Retrieved September 14, 2026 from Suno, Suno V6 and the public rate card.
- reAPI. Task polling reference. Retrieved September 14, 2026 from Tasks.
- reAPI. Error codes and handling. Retrieved September 14, 2026 from Errors.
更多文章

Claude Fable 5.1 迁移指南:修复工具选择 400 错误
从 Claude Fable 5 迁移到 Fable 5.1,避免工具调用中断、对话历史丢失、思考块绑定和回滚问题。


Seedream 5.0 Pro 生成问题:文档约束与重测法
区分 Seedream 5.0 Pro 已文档化的生成限制、参数约束与默认值,和需要可控重测的视觉缺陷。用重复测试而非个别样本判定模型真实能力。


Wan 3.0 API 定价对比:480P、720P 和 1080P 成本
对比 Wan 3.0 官方 API 价格与 reAPI 价格,计算 5 秒、10 秒和 30 秒视频在 480P、720P 和 1080P 下的成本。
