DEV Community

Cover image for Suno SDK シリーズ 01:Crazyrouter で suno/generate を最小構成で動かす実測チュートリアル
Jenny Met
Jenny Met

Posted on • Originally published at crazyrouter.com

Suno SDK シリーズ 01:Crazyrouter で suno/generate を最小構成で動かす実測チュートリアル

Suno SDK シリーズ 01:Crazyrouter で suno/generate を最小構成で動かす実測チュートリアル

Suno API integration

この記事は、Crazyrouter の Suno SDK ドキュメントをもとに、suno/generate を実際に送信し、タスク ID を取得し、完了までポーリングし、最終メディア URL を検証した記録です。

結論から言うと、suno/generate のタスク送信とポーリングは動作しました。ただし、生成タスクが succeeded になっても、それだけで「ユーザーに渡せる音声ファイルが取得できた」とは判断できません。最終的にはメディア URL の HTTP ステータス、Content-Type、ファイルサイズまで確認する必要があります。

実測環境

Test date: 2026-07-06 +08:00
Base URL: https://api.crazyrouter.com
Endpoint: POST /v1/video/generations
Model: suno/generate
Version: V5_5
Task ID: task_ac90b23619334516
Enter fullscreen mode Exit fullscreen mode

まず失敗したリクエスト

ドキュメント上の input 中心の書き方だけで送ると、本番環境では次のエラーになりました。

{"code":"invalid_request","message":"prompt is required","data":null}
Enter fullscreen mode Exit fullscreen mode

つまり、少なくともこの実測時点では、トップレベルの prompt が必要でした。

動作したリクエスト形

実際に通ったのは、トップレベル promptmetadata を併用する形です。

{
  "model": "suno/generate",
  "prompt": "[Verse]\n清晨的键盘亮起光\n请求穿过云端的墙\n[Chorus]\n用一次实测把链路唱响\n从任务到结果都清清爽爽",
  "metadata": {
    "model_version": "V5_5",
    "customMode": true,
    "instrumental": false,
    "prompt": "[Verse]\n清晨的键盘亮起光\n请求穿过云端的墙\n[Chorus]\n用一次实测把链路唱响\n从任务到结果都清清爽爽",
    "style": "bright synth pop, short, clean vocals, Mandarin pop",
    "title": "Crazyrouter Suno SDK Smoke Test 20260706"
  }
}
Enter fullscreen mode Exit fullscreen mode

戻り値は次のような非同期タスクでした。

{
  "id": "task_ac90b23619334516",
  "task_id": "task_ac90b23619334516",
  "object": "video",
  "model": "suno/generate",
  "status": "queued",
  "progress": 0
}
Enter fullscreen mode Exit fullscreen mode

ここで重要なのは、queued は生成完了ではないという点です。Suno 系の音楽生成は同期 API ではなく、タスクを作成してからポーリングする非同期ワークフローとして扱うべきです。

ポーリング結果

GET /v1/video/generations/{task_id} をポーリングすると、最終的に次の結果になりました。

{
  "code": "success",
  "data": {
    "status": "succeeded",
    "format": "mp4",
    "task_id": "task_ac90b23619334516",
    "url": "https://crazyrouter.com/v1/videos/task_ac90b23619334516/content"
  }
}
Enter fullscreen mode Exit fullscreen mode

ここまでで「タスクとしては成功」です。しかし、この url がそのままメディアとして取得できるとは限りません。

正しい検証ポイント

今回、公開 /content URL は 404/502 になりました。一方で、タスクの原始結果に含まれる次のフィールドが本当の音声ファイルでした。

data.data.resultJson.data[0].audio_url
Enter fullscreen mode Exit fullscreen mode

この audio_url は実測で次のように成功しました。

HTTP 200
Content-Type: audio/mp3
Downloaded: 412326 bytes
Enter fullscreen mode Exit fullscreen mode

したがって、クライアントやバックエンドでは次の順序で判断するのが安全です。

1. POST /v1/video/generations が成功する
2. task_id を保存する
3. ポーリングして succeeded まで待つ
4. 公開 content URL または resultJson.data[0].audio_url を取得する
5. HTTP 200、audio/*、十分なファイルサイズを確認する
6. 必要なら自社ストレージに転送する
Enter fullscreen mode Exit fullscreen mode

まとめ

suno/generate は利用可能です。ただし、実装上は succeeded と「音声ファイルがダウンロード可能」を分けて扱う必要があります。

最小実装で最も重要なのは、タスク成功後に resultJson.data[0].audio_url を検証することです。

Top comments (0)