Extract stems from a song

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

Split a song you generated into separate tracks, the same as Extract Stems on mureka.ai. There are two modes:

all_stems What you get Cost
true (default) All detected stems — up to 12 separate instrument and vocal tracks, plus MIDI 100 Mureka Gold
false Vocals + Instrumental 20 Mureka Gold

Each stem comes back as a .wav and an .mp3 link. Extraction takes about a minute for a 3-minute song (40 to 70 seconds in our tests).

Every call starts a new extraction and is charged again, even for a song you already extracted. Keep the stems_id of a finished extraction and use it with POST /music/stems-download instead of extracting the same song twice.

Once the job is completed, pass its stems_id to POST /music/stems-download for a single stem with its MIDI, ZIP archives of all stems and all MIDI, or a ready-made session for Ableton Live, Logic Pro, Pro Tools or Cubase. Those downloads are free.

POST /music/download with type stem still returns the basic stems package of a song, with no extraction job.

Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
Request Body
{
    "song_id": "user:777-mureka:12345678901234-song:33445566",
    "all_stems": true
}
  • song_id is required.
    The song_id value returned by one of the following endpoints:

    The song’s own account runs the extraction, so there is no account parameter.

  • all_stems is optional (default: true).
    true extracts all detected stems, up to 12 tracks plus MIDI, for 100 Mureka Gold. The stems Mureka finds depend on the song. Names seen so far are bass, brass_and_winds, drums, guitar, other (shown as FX on mureka.ai), piano (Keyboard on mureka.ai), strings, synth and vocal.
    false extracts Vocals + Instrumental only, for 20 Mureka Gold. It returns two stems, instrumental and vocal, and both have MIDI.

  • async is optional, enables fire-and-forget mode (default: false). When true, returns immediately with 201 Created and job metadata. Poll GET /jobs/jobid for completion status.
    Without async the call waits for the extraction to finish and returns 200 with the completed job. If the extraction is still running after about 4 minutes, it returns 201 with the job still created — keep polling GET /jobs/jobid until it completes.
    A failed extraction returns the failed job, with its code as the HTTP status. A job still extracting after 10 minutes is marked failed.

  • replyUrl is optional, webhook URL for job status callbacks. Receives a POST request when the job ends as completed or failed. The JSON payload shape matches GET /jobs/jobid response.
    If no callback arrives within about 5 minutes, poll GET /jobs/jobid — an extraction that runs that long is finished by the poll, not by a callback.

  • replyRef is optional, custom reference string passed back in webhook callbacks. Useful for tracking jobs on your end.
