본문으로 건너뛰기

가벼운 노래 생성 모델 Suno v6 Mini API. 한 문장이나 직접 쓴 가사를 보내면 보컬이 담긴 완성 MP3 두 곡이 돌아오며, 요금은 v6와 같은 정액입니다.

최저가 $0.072/회

플레이그라운드

요청 보내기

빠른 시작

예시는 선택한 엔드포인트의 공개 파라미터 정의를 사용합니다. API 키와 예시 미디어를 바꾼 뒤 서버에서 요청하세요.

SDK 및 연동
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

API 인증

API 키는 서버 환경 변수 SPICY_API_KEY에 보관하세요. Bearer 인증을 사용하고 JSON 요청에는 Content-Type: application/json을 지정하세요.

Authorization: Bearer $SPICY_API_KEY
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  -d '{
  "model": "suno/v6-mini/text-to-audio",
  "input": {
    "prompt": "Calm ambient pads with a slow rising motif"
  }
}'

# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

이 모델의 입력 스키마에서 뽑아낸 예시입니다. API도 모든 요청을 같은 스키마로 검증합니다.

입력 파라미터

이 필드들은 요청 본문의 input 객체 안에 넣습니다. 이름과 타입은 API와 동일합니다. 기본값이 적혀 있지 않은 필드는 임의로 가정하지 마세요.

promptstring필수

스타일 설명입니다. 직접 쓴 lyrics를 쓰거나 instrumental을 켠 경우에는 장르, 템포, 악기, 목소리, 분위기 같은 스타일만 최대 1,000자까지 적습니다. lyrics 없이 generate_lyrics를 켠 경우에는 곡의 아이디어로 쓰이며, 모델이 이를 바탕으로 가사를 씁니다(최대 3,000자). 스타일은 말로 설명해 주세요. 실제 아티스트 이름이 들어간 프롬프트는 거부됩니다. 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
제약 조건
minLength:1
maxLength:3000
reference_audio_urlsarray<string>선택

곡에 영감을 줄 참고 오디오 파일 1개를 지정할 수 있습니다(6초~30분, 500MB 이하). 가사 자동 생성 모드에서만 사용할 수 있습니다(lyrics 없음, instrumental 꺼짐, generate_lyrics 켜짐). 사용할 권리가 있는 오디오만 쓰세요. 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
제약 조건
maxItems:1
reference_video_urlsarray<string>선택

곡의 기준이 될 참고 영상 1개를 지정할 수 있습니다(MP4, MOV, WebM, 100MB 및 241초 이하). 예를 들어 영상에 음악을 입히고 싶을 때 사용합니다. 가사 자동 생성 모드에서만 사용할 수 있습니다(lyrics 없음, instrumental 꺼짐, generate_lyrics 켜짐). 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
제약 조건
maxItems:1
image_urlsarray<string>선택

곡의 분위기를 잡는 데 참고할 무드 이미지를 최대 5장까지 지정할 수 있습니다(JPEG, PNG, WebP, BMP, 각 10MB 이하). 가사 자동 생성 모드에서만 사용할 수 있습니다(lyrics 없음, instrumental 꺼짐, generate_lyrics 켜짐). 다른 모드에서는 알기 쉬운 오류가 반환됩니다. 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
제약 조건
maxItems:5
persona_modelstring선택

persona_id가 무엇인지 모델에 알려 줍니다. style_persona(음악 스타일을 이어받음) 또는 voice_persona(목소리를 이어받음)입니다. persona_id와 함께 보내세요. 직접 쓴 lyrics를 쓰거나 instrumental을 켠 경우에만 적용됩니다. 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
허용 값
"style_persona""voice_persona"
persona_idstring선택

곡을 부르거나 연주할, 저장해 둔 Suno 페르소나(보이스)의 ID입니다. 선택 사항입니다. 직접 쓴 lyrics를 쓰거나 instrumental을 켠 경우에만 적용되며, persona_model과 함께 사용합니다. 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
제약 조건
minLength:1
maxLength:200
varietyinteger선택

모델이 스타일 프롬프트를 얼마나 변주할지를 0(꺼짐: 스타일 태그를 쓴 그대로 사용)에서 4(최대)까지의 정수로 지정합니다. 기본값은 1입니다. Suno가 직접 설명한 설정이며 저희는 테스트하지 않았습니다. 직접 쓴 lyrics를 쓰거나 instrumental을 켠 경우에만 적용됩니다. 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
제약 조건
minimum:0
maximum:4
audio_weightnumber선택

입력한 오디오가 결과에 얼마나 강하게 반영되는지를 0에서 1까지 0.01 단위로 지정합니다. Suno는 보컬 없는 곡에서는 이를 지원하지 않습니다. 직접 쓴 lyrics를 쓰거나 instrumental을 켠 경우에만 적용됩니다. 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
제약 조건
minimum:0
maximum:1
weirdnessnumber선택

곡이 예상에서 얼마나 벗어나도 되는지를 0(보편적)에서 1(모험적)까지 0.01 단위로 지정합니다. 직접 쓴 lyrics를 쓰거나 instrumental을 켠 경우에만 적용됩니다. 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
제약 조건
minimum:0
maximum:1
style_weightnumber선택

곡이 스타일 설명을 얼마나 엄격하게 따를지를 0에서 1까지 0.01 단위로 지정합니다. 직접 쓴 lyrics를 쓰거나 instrumental을 켠 경우에만 적용되며, 그 밖의 경우에는 알기 쉬운 오류가 반환됩니다. 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
제약 조건
minimum:0
maximum:1
vocal_genderstring선택

