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 작업을 실제로 제출하고, task_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)