Skip to content
DUETA
Docs

Get results

Read the stems off a succeeded job and download them as WAV, FLAC, or one ZIP.

On this page
You need

Read the result

GET/v1/jobs/{id}

result.stems[] carries names, not URLs. Take every name from it rather than composing one: a Duplex stem name starts from the upload's stem and gains one suffix per phase it passed through, so the ending depends on the toggles.

json
{
  "status": "succeeded",
  "stage": "done",
  "progress": 1,
  "billed_seconds": 612.4,
  "billed_usd": 5.1,
  "result": {
    "stems": [
      { "name": "conversation-00_vocals_spk1_enh_48k", "si_sdr": 14.8 },
      { "name": "conversation-00_vocals_spk2_enh_48k", "si_sdr": 14.8 }
    ],
    "sample_rate": 48000
  }
}

// A Dominant job: one stem per input, named after it, plus the room.
{ "result": { "stems": [ { "name": "alice-00", "si_sdr": null },
                         { "name": "bob-01",   "si_sdr": null },
                         { "name": "ambience", "si_sdr": null } ],
              "sample_rate": 24000 } }
FieldTypeMeaning
stems[].namestringDuplex: two entries, _spk1 before _spk2; which person lands on which is arbitrary. Dominant: one per input, named after it, plus ambience.
stems[].si_sdrfloat | nullAn SI-SDR estimate in dB from a no-reference model. Null when scoring was off, and always null on Dominant jobs.
sample_rateintA job configured for super_resolution writes 48000; one configured without it writes 16000. Dominant output is 24000. Read the field.
billed_seconds, billed_usdfloatWhat was charged: the quoted figure, on success only.
bash
curl -H "Authorization: Bearer $DUETA_API_KEY" https://dueta.ai/v1/jobs/$JOB_ID | jq '.result'

Download a track

GET/v1/jobs/{id}/stems/{name}?format=wav|flac

The default is the rendered WAV, byte for byte. format=flac transcodes to FLAC on the way out: the same samples, losslessly, at about half the size. The response is authenticated, so fetch the bytes rather than pointing an <audio> element at the URL. It is served no-store.

bash
# WAV, byte for byte as rendered:
curl -H "Authorization: Bearer $DUETA_API_KEY" -o track.wav "https://dueta.ai/v1/jobs/$JOB_ID/stems/$STEM_NAME"

# FLAC, the same samples losslessly at about half the size:
curl -H "Authorization: Bearer $DUETA_API_KEY" -o track.flac "https://dueta.ai/v1/jobs/$JOB_ID/stems/$STEM_NAME?format=flac"

Download everything

GET/v1/jobs/{id}/archive

Every stem as one ZIP, streamed as it is built, so there is no Content-Length. A client that wants a percentage has to count what has arrived.

bash
# Streamed, so there is no Content-Length; progress is what has arrived.
curl -H "Authorization: Bearer $DUETA_API_KEY" -o result.zip "https://dueta.ai/v1/jobs/$JOB_ID/archive"

Download the original

GET/v1/jobs/{id}/inputs/{name}

The recording the job was made from, in the container it arrived in. name is inputs[].stem or the stored filename. Available for the whole life of the job, not only after it succeeds, so a result can always be played against its source.

bash
# name is inputs[].stem ("conversation-00") or the stored filename.
curl -H "Authorization: Bearer $DUETA_API_KEY" -o original.wav "https://dueta.ai/v1/jobs/$JOB_ID/inputs/conversation-00"

Cases

404
The job has not succeeded, the stem name is not in result.stems[], or the files were pruned after the retention window.
422
format is something other than wav or flac. There is no MP3.
503 / 504
FLAC could not be produced, or took too long. The WAV download is unaffected.
Retention
Stems and inputs are kept for 7 days after the job finishes, then deleted. Download what you need before then; the job record itself stays.
Redirect
A stem may be answered with a 302 to a short-lived object-store URL. Follow redirects.
Loudness
Stems are rendered at the level the model produced; a track that is entirely below the loudness floor fails the job as silent output rather than producing an empty file.