리드 보컬을 여성(female) 또는 남성(male) 쪽으로 유도합니다. 보장이 아니라 선호 설정이며, 얼마나 지켜지는지는 테스트하지 않았습니다. 직접 쓴 lyrics를 쓰거나 instrumental을 켠 경우에만 적용되며, 가사 자동 생성과 함께 보내면 알기 쉬운 오류가 반환됩니다. 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
허용 값
"female""male"
negative_promptstring선택

곡에서 빼고 싶은 스타일, 소리, 분위기를 쉼표로 구분한 짧은 목록으로 적습니다. 예: ‘harsh distortion, spoken word’. 선택 사항입니다. 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
제약 조건
minLength:1
maxLength:500
titlestring선택

곡 제목으로, 최대 80자입니다. 직접 쓴 lyrics를 쓰거나 instrumental을 켠 경우에 적용되며, 가사를 자동 생성할 때는 모델이 제목을 정합니다. 선택 사항입니다. 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
제약 조건
minLength:1
maxLength:80
instrumentalboolean선택

보컬 없는 트랙을 만들려면 켭니다. 이때 prompt는 스타일 설명(최대 1,000자)이 되며 lyrics는 필요 없습니다. 기본값은 꺼짐입니다. 요금에는 영향을 주지 않습니다.

기본값
false
generate_lyricsboolean선택

기본값은 켜짐입니다. lyrics가 비어 있고 instrumental이 꺼져 있으면 모델이 prompt를 바탕으로 가사를 씁니다. 직접 입력한 가사는 절대 고쳐 쓰지 않습니다. lyrics를 보내거나 instrumental을 켤 때만 끄세요. 요금에는 영향을 주지 않습니다.

기본값
true
lyricsstring선택

부를 가사로, 최대 5,000자이며 한 줄에 한 행씩 씁니다. [Verse], [Chorus], [Bridge], [Outro] 같은 섹션 태그를 단독 행에 두면 곡 구조가 잡히며, 태그 자체는 불리지 않습니다. 저희 테스트에서는 모든 줄이 쓴 순서대로 불렸고, 후렴은 가사에서 직접 반복하지 않는 한 반복되지 않았습니다. 비워 두면 가사가 자동으로 만들어집니다(generate_lyrics 참고). 요금에는 영향을 주지 않습니다.

기본값
지정되지 않음
제약 조건
minLength:1
maxLength:5000

작업 추적

HTTP 202는 접수되었다는 뜻이며 생성 완료가 아닙니다. 반환된 taskId를 저장하고 같은 작업을 조회하세요. 결과를 기다리는 동안 작업을 다시 생성하지 마세요.

접수 응답
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

접수 응답에 이번 예상 비용이 포함되므로 앱의 작업 기록과 청구 화면에 같은 금액을 표시할 수 있습니다.

작업 조회
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

약 2초 간격으로 시작해서 점점 간격을 넓히세요. 종료 상태가 나오면 멈추고, 연결이 끊겼더라도 원래 taskId를 그대로 조회하세요. 다시 생성할 때는 처음에 쓴 Idempotency-Key와 본문을 그대로 써야 합니다.

아니면 콜백이 찾아오게 하세요
import { verifyWebhook } from "@spicyapi/sdk";

// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
  const { payload } = verifyWebhook({
    rawBody: req.body,
    timestamp: req.header("X-Webhook-Timestamp"),
    signature: req.header("X-Webhook-Signature"),
    payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
    secret: process.env.SPICY_WEBHOOK_SECRET,
  });
  res.status(200).end();
  void handleFinishedTask(payload);
});

작업을 만들 때 callBackUrl을 넘기면 완료된 레코드가 POST로 전달됩니다 — 폴링 루프가 아예 필요 없습니다. 모든 전달에는 X-Webhook-Timestamp, X-Webhook-Signature, X-Webhook-Payload-Version이 함께 옵니다. 서명은 taskId.timestamp.sha256(body)에 대한 base64 HMAC-SHA256이므로 반드시 원본 바이트로 검증해야 합니다. JSON을 파싱했다가 다시 직렬화하면 바이트가 달라져 검증이 실패합니다. 실패한 전달은 재시도되므로 같은 taskId가 두 번 올 수 있습니다. 핸들러를 멱등하게 만드세요. 먼저 2xx로 답하고 처리는 그다음에 — 응답이 느리면 전달 실패로 간주됩니다.

결과 읽기

state가 succeeded일 때만 output을 사용하세요. 실패 시 errorCode, errorMessage, request_id로 원인을 확인하세요. 예시 비용과 상태는 실제 청구 내역이 아닙니다.

완료 응답 예시
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "suno/v6-mini/text-to-audio",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.mp3",
          "mime": "audio/mpeg",
          "url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp3?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
          "expiresAt": "2026-08-28T12:20:08.000Z"
        }
      ]
    },
    "cost": "0.750000",
    "settled": true,
    "createdAt": "2026-08-28T12:00:00Z",
    "completedAt": "2026-08-28T12:00:30Z"
  }
}

사용 가능한 파일은 assets[].url에서 바로 열거나 다운로드할 수 있으며 API Authorization 헤더가 필요하지 않습니다. 서명 URL은 expiresAt에 만료됩니다. 보관 기간 내에 작업을 다시 조회하면 URL이 갱신됩니다. 처리 중이거나 사용할 수 없는 파일에는 URL이 없습니다. 서명 URL은 비공개로 보관하세요.

SDK 및 연동

앱, 터미널, AI 어시스턴트 또는 시각적 워크플로에서 SpicyAPI를 사용하세요. 원하는 설정 가이드를 선택하세요.

ComfyUI에서 쓰기

ComfyUI Manager나 아래 명령으로 SpicyAPI 노드를 설치한 뒤 캔버스에서 Suno v6 Mini · Text to Music를 검색하세요. 노드는 이 페이지와 같은 옵션을 제공하며, 실행하기 전에 가격을 보여 줍니다.

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi