Check music generation status and results
May 15, 2025 (November 2, 2026)
Table of contents
This endpoint checks the status of a previously submitted music generation job. The job_id is returned from POST music/song or POST music/instrumental.
https://api.useapi.net/v1/tempolor/music/
job_id
Request Headers
Authorization: Bearer {API token}
API tokenis required, see Setup useapi.net for details.
Path Parameters
job_idis required. The job returned from a previous POST music/song or POST music/instrumental request.
Status Values
The response includes a status field with the following possible values:
| status | status_name | status_final | Description |
|---|---|---|---|
| 0…9 | GENERATING | False | The music is still being generated |
| 10…29 | FAILED | True | The music generation has failed, e.g. 11 failed on TemPolor’s side, 12 rejected by content moderation |
| 30+ | COMPLETED | True | The music has been successfully generated |
A failed generation can be retried on the TemPolor website, where it keeps the same job_id. Otherwise submit a new request.
When the status is COMPLETED, you can download the music using the GET music/download/job_id endpoint.
Responses
-
Example Response
{ "bizType": "ai_material_music", "childType": "lyric_to_material", "matChildType": "lyric_to_material", "sourceType": "sm_user_gen", "itemId": "abcdef123456789", "job_id": "user:12345-tempolor:user_id-job:abcdef123456789", "genItemId": "abcdef123456789", "userId": "user_id", "titleEn": "Epic Orchestral", "cover": "https://example.com/cover.png", "mp3OssId": "ai_material/ai_material/mp3/abcdef123456789.mp3", "wavOssId": "ai_material/ai_material/wav/abcdef123456789.wav", "ossWatermarkMp3": "", "officialPlaylistSong": false, "status": 30, "status_name": "COMPLETED", "status_final": true, "progress": 100, "downloadTotal": 0, "likeTotal": 0, "collectTotal": 0, "musicMaterial": { "style": "Orchestral", "chord": "", "mood": "", "inst": "", "instInfo": "", "scene": "", "otherInfo": "A cinematic orchestral piece with dramatic string sections", "otherInfoCn": "", "key": "F:minor", "bpm": 130, "dur": 180, "seed": 1234567890, "waveformUrl": "https://example.com/waveform.json" }, "readStatus": false, "downloadStatus": false, "createTime": 1716565425000, "updateTime": 1716565700000, "materialQualityScore": 0, "ltmMaterialExtendDto": { "lyricsPrompt": "Sample lyrics here", "description": "A cinematic orchestral piece with dramatic string sections", "ltmVocalModel": false, "ltmMidiModel": false, "genItemId": "abcdef123456789", "prompt": "A cinematic orchestral piece with dramatic string sections", "genMode": 0, "model": "tempolor-2s-v5", "modelShowName": "v4.8" }, "editType": "gen", "operatorType": "gen", "rootItemId": "abcdef123456789", "parentItemId": "abcdef123456789", "canExtend": true, "canEditLyrics": true, "canFixVocals": true, "canReplaced": false } -
{ "error": "job_id has incorrect format", "code": 400 } -
{ "error": "Unauthorized", "code": 401 } -
{ "error": "No record found for user:12345-tempolor:user_id-job:abcdef123456789", "code": 404 } -
596 Account signed out
TemPolor signed the account out, so its session ticket no longer works. The API stops using the account until you add it again with fresh credentials at POST accounts, see Setup TemPolor. Requests without
user_iduse your other accounts in the meantime.{ "error": "TemPolor signed out account 101441809 (You are currently logged out (400006)). Add it again with POST /v1/tempolor/accounts using fresh credentials, see https://useapi.net/docs/start-here/setup-tempolor", "code": 596 }If every account you have is in this state, a request without
user_idreturns 596 as well.
Model
{ // TypeScript, all fields are optional
bizType: string
childType: string
matChildType: string
sourceType: string
itemId: string
job_id: string
genItemId: string
userId: string
titleEn: string
cover: string
mp3OssId: string
wavOssId: string
ossWatermarkMp3: string
status: number
status_name: string // "GENERATING", "FAILED", "COMPLETED"
status_final: boolean
progress: number
downloadTotal: number
likeTotal: number
collectTotal: number
musicMaterial: {
style: string
chord: string
mood: string
inst: string
instInfo: string
scene: string
otherInfo: string
otherInfoCn: string
key: string
bpm: number
dur: number
seed: number
}
createTime: number
updateTime: number
ltmMaterialExtendDto: {
lyricsPrompt: string
description: string
prompt: string
genMode: number
model: string
}
editType: string
operatorType: string
canExtend: boolean
error: string
code: number
}
Examples
-
curl -H "Authorization: Bearer …" \ https://api.useapi.net/v1/tempolor/music/user:12345-tempolor:user_id-job:abcdef123456789 -
const job_id = "user:12345-tempolor:user_id-job:abcdef123456789"; const token = "API token"; const apiUrl = `https://api.useapi.net/v1/tempolor/music/${job_id}`; const response = await fetch(apiUrl, { method: "GET", headers: { "Authorization": `Bearer ${token}` } }); const result = await response.json(); console.log("response", {response, result}); // Polling example - check status every 10 seconds until completed or failed async function pollJobStatus(job_id) { const apiUrl = `https://api.useapi.net/v1/tempolor/music/${job_id}`; while (true) { const response = await fetch(apiUrl, { method: "GET", headers: { "Authorization": `Bearer ${token}` } }); const result = await response.json(); console.log(`Job status: ${result.status_name}, Progress: ${result.progress}%`); if (result.status_final) { console.log(`Music generation ${result.status_name.toLowerCase()}`); return result; } // Wait 10 seconds before checking again await new Promise(resolve => setTimeout(resolve, 10000)); } } -
import requests import time job_id = "user:12345-tempolor:user_id-job:abcdef123456789" token = "API token" apiUrl = f"https://api.useapi.net/v1/tempolor/music/{job_id}" headers = { "Authorization": f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response.status_code, response.json()) # Polling example - check status every 10 seconds until completed or failed def poll_job_status(job_id): apiUrl = f"https://api.useapi.net/v1/tempolor/music/{job_id}" while True: response = requests.get(apiUrl, headers=headers) result = response.json() print(f"Job status: {result.get('status_name')}, Progress: {result.get('progress')}%") if result.get('status_final'): print(f"Music generation {result.get('status_name').lower()}") return result # Wait 10 seconds before checking again time.sleep(10)