Retrieve a song’s score
November 14, 2026
Table of contents
Get the score of a finished song in ABC notation: the vocal melody, an instrumental line, chords and sections, which any ABC tool turns into sheet music or MIDI. It works on every ACE Music plan, the Free plan included.
ACE Music reads the score from the song on the first request and keeps it with the song. ACE Music v1.1 Preview songs come with their score already, because that model writes one before the audio. Reading the score of an ACE-Step v1.5 XL song costs 1 credit the first time, and ACE Music v1 songs cost nothing in our tests. The API waits up to a minute for the reading, then answers 202: call again a minute later.
ACE Music v1.1 follows a song’s melody from its score. A cover or mashup on POST /music reads the score of an ACE Music v1 song that has none by itself, for free. An ACE-Step song is not read automatically: when a cover or mashup of it fails with ref_no_melody, call this endpoint on the song first (1 credit), then send the request again. On a paid plan the same score downloads as MusicXML with GET /music/download and format=musicxml.
https://api.useapi.net/v1/acemusic/music/score?songId=
songId
Request Headers
Authorization: Bearer {API token}
API tokenis required, see Setup useapi.net for details.
Query Parameters
songIdis required, a finished song’ssongId(user:<id>-<email>-song:so_…), URL-encoded.
Responses
-
{ "songId": "user:[email protected]:so_4e7b2c9d0a5f4183b6d8e2c7", "abc": "X:1\nT:\nM:4/4\nL:1/16\nQ:1/4=142\nV: Vocal clef=treble name=\"Vocal Melody\" snm=\"Vocal\"\nV: Ins clef=treble name=\"Ins Melody\" snm=\"Inst.\"\nK:G\n% intro\nV: Vocal\nz8\"G\"z8|\"G\"z16|\"G\"z16|\"G\"z16|\nV: Ins\nZ|z2GABGDGcGDBGGAG|BGGAGGBGcGGBGGAG|g3a3b2c'3b3g2|\n% verse\nV: Vocal\n\"G\"b8z2a2b2c'2|\"C\"c'8e6d2|\"G\"d16|\"G\"z8g4a4|\n…", "musicxml": "GET /music/download?songId=user%3A1234-example%40example.com-song%3Aso_4e7b2c9d0a5f4183b6d8e2c7&format=musicxml (paid plans)" } -
ACE Music is still reading the score. Call again in a minute.
{ "songId": "user:[email protected]:so_4e7b2c9d0a5f4183b6d8e2c7", "status": "processing", "message": "ACE Music is still reading the score: call again in a minute" } -
{ "error": "Parameter songId is required", "code": 400 } -
Invalid API token.
{ "error": "useapi.net ⁝ Unauthorized", "code": 401 } -
The song was deleted, or its account is not connected.
-
The song is not finished, or it failed.
-
The account has no credit left to read an ACE-Step song’s score.
-
{ "error": "ACE Music could not read a score from song user:[email protected]:so_4e7b2c9d0a5f4183b6d8e2c7", "code": 422 }
Model
{ // TypeScript, all fields are optional
songId: string
abc?: string // the score in ABC notation: header, a Vocal and an Ins voice, chords in quotes, % sections
musicxml?: string // how to get the same score as MusicXML (paid plans)
status?: 'processing' // 202
message?: string // 202
}
Examples
-
SONGID="user:[email protected]:so_4e7b2c9d0a5f4183b6d8e2c7" curl -H "Authorization: Bearer …" \ "https://api.useapi.net/v1/acemusic/music/score?songId=$(python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1],safe=''))" "$SONGID")" -
const token = "API token"; const songId = "user:[email protected]:so_4e7b2c9d0a5f4183b6d8e2c7"; const response = await fetch(`https://api.useapi.net/v1/acemusic/music/score?${new URLSearchParams({ songId })}`, { headers: { "Authorization": `Bearer ${token}` } }); const result = await response.json(); console.log(response.status, result.abc ?? result.message); -
import requests token = "API token" songId = "user:[email protected]:so_4e7b2c9d0a5f4183b6d8e2c7" response = requests.get("https://api.useapi.net/v1/acemusic/music/score", headers={"Authorization": f"Bearer {token}"}, params={"songId": songId}) result = response.json() print(response.status_code, result.get("abc") or result)