On this page
- A job whose
statusissucceeded. See Track a job.
Read the result
/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.
{
"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 } }| Field | Type | Meaning |
|---|---|---|
| stems[].name | string | Duplex: two entries, _spk1 before _spk2; which person lands on which is arbitrary. Dominant: one per input, named after it, plus ambience. |
| stems[].si_sdr | float | null | An SI-SDR estimate in dB from a no-reference model. Null when scoring was off, and always null on Dominant jobs. |
| sample_rate | int | A job configured for super_resolution writes 48000; one configured without it writes 16000. Dominant output is 24000. Read the field. |
| billed_seconds, billed_usd | float | What was charged: the quoted figure, on success only. |
curl -H "Authorization: Bearer $DUETA_API_KEY" https://dueta.ai/v1/jobs/$JOB_ID | jq '.result'Download a track
/v1/jobs/{id}/stems/{name}?format=wav|flacThe 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.
# 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
/v1/jobs/{id}/archiveEvery 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.
# 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
/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.
# 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
formatis something other thanwavorflac. 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.