Timestamped lyrics API
Endpoint description
Timestamped lyrics retrieves word-level timestamps for a song, for synchronised lyric display.
Endpoint: POST /api/lyrics/timeline
Billing: Free (read-only query; nothing is charged and no generation task is created).
Return format: the timeline array is returned directly — there is no data / success wrapper; once parsed it is simply an array.
Request parameters
Headers
| Parameter | Type | Required | Notes |
|---|---|---|---|
| Authorization | string | yes | Bearer YOUR_API_KEY |
| Content-Type | string | yes | application/json |
Body parameters
| Parameter | Type | Required | Default | Notes |
|---|---|---|---|---|
| model | string | no | suno-v6 | Customer-facing model name: suno-v6, suno-v6-wild or suno-v6-mini |
| song_id | string | yes | - | Song ID |
Request example
curl -X POST https://www.suno-api.io/api/lyrics/timeline \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "suno-v6",
"song_id": "clip_id"
}'
Response
Below is a real production response for a 189.6-second suno-v6 song (that call had 69 segments; only the first and last few are kept here):
[
{
"word": "[Intro]\n\n\n[",
"start_s": 15,
"end_s": 15.04277,
"success": true,
"p_align": 0.99
},
{
"word": "Instrumental: ",
"start_s": 15.04704,
"end_s": 15.10264,
"success": true,
"p_align": 0.99
},
{
"word": "End]\n\n\n",
"start_s": 189.16974,
"end_s": 189.654,
"success": true,
"p_align": 0.99
}
]
Field reference
| Field | Type | Notes |
|---|---|---|
word |
string | The text of this segment; it carries its own line breaks: one lyric line per segment with \n at the segment end and \n\n between paragraphs, so purely whitespace entries occur |
start_s |
number | Segment start time in seconds (fractional) |
end_s |
number | Segment end time in seconds. The end_s of the final segment is essentially the song duration |
success |
boolean | Whether this segment was aligned successfully |
p_align |
number | Alignment confidence; measured steady at 0.99 |
Things to watch out for
- Do not look for a wrapper. The response is the array itself, not
{"data": ...}, and it has nosuccessfield. - There may be no segment at the start. For a song with a pure intro, measurement showed the first segment appearing only at second 15, and
start_sis not guaranteed to start from0; for karaoke, handle the leading gap yourself. - Instrumental and structure markers are returned too, in forms such as
[Intro],[Verse 1],Instrumental: soft arpeggiating piano, …and[End], also with word-level timing. Before building lyric subtitles, filter these segments out by a leading[or byInstrumental, otherwise arrangement descriptions will be shown as lyrics. - It is per word, not per line. The same lyric line is often split into several segments and must be merged into lines by
\n; a line's time is thestart_sof its first segment. - The number of segments depends on the song; do not assume a fixed count (measured: a 189.6-second song had 69 segments and a response body of about 6.5 KB).
Generating a .lrc file
This endpoint only returns timeline data; it does not return a file directly. When you need .lrc, build lines from the returned start_s in [mm:ss.cc] format (the word field carries its own line breaks — split by line and skip empty lines). For an example see "How to get timestamped lyrics (.lrc)" in the song media download and preview API.
Below is a complete version with instrumental/structure marker filtering (one segment per line, good for verifying the data shape first):
import re
SKIP = re.compile(r"^\[.*\]$|^Instrumental:")
def to_lrc(segments):
lines = []
for seg in segments:
if not seg.get("success", True):
continue
text = (seg.get("word") or "").strip()
if not text or SKIP.match(text):
continue
cs = int(max(0.0, float(seg["start_s"])) * 100 + 0.5)
lines.append(f"[{cs // 6000:02d}:{(cs % 6000) // 100:02d}.{cs % 100:02d}]{text}")
return "\n".join(lines)
Compatibility notes
Older documentation used a { success, song_id, lyrics: [...] } wrapper example. The current documentation takes the directly returned timeline array as authoritative.
Get an API key
Create an API key in the console after signing up. ¥0.6 per run returns 2 tracks, downloads are unlimited, and no phone number is required.
Get API key Back to overview