Download extracted stems

October 9, 2026

Table of contents

  1. Request Headers
  2. Request Body
  3. Responses
  4. Model
  5. Examples
  6. Try It

https://api.useapi.net/v1/mureka/music/stems-download

Get download links for the stems of a finished POST /music/stems extraction. Downloads are free. What you get depends on the parameters you send:

Parameters Returns
stems_id only audio_zip with every stem as audio, and midi_zip with every MIDI track
stems_id + stem_name One stem: its wav and its midi
stems_id + daw url of a session for Ableton Live, Logic Pro, Pro Tools or Cubase

The .wav and .mp3 links of each stem are already in the POST /music/stems job response, so you only need this endpoint for MIDI, the ZIP archives or a DAW session.

Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
Request Body
{
    "stems_id": "user:777-mureka:12345678901234-song:33445566-stems:55667788",
    "stem_name": "drums"
}
  • stems_id is required, the response.stems_id value returned by POST /music/stems or GET /jobs/jobid.
    The extraction must be completed, otherwise the call returns 409.

  • stem_name is optional, one stem from the stems list of the extraction, such as vocal, drums, bass or other.
    Returns that stem’s wav and midi links. midi is null when Mureka has no MIDI for that stem (seen once for other, FX on mureka.ai, on some songs). A name the extraction does not have returns 400, with the available names in the error message.

  • daw is optional, builds a session you open directly in your DAW.
    Supported values: ableton, logic, protools, cubase.
    ableton, logic and protools return a .zip, cubase returns a .dawproject file. logic and protools return the same file.

stem_name and daw can not be used together.

Responses
  • 200 OK

    With stems_id only:

    {
        "stems_id": "user:777-mureka:12345678901234-song:33445566-stems:55667788",
        "audio_zip": "https://static-cos.mureka.ai/<stems>.zip",
        "midi_zip": "https://static-cos.mureka.ai/<midi>.zip"
    }
    

    With stem_name:

    {
        "stems_id": "user:777-mureka:12345678901234-song:33445566-stems:55667788",
        "stem_name": "drums",
        "wav": "https://static-cos.mureka.ai/<drums>.wav",
        "midi": "https://static-cos.mureka.ai/<drums-midi>"
    }
    

    With daw:

    {
        "stems_id": "user:777-mureka:12345678901234-song:33445566-stems:55667788",
        "daw": "ableton",
        "url": "https://static-cos.mureka.ai/<session>.zip"
    }
    
  • 400 Bad Request

    Returned for a malformed stems_id, for stem_name and daw sent together, or for a stem_name the extraction does not have.

    {
      "error": "Parameter stem_name (piano) not found, this extraction has vocal, drums, bass, other",
      "code": 400
    }
    
  • 401 Unauthorized

    {
      "error": "Wrong username/password combination.",
      "code": 401
    }
    
  • 409 Conflict

    The extraction is still running. Poll GET /jobs/jobid until it is completed, then retry.

    {
      "error": "Stems extraction is not completed yet (generate_state 3), poll GET /jobs/{jobid}",
      "code": 409
    }
    
  • 503 Service Unavailable

    Mureka builds a DAW session on request. If it is still not ready after a few retries, the call returns 503. Retry shortly.

    {
      "error": "DAW session ableton is not ready yet (state <n>), please retry shortly",
      "code": 503
    }
    
  • 596 Account Error

    Returned when the account has an error state preventing API calls.

    {
        "error": "Session refresh failed 2026-01-19T14:31:15.000Z, manual update required",
        "code": "REFRESH_FAILED"
    }
    

    Possible error codes:

    • ACCOUNT_ERROR - Account has a blocking error
    • REFRESH_FAILED - Automatic token refresh failed
    • REFRESH_IN_PROGRESS - Token refresh already in progress, retry shortly
    • SESSION_EXPIRED - Session expired and no auto-refresh available
    • COOKIE_EXPIRED - Google cookie has expired

    To resolve, update your account configuration via POST /accounts.

Model
{ // TypeScript, all fields are optional
  stems_id: string
  // stems_id only
  audio_zip: string | null
  midi_zip: string | null
  // stem_name
  stem_name: string
  wav: string | null
  midi: string | null                          // null for a stem without MIDI
  // daw
  daw: 'ableton' | 'logic' | 'protools' | 'cubase'
  url: string                                  // .zip, or .dawproject for cubase
}
Examples
  • curl -H "Accept: application/json" \
         -H "Content-Type: application/json" \
         -H "Authorization: Bearer …" \
         -X POST https://api.useapi.net/v1/mureka/music/stems-download \
         -d '{"stems_id": "…", "stem_name": "drums"}'
    
  • const stems_id = "user:777-mureka:12345678901234-song:33445566-stems:55667788";
    const stem_name = "drums";
    const apiUrl = `https://api.useapi.net/v1/mureka/music/stems-download`; 
    const api_token = "API token";
    const data = { 
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${api_token}`,
        'Content-Type': 'application/json' }
    };
    data.body = JSON.stringify({ 
      stems_id, stem_name
    });
    const response = await fetch(apiUrl, data);
    const result = await response.json();
    console.log("response", {response, result});
    
  • import requests
    stems_id = "user:777-mureka:12345678901234-song:33445566-stems:55667788"
    stem_name = "drums"
    apiUrl = f"https://api.useapi.net/v1/mureka/music/stems-download" 
    api_token = "API token"
    headers = {
        "Content-Type": "application/json", 
        "Authorization" : f"Bearer {api_token}"
    }
    body = {
        "stems_id": stems_id,
        "stem_name": stem_name
    }
    response = requests.post(apiUrl, headers=headers, json=body)
    print(response, response.json())
    
Try It