Skip to content
TutujinAPI

API reference

Suno music

Asynchronous Suno API — POST /suno/submit/music writes songs, POST /suno/submit/lyrics writes lyrics, GET /suno/fetch/{task_id} returns the result. SunoAPI-compatible; examples for inspiration mode, custom mode and extending a song, with per-call pricing.

Suno works as an asynchronous task API: submit a task, get its ID, then poll until generation finishes. Paths and fields follow the SunoAPI format, so existing code only needs https://www.tutujin.com as its address and a key from this site.

POSThttps://www.tutujin.com/suno/submit/music

Headers

HeaderRequiredDescription
AuthorizationYesBearer sk-..., an API key from the console
Content-TypeYesapplication/json

The body has no model field; each endpoint is billed as its own model:

EndpointPurposeBilled as
POST /suno/submit/musicWrite songs, two per callsuno_music
POST /suno/submit/lyricsWrite lyricssuno_lyrics
GET /suno/fetch/{task_id}Get one taskFree
POST /suno/fetchGet several tasks with {"ids": [...]}Free

Request body

/suno/submit/music takes either a one-sentence description (inspiration mode) or your own lyrics, title and style (custom mode).

ParameterTypeDescription
gpt_description_promptstringInspiration mode: describe the song in one sentence; lyrics and style are generated
promptstringCustom mode: the full lyrics. For /suno/submit/lyrics, the topic
mvstringSuno model version, e.g. chirp-v4. Without it an older default is used, so always set it
titlestringSong title (custom mode)
tagsstringStyle tags such as pop, piano (custom mode)
make_instrumentalbooleantrue for instrumental music without vocals
taskstringextend to continue a song
continue_clip_idstringClip ID of the song to continue
continue_atnumberWhere to continue from, in seconds

Request example

curl https://www.tutujin.com/suno/submit/music \
  -H "Authorization: Bearer $TUTUJIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "gpt_description_prompt": "An upbeat summer pop song about the beach, female vocals",
    "mv": "chirp-v4",
    "make_instrumental": false
  }'

# poll with the task ID returned in "data"
curl https://www.tutujin.com/suno/fetch/$TASK_ID \
  -H "Authorization: Bearer $TUTUJIN_API_KEY"

A song usually takes one to a few minutes; polling every 10 seconds or so is enough. For lyrics only, call /suno/submit/lyrics with {"prompt": "topic"}; the result is in data.data.text.

Response example

Submitted:

JSON
{ "code": "success", "data": "task_xxxxxxxxxxxxxxxx", "message": "" }

Task (songs):

JSON
{
  "code": "success",
  "data": {
    "task_id": "task_xxxxxxxxxxxxxxxx",
    "status": "SUCCESS",
    "fail_reason": "",
    "data": [
      { "id": "…", "title": "Summer Breeze", "audio_url": "https://…/song.mp3", "image_url": "https://…/cover.jpeg" },
      { "id": "…", "title": "Summer Breeze", "audio_url": "https://…/song.mp3", "image_url": "https://…/cover.jpeg" }
    ]
  }
}
FieldDescription
data (submit)Task ID
data.statusNOT_START, SUBMITTED, QUEUED, IN_PROGRESS, SUCCESS, FAILURE
data.fail_reasonWhy the task failed
data.dataSongs: an array of two clips (audio_url audio, image_url cover). Lyrics: an object with title and text

Billing

  • Per call: /suno/submit/music is billed as suno_music (two songs per call) and /suno/submit/lyrics as suno_lyrics; prices are in the list below.
  • A rejected submit costs nothing and a task that ends in failure is refunded. Polling is free.

Notes

  • The API is asynchronous: store the task ID and poll, or check back later, instead of holding one request open.
  • Only songs and lyrics are available for now; concatenation, stems, audio upload and other Suno features are not.
  • Audio and cover URLs are for short-term use; download them into your own storage.
  • Lyrics or descriptions that trip moderation make the task fail. Change them and submit again.

Models that support this endpoint

ModelVendorCheapest groupInput ¥/1MOutput ¥/1MPer request ¥
Suno LyricsSunoStandard——¥0.02
Suno MusicSunoStandard——¥1

Prices in CNY, cheapest group for each model; updated Nov 13, 2026, 6:08 PM.

Still stuck? Add our WeChat support JsnonoChat and send the request id from the error message, and we will look into it.