Responses
  • 200 OK

    Extraction completed. Each stem has a .wav and an .mp3 link.

    Real response, ids shortened (a 3:15 song, 9 stems, 67 seconds).

    {
        "jobid": "j1010023903143042515m-u777-a12345678901234-bot:mureka",
        "verb": "music/stems",
        "jobType": "music",
        "status": "completed",
        "created": "2026-10-10T02:39:03.143Z",
        "request": {
            "song_id": 33445566,
            "all_stems": true,
            "account": "12345678901234"
        },
        "response": {
            "stems_id": "user:777-mureka:12345678901234-song:33445566-stems:55667788",
            "song_id": "user:777-mureka:12345678901234-song:33445566",
            "all_stems": true,
            "bpm": 120,
            "status": "completed",
            "generate_state": 1,
            "stems": [
                {
                    "stem_name": "bass",
                    "wav": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/bass.wav",
                    "mp3": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/<id>.mp3"
                },
                {
                    "stem_name": "brass_and_winds",
                    "wav": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/brass_and_winds.wav",
                    "mp3": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/<id>.mp3"
                },
                {
                    "stem_name": "drums",
                    "wav": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/drums.wav",
                    "mp3": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/<id>.mp3"
                },
                {
                    "stem_name": "guitar",
                    "wav": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/guitar.wav",
                    "mp3": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/<id>.mp3"
                },
                {
                    "stem_name": "other",
                    "wav": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/other.wav",
                    "mp3": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/<id>.mp3"
                },
                {
                    "stem_name": "piano",
                    "wav": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/piano.wav",
                    "mp3": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/<id>.mp3"
                },
                {
                    "stem_name": "strings",
                    "wav": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/strings.wav",
                    "mp3": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/<id>.mp3"
                },
                {
                    "stem_name": "synth",
                    "wav": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/synth.wav",
                    "mp3": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/<id>.mp3"
                },
                {
                    "stem_name": "vocal",
                    "wav": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/vocal.wav",
                    "mp3": "https://static-cos.mureka.ai/cos-prod/song/audio/20261010/<id>/<id>.mp3"
                }
            ]
        },
        "updated": "2026-10-10T02:40:09.871Z"
    }
    
  • 201 Created

    Job created in async mode (async: true), or a sync call that was still extracting after about 4 minutes. The extraction is processing in the background.

    Use GET /jobs/jobid to poll for completion status.

    {
        "jobid": "j1009123456789475905m-u777-a12345678901234-bot:mureka",
        "verb": "music/stems",
        "jobType": "music",
        "status": "created",
        "created": "2026-10-09T12:34:56.789Z",
        "request": {
            "song_id": 33445566,
            "all_stems": true,
            "async": true,
            "replyUrl": "https://your-domain.com/webhook",
            "replyRef": "my-custom-ref-123",
            "account": "12345678901234"
        },
        "response": {
            "stems_id": "user:777-mureka:12345678901234-song:33445566-stems:55667788",
            "song_id": "user:777-mureka:12345678901234-song:33445566",
            "all_stems": true,
            "status": "processing",
            "generate_state": 3
        }
    }
    
  • 400 Bad Request

    {
      "error": "<Error message>",
      "code": 400
    }
    
  • 401 Unauthorized

    {
      "error": "Wrong username/password combination.",
      "code": 401
    }
    
  • 412 Precondition Failed

    The account does not have enough Mureka Gold for the extraction (100 for all stems, 20 for Vocals + Instrumental).

    {
      "error": "User balance is not enough to operate (6310)",
      "code": 412
    }
    
  • 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
  • Both sync and async calls return the job record. Structure matches GET /jobs/jobid response.

    {
        jobid: string                              // Job identifier
        verb: 'music/stems'                        // Job verb
        jobType: 'music'                           // Job type
        status: 'created' | 'completed' | 'failed'
        created: string                            // ISO 8601 timestamp
        updated?: string                           // ISO 8601 timestamp, once the job ends
        request: {
            song_id: number                        // Decoded Mureka id, not the user:…-song:… form
            all_stems: boolean
            account: string
            async?: boolean
            replyUrl?: string
            replyRef?: string
        }
        response?: {
            stems_id: string                       // Pass to POST /music/stems-download
            song_id: string
            all_stems?: boolean
            bpm?: number
            status: 'processing' | 'completed'
            generate_state?: number                // Mureka's own state: 3 while extracting, 1 when done
            stems?: {                              // Present when completed
                stem_name: string                  // e.g. vocal, drums, bass, other
                wav: string | null
                mp3: string | null
            }[]
        }
        error?: string                             // Present when failed
        code?: number                              // Present when failed
    }
    
  • Error response structure (applies to both sync and async modes).

    {
        jobid?: string                             // Present for job-related errors
        error: string                              // Error summary message
        code?: number                              // HTTP status code or error code
        msg?: string                               // Additional error message
    }
    
Examples
  • curl -H "Accept: application/json" \
         -H "Content-Type: application/json" \
         -H "Authorization: Bearer …" \
         -X POST https://api.useapi.net/v1/mureka/music/stems \
         -d '{"song_id": "…", "all_stems": true}'
    
  • const song_id = "user:777-mureka:12345678901234-song:33445566";
    const all_stems = true;
    const apiUrl = `https://api.useapi.net/v1/mureka/music/stems`; 
    const api_token = "API token";
    const data = { 
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${api_token}`,
        'Content-Type': 'application/json' }
    };
    data.body = JSON.stringify({ 
      song_id, all_stems
    });
    const response = await fetch(apiUrl, data);
    const result = await response.json();
    console.log("response", {response, result});
    
  • import requests
    song_id = "user:777-mureka:12345678901234-song:33445566"
    all_stems = True
    apiUrl = f"https://api.useapi.net/v1/mureka/music/stems" 
    api_token = "API token"
    headers = {
        "Content-Type": "application/json", 
        "Authorization" : f"Bearer {api_token}"
    }
    body = {
        "song_id": song_id,
        "all_stems": all_stems
    }
    response = requests.post(apiUrl, headers=headers, json=body)
    print(response, response.json())
    
Try It

Extraction takes about a minute for a 3-minute song (40 to 70 seconds in our tests).