보이스 클론 및 지정 음색 생성 API(권장하지 않음)
⛔ 구 경로이므로 새 연동에는 권장하지 않습니다. 이 문서는 초기의
persona경로(voice_task_id/generate-with-voice)를 설명합니다. 지금도 사용할 수 있지만 대외적으로 권장하지 않으며, 왼쪽 내비게이션에도 "권장하지 않음"으로 표시되어 있습니다.새 연동에는 【권장】 음색 클론 API를 사용하세요. 보컬 샘플 하나로 음색을 만들고(
POST /api/music/voice-profile/create), 그 음색으로 지정한 곡을 커버하거나 새 노래를 부르게 할 수 있습니다. 음색은 일급 리소스로 목록·조회·삭제가 가능하고 원본 오디오도 영구 보관됩니다."음색 생성 → 장기 재사용 → 커버"의 전체 흐름이 필요한 제품이라면 새 경로를 우선하세요.
중요: 복제한 음성은 만료될 수 있습니다.
음성 클로닝으로 생성된
voice_id/voice_task_id는 영구적으로 쓸 수 있는 리소스가 아닙니다. 유효 기간, 계정 상태, 음성 상태의 변화로 사용할 수 없게 될 수 있습니다. 연동하는 쪽은 최초 클로닝에 성공한 뒤 로컬에 캐시한 음성 ID를 계속 영구적으로 재사용해서는 안 됩니다.권장 방식:
voice_task_id,voice_id,is_available,updated_at, 최근 생성 성공 시각을 저장하세요.- 복제한 음성으로 생성하기 전에 매번
GET /api/voice/clone/tasks/{voice_task_id}또는POST /api/voice/clone/tasks/{voice_task_id}/check를 호출해is_available=true를 확인하세요.- 음성을 사용할 수 없다는 오류, 작업이 존재하지 않는다는 오류,
selected voice is not ready등이 반환되면 사용자에게 다시 클로닝하거나 사용 가능한 다른 음성을 고르도록 안내하세요.- 복제한 음성을 최종 사용자에게 "영구 자산"으로 약속하지 마세요. 제품 화면에서 "음성은 만료될 수 있으며 재검증 또는 재클로닝이 필요합니다"라고 안내하세요.
인터페이스 설명
이 그룹의 인터페이스는 재사용 가능한 음성을 만들고 그 음성으로 곡을 생성합니다. 호출하는 쪽은 플랫폼이 발급한 API Key만 사용하면 되고, 작업 제출·상태 동기화·과금·다운로드는 서버가 일괄 처리합니다.
인증 방식: Authorization: Bearer YOUR_API_KEY
과금:
- 음성 검증, 음성 클로닝, 상태 조회, 삭제, 다운로드: 무료.
- 워크스페이스의 원스텝 클론 진입점: 1회 5위안 고정. 원본 음성 검증과 2차 검증 오디오까지 자동으로 완료하며 실패하면 환불됩니다.
- 일반 클론 완료 후 곧바로 검증 오디오를 자동 생성하는 경우: 1회 5위안 고정. 실패하면 기존 흐름에 따라 환불됩니다.
- 복제한 음성으로 곡 생성: 유료, 1회 1.2위안 고정. 한 번의 호출로 보통 2건의 자리표시자 작업이 반환됩니다.
- Max Mode를 켜면(
POST /api/music/generate-with-voice에max_mode: true전달) 위의 1회 1.2위안이 2배, 즉 1회 2.4위안으로 과금됩니다. 음성 생성도variety(0-4, 추가 과금 없음)를 지원합니다. 값 규칙은 새 API 개요의 "고급 파라미터" 절을 참고하세요.
호출 흐름
POST /api/voice/clone/validate를 호출해 원본 음성을 업로드하고voice_task_id를 받습니다.GET /api/voice/clone/tasks/{voice_task_id}를 기다리거나 폴링해validate_info를 받습니다.- 사용자가
validate_info를 읽고 검증 오디오를 녹음합니다. POST /api/voice/clone/tasks/{voice_task_id}/generate를 호출해 검증 오디오를 제출합니다.POST /api/voice/clone/tasks/{voice_task_id}/check를 호출하거나 작업을 계속 조회해is_available=true가 될 때까지 기다립니다.POST /api/music/generate-with-voice를 호출해 그 음성으로 곡을 생성합니다.- 생성 인터페이스는 먼저 자리표시자 작업을 반환합니다. 곡 생성이 끝나 실제
song_id를 받은 뒤에는 다운로드 인터페이스로 단일 파일이나 묶음 파일을 받을 수 있습니다. - (선택) 이 음성이 더 이상 필요 없으면
DELETE /api/voice/clone/voices/{voice_task_id}로 삭제합니다. 의미는 6절을 참고하세요.
원스텝 클론도 있습니다. 워크스페이스의 최초 녹음/원본 음성 업로드 화면에서 한 번에 완료를 선택하면 검증과 음색 생성을 한 번에 끝내므로 두 번째 검증 오디오를 녹음할 필요가 없습니다. 1회 5위안이며 실패하면 환불됩니다.
음성 작업 필드
| 필드 | 타입 | 설명 |
|---|---|---|
voice_task_id |
number | 플랫폼 내부의 음성 작업 ID. 이후 인터페이스는 모두 이 ID를 사용합니다 |
voice_id |
string | 곡 생성에 쓸 수 있는 음성 ID. 작업이 사용 가능해지면 반환됩니다 |
voice_name |
string | 음성 이름 |
description |
string | 음성 설명 |
style |
string | 음성 스타일 |
singer_skill_level |
string | 창법 수준. 자주 쓰는 값: beginner, intermediate, professional |
language |
string | 원본 음성 언어. 예: zh, en |
validate_info |
string | 읽어야 하는 검증 텍스트 |
validate_status |
string | 검증 작업 상태 |
voice_status |
string | 음성 생성 상태 |
is_available |
boolean | 이미 곡 생성에 사용할 수 있는지 여부 |
status |
string | 플랫폼 작업 상태 |
stage |
string | 현재 단계 |
error_code |
string | 실패 오류 코드 |
error_message |
string | 실패 원인 |
source_duration_seconds |
number | 원본 오디오 길이(초) |
created_at |
number | 생성 타임스탬프 |
updated_at |
number | 갱신 타임스탬프 |
completed_at |
number | 완료 타임스탬프 |
1. 원본 음성 검증 제출
엔드포인트: POST /api/voice/clone/validate
Body 파라미터
| 파라미터 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
voice_url |
string | 아니오 | - | 원본 음성 오디오 URL. file_base64와 둘 중 하나 |
file_base64 |
string | 아니오 | - | Base64 오디오. voice_url과 둘 중 하나 |
file_name |
string | 아니오 | - | 파일 이름. file_base64를 쓸 때 지정을 권장합니다 |
voice_name |
string | 아니오 | 자동 생성 | 음성 이름 |
description |
string | 아니오 | - | 음성 설명 |
style |
string | 아니오 | - | 음성 스타일 |
singer_skill_level |
string | 아니오 | beginner |
창법 수준 |
language |
string | 아니오 | zh |
원본 음성 언어 |
vocal_start_s |
number | 예 | - | 유효한 보컬의 시작 초 |
vocal_end_s |
number | 예 | - | 유효한 보컬의 종료 초 |
source_duration_seconds |
number | 아니오 | - | 원본 오디오 전체 길이(초) |
vocal_end_s - vocal_start_s는 최소 보컬 구간 요건을 충족해야 합니다. 선명하고 눈에 띄는 반주나 잡음이 없는 보컬 녹음을 올리는 것을 권장합니다.
요청 예시
curl -X POST https://www.suno-api.io/api/voice/clone/validate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"voice_url": "https://example.com/source-voice.wav",
"voice_name": "내 중국어 여성 음성",
"description": "맑고 자연스러운 중국어 여성 음성",
"style": "Mandopop",
"singer_skill_level": "intermediate",
"language": "zh",
"vocal_start_s": 1.2,
"vocal_end_s": 18.5,
"source_duration_seconds": 20
}'
응답 예시
{
"success": true,
"message": "",
"data": {
"voice": {
"voice_task_id": 123,
"voice_name": "내 중국어 여성 음성",
"language": "zh",
"validate_status": "submitted",
"is_available": false,
"status": "validate_submitted",
"stage": "validate_submitted",
"created_at": 1780480000,
"updated_at": 1780480000
}
}
}
2. 음성 작업 조회
엔드포인트: GET /api/voice/clone/tasks/{voice_task_id}
요청 예시
curl https://www.suno-api.io/api/voice/clone/tasks/123 \
-H "Authorization: Bearer YOUR_API_KEY"
응답 예시
{
"success": true,
"message": "",
"data": {
"voice": {
"voice_task_id": 123,
"voice_name": "내 중국어 여성 음성",
"validate_info": "여기서 반환된 검증 텍스트를 읽어 주세요",
"validate_status": "success",
"is_available": false,
"status": "validate_ready",
"stage": "validate_callback"
}
}
}
3. 검증 텍스트 재생성
엔드포인트: POST /api/voice/clone/tasks/{voice_task_id}/regenerate
검증 텍스트가 읽기에 적합하지 않거나 검증을 다시 해야 할 때 호출합니다.
curl -X POST https://www.suno-api.io/api/voice/clone/tasks/123/regenerate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
4. 검증 오디오 제출 및 음성 생성
엔드포인트: POST /api/voice/clone/tasks/{voice_task_id}/generate
Body 파라미터
| 파라미터 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
verify_url |
string | 아니오 | - | 검증 텍스트를 읽은 오디오 URL. file_base64와 둘 중 하나 |
file_base64 |
string | 아니오 | - | Base64 검증 오디오. verify_url과 둘 중 하나 |
file_name |
string | 아니오 | - | 파일 이름. file_base64를 쓸 때 지정을 권장합니다 |
voice_name |
string | 아니오 | 작업 이름 | 음성 이름 |
description |
string | 아니오 | 작업 설명 | 음성 설명 |
style |
string | 아니오 | 작업 스타일 | 음성 스타일 |
singer_skill_level |
string | 아니오 | 작업 설정 | 창법 수준 |
요청 예시
curl -X POST https://www.suno-api.io/api/voice/clone/tasks/123/generate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"verify_url": "https://example.com/verify-voice.wav",
"voice_name": "내 중국어 여성 음성"
}'
5. 음성 사용 가능 여부 확인
엔드포인트: POST /api/voice/clone/tasks/{voice_task_id}/check
curl -X POST https://www.suno-api.io/api/voice/clone/tasks/123/check \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
작업이 사용 가능해지면 응답의 is_available이 true가 되고 voice_id가 반환됩니다.
6. 음성 삭제
엔드포인트: DELETE /api/voice/clone/voices/{voice_task_id}
과금: 무료.
curl -X DELETE https://www.suno-api.io/api/voice/clone/voices/123 \
-H "Authorization: Bearer YOUR_API_KEY"
응답 예시
{
"success": true,
"message": "",
"data": {
"voice_task_id": 123,
"deleted": true
}
}
| 필드 | 타입 | 설명 |
|---|---|---|
| voice_task_id | number | 삭제된 음성 작업 ID |
| deleted | boolean | 항상 true. 삭제 요청이 접수되었음을 뜻합니다 |
삭제하면 어떻게 되는가
- 새 곡 생성에 더 이상 쓸 수 없습니다: 이
voice_task_id(또는 그voice_id)로POST /api/music/generate-with-voice를 호출하면 거부되며 오류 메시지는selected voice is not ready이고 과금되지 않습니다. - 이미 이 음성으로 만든 곡은 전혀 영향을 받지 않습니다: 재생, 다운로드, 이어쓰기, 구간 교체, 스템 분리가 그대로 동작합니다.
- 이 음성 작업은 조회에서 사라집니다:
GET /api/voice/clone/tasks/{voice_task_id}가record not found를 반환합니다. - 원본 오디오는 플랫폼의 영구 보관 정책에 따라 보관됩니다(2026-09-23부터 삭제해도 업로드한 보컬 소재를 정리하지 않습니다). 다만 복구할 수 있다는 뜻은 아닙니다: 이전 작업은 이미 종료되었고, 같은 목소리를 계속 쓰려면 클론 흐름을 다시 거쳐 **새
voice_task_id**를 받아야 합니다. - 중복 삭제: 같은 작업을 다시 삭제하면
record not found가 반환됩니다(이미 삭제 상태라 조회되지 않습니다).
7. 복제한 음성으로 곡 생성
엔드포인트: POST /api/music/generate-with-voice
과금: 1회 1.2위안.
Body 파라미터
| 파라미터 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
voice_task_id |
number | 예 | - | 사용 가능해진 음성 작업 ID |
voice_id |
string | 아니오 | - | 선택적 검증 필드. 전달하면 작업의 voice_id와 일치해야 합니다 |
customMode |
boolean | 아니오 | false |
false는 간편 모드, true는 고급 모드 |
prompt |
string | 예 | - | 간편 모드에서는 곡 설명, 고급 모드에서는 가사. 두 모드 모두 비워 둘 수 없습니다 |
style |
string | 고급 모드에서 필수 | - | 스타일 태그. customMode=true일 때 비워 둘 수 없습니다 |
title |
string | 고급 모드에서 필수 | - | 곡 제목. customMode=true일 때 비워 둘 수 없습니다 |
negativeTags |
string | 아니오 | - | 제외 스타일 |
instrumental |
boolean | 아니오 | false |
호환 필드. 복제 음성 생성은 항상 보컬 곡으로 처리됩니다 |
waitAudio |
boolean | 아니오 | false |
호환 필드. 이 인터페이스는 항상 비동기로 자리표시자 작업을 반환하고 오디오 완료를 기다리지 않습니다 |
model |
string | 아니오 | suno-v6 |
일반 곡 생성 모델. suno-v6, suno-v6-wild, suno-v6-mini 사용 가능 |
vocalGender |
string | 아니오 | - | 보컬 성별 선호 |
lyricsMode |
string | 아니오 | - | 호환 필드. 현재 복제 음성 제출 경로는 가사 모드를 따로 바꾸지 않습니다 |
weirdnessConstraint |
number | 아니오 | - | 창의성 강도 |
styleWeight |
number | 아니오 | - | 스타일 가중치 |
audioWeight |
number | 아니오 | 플랫폼 기본값 | Audio Influence(오디오 참조도). 범위 0.0-1.0. 전달하지 않으면 플랫폼 기본값(공식 화면의 25%에 해당)으로 처리됩니다. 0은 유효한 값이며 참조 원본에 전혀 기울지 않는다는 뜻입니다. 아래 sourceClipId와 강하게 연관됩니다. 참조 원본을 전달하면 참조 오디오를 가리키고, 전달하지 않으면 복제 음색을 가리킵니다. 플랫폼에는 두 경우를 모두 담당하는 이 슬라이더 하나만 있으므로 용도별로 두 파라미터로 나누지 마세요 |
sourceClipId |
string | 아니오 | - | 참조 원본 곡의 실제 워크스페이스 clip ID. 전달하면 복제 음성 커버가 되고, 전달하지 않으면 일반 복제 음성 생성이 됩니다 |
sourceAudioUrl |
string | 아니오 | - | 참조 원본 표시용 필드. 소유권이나 계정 판정에는 관여하지 않으며 서버는 데이터베이스 기록을 기준으로 합니다 |
sourceTitle |
string | 아니오 | - | 참조 원본 표시용 필드. 소유권이나 계정 판정에는 관여하지 않습니다 |
clientSubmissionId |
string | 아니오 | - | Create UI 호환 필드. 고객 API에서 확실한 중복 제거를 하려면 Idempotency-Key 헤더를 사용하세요 |
suno-v6, suno-v6-wild, suno-v6-mini를 지원하며 모델이 비어 있으면 suno-v6로 처리됩니다. 구형 V5/V5.5 모델은 종료되었지만 과거 작업에는 옛 모델명이 남아 있을 수 있습니다.
공유 요청 구조는 task, soundType, soundLoop, soundBpm, soundKey, voiceTaskId, voiceId 같은 Create UI 호환 필드도 해석하지만, 이들은 이 인터페이스의 유효한 고객 파라미터가 아닙니다. 음성 작업은 반드시 voice_task_id로 전달하고, 선택적 음성 검증은 voice_id로 전달해야 하며, 음성 곡 생성이 sound 필드를 읽는 일은 없습니다.
생성 파라미터 작성 안내
customMode=false일 때는prompt에 곡 설명을,customMode=true일 때는prompt에 전체 가사를 넣고style과title도 반드시 채워야 합니다. 가사를 간편 모드의 설명 필드로 잘못 보내거나 곡 설명을 고급 모드 가사로 취급하지 마세요.weirdnessConstraint와styleWeight는 모두0.0부터1.0까지의 비율 소수이며50이나50%는 쓸 수 없습니다. 균형 값으로는0.5를 쓸 수 있고, 생략은 "지정하지 않음"을,0은 유효한 명시적 값을 뜻합니다.vocalGender에는m,male,f,female만 쓸 수 있습니다.instrumental은 이 인터페이스에서 호환 필드일 뿐이며 복제 음성 생성은 항상 보컬 곡으로 처리됩니다.waitAudio는 이 인터페이스에서 동작을 바꾸지 않으며 항상 비동기로 자리표시자 작업을 반환합니다. 초기 결과의audio_url이 비어 있는 것은 정상입니다.client_request_id로 조회하고 결과가 완료된 뒤에 오디오 주소를 읽으세요.
Header 파라미터
| Header | 필수 | 설명 |
|---|---|---|
Authorization: Bearer ... |
예 | 고객 API 토큰 |
Content-Type: application/json |
예 | JSON 요청 본문 |
Idempotency-Key |
아니오, 강력 권장 | 최대 128자. 같은 사용자, Token, 엔드포인트, Key, 요청 본문이면 과금과 작업 생성이 한 번만 이루어집니다 |
Idempotency-Key 동작:
- 첫 요청은 과금 전에 영구 멱등 레코드를 기록합니다.
- 같은 Key로 같은 요청이 이미 완료되면 첫 접수 응답을 재생하고, 다시 과금하거나 작업을 만들지 않습니다.
- 같은 Key에 요청 본문이 다르면 거부됩니다.
- 같은 Key가 아직 처리 중이면 안정적인 처리 중 오류를 반환하고, 생성된 경우에만 안전한
client_request_id를 반환합니다. - 같은 Key의 첫 요청이 실패하면 실패 상태가 유지되며, 재시도에는 새 Key가 필요합니다.
sourceClipId 커버 조건
고객 API의 참조 원본 커버는 서버가 원본 곡 접근을 일괄 처리하므로 고객이 계정 정보를 전달할 필요가 없습니다. 사용 가능 여부는 실제 응답으로 판단하세요.
참조 원본은 현재 API 사용자에게 속하고, 완료되었으며 pending:이 아닌 워크스페이스 곡이고 사용 가능한 오디오가 있어야 합니다. 일반 생성, 일반 업로드 원본, 강화 업로드 최종 곡을 지원합니다. 강화 업로드의 중간 레코드는 과금 전에 거부됩니다. 서버는 고객이 제출한 원본 곡 ID만 받고 계정 ID는 받지 않으며, 원본을 쓸 수 없거나 미완료면 과금 전에 오류를 반환합니다.
요청 예시
curl -X POST https://www.suno-api.io/api/music/generate-with-voice \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"voice_task_id": 123,
"customMode": true,
"prompt": "여름밤 바닷가를 노래한 중국어 팝 곡을 써 주세요",
"style": "Mandopop, warm piano, emotional",
"title": "여름밤의 바닷바람",
"negativeTags": "noise, low quality",
"instrumental": false,
"model": "suno-v6"
}'
응답 예시
{
"success": true,
"message": "",
"data": {
"client_request_id": "cu_1780480000_abcd1234",
"items": [
{
"placeholder_id": "pending:cu_1780480000_abcd1234:0",
"client_request_id": "cu_1780480000_abcd1234",
"client_request_index": 0,
"status": "submitted",
"type": "voice_generate",
"title": "여름밤의 바닷바람",
"prompt": "여름밤 바닷가를 노래한 중국어 팝 곡을 써 주세요"
},
{
"placeholder_id": "pending:cu_1780480000_abcd1234:1",
"client_request_id": "cu_1780480000_abcd1234",
"client_request_index": 1,
"status": "submitted",
"type": "voice_generate",
"title": "여름밤의 바닷바람",
"prompt": "여름밤 바닷가를 노래한 중국어 팝 곡을 써 주세요"
}
],
"pre_consumed_quota": 600000,
"billing_source": "wallet"
}
}
자리표시자 작업과 최종 song_id
generate-with-voice는 비동기 생성 인터페이스입니다. 성공 응답은 생성 작업이 접수되었다는 뜻일 뿐, 곡 생성이 끝났다는 뜻이 아닙니다.
응답의 주요 필드 의미:
| 필드 | 설명 |
|---|---|
client_request_id |
이번 생성 요청의 추적 ID. 한 번의 요청으로 보통 2곡이 생성되며 두 결과가 같은 client_request_id를 사용합니다. |
items[].placeholder_id |
플랫폼 로컬 자리표시자 ID로 보통 pending:{client_request_id}:{index} 형식입니다. 최종 곡 ID가 아닙니다. |
items[].client_request_index |
같은 요청 안의 결과 번호로 보통 0과 1입니다. |
items[].status |
제출 직후의 초기 상태로 예를 들어 submitted입니다. 이후 성공이나 실패는 최종 작업 기록을 따릅니다. |
주의: pending:으로 시작하는 placeholder_id는 최종 song_id로 쓸 수 없고 /api/music/query나 다운로드 인터페이스에 직접 넘길 수도 없습니다. pending:*만으로 /api/music/query를 호출하면 빈 배열 []이 반환될 수 있는데, 이는 실제 곡이 아직 완성되지 않았거나 자리표시자 작업이 최종 곡 ID로 바뀌지 않았기 때문입니다.
잘못된 예:
{
"song_ids": "pending:cu_1780480000_abcd1234:0"
}
올바른 흐름:
POST /api/music/generate-with-voice를 호출해 음성 곡 생성 작업을 제출합니다.- 응답의
client_request_id,items[].placeholder_id,items[].client_request_index를 저장합니다. GET /api/music/generate-with-voice/results?client_request_id=cu_xxx를 폴링합니다.- 반환된
items[].song_id에 값이 있고pending:으로 시작하지 않으면/api/music/query,/api/music/download-file,/api/music/download-all을 호출합니다.
현재 버전에는 공개 조회 인터페이스가 추가되었습니다:
GET /api/music/generate-with-voice/results?client_request_id=cu_xxx
현재 사용자에게 속한 같은 client_request_id의 작업 결과를 반환하므로 고객이 최종 song_id를 직접 조회할 수 있습니다. 반환 목록에서:
song_id는 실제 곡 ID입니다.placeholder_id는 작업이 아직 자리표시자 상태일 때만 나타납니다.pending:으로 시작하는 값은/api/music/query나 다운로드 인터페이스에 쓸 수 없습니다.
client_request_id나 pending:* 자리표시자 ID만 저장했다면 먼저 이 결과 인터페이스를 호출하세요. 실제 song_id가 아직 조회되지 않으면 client_request_id를 기술 지원에 보내 확인을 요청하세요.
음성 곡 생성 결과 조회
엔드포인트: GET /api/music/generate-with-voice/results
과금: 무료.
Query 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
client_request_id |
string | 예 | generate-with-voice가 반환한 요청 추적 ID |
요청 예시
curl -X GET "https://www.suno-api.io/api/music/generate-with-voice/results?client_request_id=cu_1780480000_abcd1234" \
-H "Authorization: Bearer YOUR_API_KEY"
생성 중 응답 예시
{
"success": true,
"message": "",
"data": {
"client_request_id": "cu_1780480000_abcd1234",
"status": "processing",
"items": [
{
"song_id": "",
"placeholder_id": "pending:cu_1780480000_abcd1234:0",
"client_request_id": "cu_1780480000_abcd1234",
"client_request_index": 0,
"status": "processing",
"type": "voice_generate",
"title": "여름밤의 바닷바람"
}
]
}
}
생성 완료 응답 예시
{
"success": true,
"message": "",
"data": {
"client_request_id": "cu_1780480000_abcd1234",
"status": "completed",
"items": [
{
"song_id": "song_abc123",
"client_request_id": "cu_1780480000_abcd1234",
"client_request_index": 0,
"status": "completed",
"type": "voice_generate",
"title": "여름밤의 바닷바람",
"audio_url": "https://...",
"image_url": "https://...",
"duration": 180.5
}
]
}
}
최상위 status 의미
| 상태 | 설명 |
|---|---|
not_found |
현재 사용자에게 그 client_request_id의 작업 기록이 아직 없습니다 |
processing |
결과가 하나 이상 미완료입니다. 계속 폴링하세요 |
completed |
모든 결과가 완료되었습니다. song_id로 조회하거나 다운로드할 수 있습니다 |
partial |
일부는 완료되고 일부는 실패했습니다. 완료된 song_id부터 처리하세요 |
failed |
모든 결과가 실패했습니다. items[].error_message를 확인하세요 |
8. 단일 파일 다운로드
엔드포인트: POST /api/music/download-file
Body 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
song_id |
string | 예 | 곡 ID |
kind |
string | 예 | 다운로드 종류: audio, cover, wav, video |
요청 예시
curl -X POST https://www.suno-api.io/api/music/download-file \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"song_id": "song_abc123",
"kind": "audio"
}' \
--output song.mp3
응답은 파일 스트림이며 Content-Type과 파일 이름은 백엔드가 반환한 값을 따릅니다.
9. 곡 리소스 묶음 다운로드
엔드포인트: POST /api/music/download-all
Body 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
song_id |
string | 예 | 곡 ID |
요청 예시
curl -X POST https://www.suno-api.io/api/music/download-all \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"song_id": "song_abc123"
}' \
--output song.zip
묶음 파일에는 보통 오디오, 커버, metadata.json이 들어 있습니다. 아직 생성되지 않은 종류의 리소스는 압축 파일에 포함되지 않습니다.
자주 발생하는 오류
| message | 설명 |
|---|---|
voice audio is required |
원본 음성 제출 시 voice_url도 file_base64도 제공하지 않았습니다 |
invalid voice task id |
경로의 음성 작업 ID가 유효하지 않습니다 |
voice validation is not ready |
검증 텍스트를 아직 받지 못해 검증 오디오를 제출할 수 없습니다 |
selected voice is not ready |
선택한 음성이 아직 곡 생성에 쓸 수 없습니다(미준비, 삭제됨, 또는 현재 계정 소유가 아님) |
selected voice does not match voice task |
요청의 voice_id가 작업과 일치하지 않습니다 |
voice task is required |
음성 곡 생성 시 voice_task_id가 없습니다 |
record not found |
작업/곡이 존재하지 않거나, 현재 API Key의 계정에 속하지 않거나, 이미 삭제되었습니다(음성을 삭제한 뒤 이 작업을 조회해도 같은 값이 나옵니다) |
이 그룹의 오류는 모두 HTTP 200으로 반환됩니다. 성공 여부는 응답 본문의
success필드로 판단하세요(false가 실패이고 원인은message). HTTP 상태 코드만 보고 판단하지 마세요. 음성 삭제의 전체 의미(삭제 후에도 쓸 수 있는지, 복구할 수 있는지)는 6절을 참고하세요.