Seedance 2.5 is live — 30-second cinematic video with native audio & real-person references
Suno API Key:创建密钥、发送请求并获取第一首歌曲
2026/09/14

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。任选一种即可;四个示例全部运行会创建四次生成请求。

  1. 登录并打开 API Keys 设置
  2. 点击 CREATE API KEY,这是在线页面实际显示的按钮名称。鉴权文档称其为“Create new key”。
  3. 为密钥起一个易于识别的名称,例如 music-development
  4. 在显示时复制密钥,存入服务端密钥管理器,或已排除版本控制的本地环境文件。[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.json

Python

如果尚未安装,请先安装 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,轮询直到音频就绪

提交响应包含 idmodelstatuscreated_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.codeerror.messageusage.credits[3][4]

本系列的生产环境核查已完成一次生成,并返回两个音频 URL。这验证了一次生成流程,不是延迟基准,也不保证所有请求都成功。Suno 文档保证每条歌曲记录有 url;歌曲 ID、歌词和时长等元数据为空时可能省略。后续编辑需要 ID 时,应在它们返回时保存。[3]

如果已拿到 ID,但本地等待超时,之后可以继续查询同一个任务。不要仅因客户端停止等待就立即重新生成。需要长期保存时,请把已完成音频复制到自己的存储;任务协议没有承诺 CDN 永久保留。[4]

排查鉴权、余额和参数错误

公开错误文档区分 HTTP 错误与任务失败。查询到的任务可以返回 HTTP 200,同时在 JSON 中给出 status: "failed"8xxxx 错误。[5]

HTTP 或任务结果检查内容下一步
401,1000110004Bearer 头缺失或格式错误,密钥无效或已撤销修正请求头或替换密钥
400,2000220004缺少字段、值无效或端点不支持该模型使用音频端点、suno-musicversion 和当前字段名
402,30001credits 不足以支付请求再提交前检查余额
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 状态为 completedfailed。任务失败时,查询响应也可能是 HTTP 200。[4][5]

切换 V6 Mini 或 Wild 要换密钥吗?

Bearer 鉴权流程不变。在支持的操作中,将 version 设为 V6_MINIV6_WILD;不要用版本名替换 modelV6 接入指南说明了参数规则。[3]

先完成一次请求

可用的 Suno API key 只是第一步。保留任务 ID,处理成功与失败两个终态,并保存完成任务的音频。这个小流程跑通后,再按 Suno 文档添加自定义歌词、其他 V6 版本或后续编辑,同时遵守对应参数与费用规则。

参考资料

  1. reAPI. Authentication and key management. Retrieved September 14, 2026 from Authentication; key-creation button also checked at API Keys.
  2. Suno. Developer API partner-interest application. Retrieved September 14, 2026 from official application.
  3. reAPI. Suno operation and version reference. Retrieved September 14, 2026 from Suno, Suno V6 and the public rate card.
  4. reAPI. Task polling reference. Retrieved September 14, 2026 from Tasks.
  5. reAPI. Error codes and handling. Retrieved September 14, 2026 from Errors.