Check music generation status and results

May 15, 2025

Table of contents

  1. Request Headers
  2. Path Parameters
  3. Status Values
  4. Responses
  5. Model
  6. Examples
  7. Try It

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}
Path Parameters
Status Values

The response includes a status field with the following possible values:

status status_name status_final Description
0 GENERATING False The music is still being generated
10 FAILED True The music generation has failed
30 COMPLETED True The music has been successfully generated

When the status is COMPLETED, you can download the music using the GET music/download/job_id endpoint.

Responses
  • 200 OK

    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": "v1-dit-obleck-stereo-zh-en-270-wf",
        "modelShowName": "v3.5"
      },
      "editType": "gen",
      "operatorType": "gen",
      "rootItemId": "abcdef123456789",
      "parentItemId": "abcdef123456789",
      "canExtend": true,
      "canEditLyrics": true,
      "canFixVocals": true,
      "canReplaced": false
    }
    
  • 400 Bad Request

    {
      "error": "job_id has incorrect format",
      "code": 400
    }
    
  • 401 Unauthorized

    {
      "error": "Unauthorized",
      "code": 401
    }
    
  • 404 Not Found

    {
      "error": "No record found for user:12345-tempolor:user_id-job:abcdef123456789",
      "code": 404
    }
    
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)
    
Try It