Conversions
Create a conversion, upload the master, follow it to ready, download the IAMF.
Lifecycle
A conversion moves through uploading, analyzing and analyzed, optionally waits (waiting for your own account's queue, queued for converter capacity), then running, and ends in ready or error. ready and error are terminal. A wait in queued or waiting is designed behaviour, however long it lasts; it is not a stall. stage names a finer step inside a status, and progress is a whole number from 0 to 100.
With a preset on create, the encode starts by itself once analysis completes and you only need to wait for ready. Without one, call analyze, read the result, then call start.
Guides: statuses and what to do in each, presets and programmes, auto-start and the two-step flow, idempotency, uploading large masters and retention.
Operations
POST Create a conversion and get an upload URL
POST /v1/conversions
Returns a presigned PUT URL for the master. With preset the job auto-starts once the upload lands (analysis still runs; it just doesn't stop to ask). Without it, call analyze then start. Always send Idempotency-Key: a retried create with the same key returns the first job (duplicate: true) and never burns a second slot or a second slice of quota. Masters over 5 GiB cannot use uploadUrl (storage caps a single PUT at 5 GiB): use the multipart calls. The SDK does this for any master over 16 MiB.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | string | no | Any unique string per logical create. Reuse on retry. At most 255 characters. |
Request body · CreateConversionRequest
| Field | Type | Required | Description |
|---|---|---|---|
filename | string | yes | Echoed back as name. At most 255 characters. |
durationSec | number | yes | Source duration, used to reserve minutes up front. Cap: 180 minutes per file. |
sizeBytes | integer | no | Source size in bytes. Optional, but send it: a source over 107374182400 bytes is refused here (file-too-large) instead of failing after the upload. |
preset | esfera | youtube | bed714_3oa | oa3 | no | Supply to auto-start once the upload lands. Omit for the two-step flow. A preset the analysed source cannot take (the 3OA scene presets for a 1OA/2OA ambisonic file) fails the conversion after analysis with that reason, as does a preset whose plan is over its profile budget for the master or whose render would not fit in the converter's memory. |
programme | integer | no | 0-based programme to convert when the ADM declares several. 0 to 32767. |
source | object | no | Ambisonic sources only. Default sn3d (AmbiX). fuma is first order only. |
profile | simple | base | base-enhanced | advanced-1 | advanced-2 | auto | no | IAMF profile to declare. auto lets the preset decide. Ids from GET /v1/presets; a listed-but-unwritable id is refused. Default auto. |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | Idempotent replay: the same job as the first call; no new upload URL. | CreateConversionDuplicate |
201 | Created. Upload the bytes to uploadUrl with a plain PUT and an explicit Content-Length. | CreateConversionCreated |
400 | filename or a positive durationSec is missing (invalid-request). | Problem |
401 | The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key). | Problem |
403 | No minutes left for this job (quota-exhausted). | Problem |
409 | At the concurrent-conversion limit (concurrency-limit). | Problem |
422 | Unknown preset (unknown-preset), bad programme (invalid-programme), bad or read-only profile (invalid-profile, profile-not-writable), bad source.normalization (invalid-source-normalization), or a source over a per-file cap (file-too-long, file-too-large). | Problem |
429 | Over 120 requests/minute for this key (rate-limited). Honour Retry-After. | Problem |
500 | The job could not be created (internal). | Problem |
curl -X POST "https://api.esfera.audio/v1/conversions" \
-H "Authorization: Bearer $ESFERA_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"filename":"master.wav","durationSec":1800,"sizeBytes":4294967296,"preset":"esfera","profile":"advanced-2"}'import { Esfera } from "@esfera/sdk";
const esfera = new Esfera({ apiKey: process.env.ESFERA_API_KEY });
const file = "master.wav"; // a path, a Blob or a stream source
const job = await esfera.conversions.create({ file, preset: "esfera", profile: "advanced-2" });import os
import uuid
import requests
res = requests.post(
"https://api.esfera.audio/v1/conversions",
headers={
"Authorization": f"Bearer {os.environ['ESFERA_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"filename": "master.wav",
"durationSec": 1800,
"sizeBytes": 4294967296,
"preset": "esfera",
"profile": "advanced-2",
},
)
res.raise_for_status()
print(res.json())Response · 201
{
"id": "3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10",
"uploadUrl": "https://<account>.r2.cloudflarestorage.com/…?X-Amz-Signature=…",
"autoStart": true
}GET List the account's conversions, newest first
GET /v1/conversions
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
status | query | uploading | analyzing | analyzed | waiting | queued | running | ready | error | no | Filter by status. |
page | query | integer | no | Default 1. |
pageSize | query | integer | no | Default 25. Maximum 100. |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | A page of conversions. | ConversionPage |
401 | The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key). | Problem |
429 | Over 120 requests/minute for this key (rate-limited). Honour Retry-After. | Problem |
500 | The list could not be read (internal). | Problem |
curl "https://api.esfera.audio/v1/conversions?status=ready&page=1" \
-H "Authorization: Bearer $ESFERA_API_KEY"import { Esfera } from "@esfera/sdk";
const esfera = new Esfera({ apiKey: process.env.ESFERA_API_KEY });
const page = await esfera.conversions.list({ status: "ready", page: 1 });import os
import requests
res = requests.get(
"https://api.esfera.audio/v1/conversions",
headers={
"Authorization": f"Bearer {os.environ['ESFERA_API_KEY']}",
},
params={"status": "ready", "page": 1},
)
res.raise_for_status()
print(res.json())Response · 200
{
"items": [
{
"id": "3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10",
"name": "master.wav",
"status": "ready",
"stage": "done",
"progress": 100,
"sourceDurationSec": 1800,
"outputDurationSec": 1800,
"outputChannels": 14,
"objectCount": 2,
"outputLoudnessLufs": -23.1,
"outputSizeBytes": 612345678,
"errorMessage": null,
"createdAt": "2026-09-02T10:15:00Z",
"updatedAt": "2026-09-02T10:41:00Z",
"programmeCount": 1,
"preset": "esfera",
"programme": null,
"expiresAt": "2026-09-05T10:41:00Z",
"profile": "advanced-2",
"outputProfile": "advanced-1",
"source": {
"kind": "adm",
"order": null,
"normalization": null
},
"output": {
"profile": "advanced-1",
"channels": 14,
"elementCount": 3,
"foldedObjects": 0,
"elements": [
{
"kind": "bed",
"label": "Bed",
"layout": "7.1.4",
"channels": 12
},
{
"kind": "object",
"label": "Narrator",
"layout": null,
"channels": 1
},
{
"kind": "object",
"label": "Effects",
"layout": null,
"channels": 1
}
],
"mixPresentations": [
{
"label": "Default",
"language": "en",
"elements": 3
}
]
}
}
],
"total": 1,
"page": 1,
"pageSize": 25
}GET Retrieve a conversion
GET /v1/conversions/{id}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string (uuid) | yes | The resource id (account-scoped). |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The conversion. | Conversion |
401 | The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key). | Problem |
404 | No such conversion for this account (not-found). | Problem |
429 | Over 120 requests/minute for this key (rate-limited). Honour Retry-After. | Problem |
curl "https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10" \
-H "Authorization: Bearer $ESFERA_API_KEY"import { Esfera } from "@esfera/sdk";
const esfera = new Esfera({ apiKey: process.env.ESFERA_API_KEY });
const conversion = await esfera.conversions.get(id);import os
import requests
res = requests.get(
"https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10",
headers={
"Authorization": f"Bearer {os.environ['ESFERA_API_KEY']}",
},
)
res.raise_for_status()
print(res.json())Response · 200
{
"id": "3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10",
"name": "master.wav",
"status": "ready",
"stage": "done",
"progress": 100,
"sourceDurationSec": 1800,
"outputDurationSec": 1800,
"outputChannels": 14,
"objectCount": 2,
"outputLoudnessLufs": -23.1,
"outputSizeBytes": 612345678,
"errorMessage": null,
"createdAt": "2026-09-02T10:15:00Z",
"updatedAt": "2026-09-02T10:41:00Z",
"programmeCount": 1,
"preset": "esfera",
"programme": null,
"expiresAt": "2026-09-05T10:41:00Z",
"profile": "advanced-2",
"outputProfile": "advanced-1",
"source": {
"kind": "adm",
"order": null,
"normalization": null
},
"output": {
"profile": "advanced-1",
"channels": 14,
"elementCount": 3,
"foldedObjects": 0,
"elements": [
{
"kind": "bed",
"label": "Bed",
"layout": "7.1.4",
"channels": 12
},
{
"kind": "object",
"label": "Narrator",
"layout": null,
"channels": 1
},
{
"kind": "object",
"label": "Effects",
"layout": null,
"channels": 1
}
],
"mixPresentations": [
{
"label": "Default",
"language": "en",
"elements": 3
}
]
}
}DELETE Delete a conversion and its stored files
DELETE /v1/conversions/{id}
Soft-deletes the row and purges its R2 objects. Deleting does not refund the minutes it consumed.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string (uuid) | yes | The resource id (account-scoped). |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | Deleted. | Deleted |
401 | The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key). | Problem |
404 | No such conversion (not-found). | Problem |
429 | Over 120 requests/minute for this key (rate-limited). Honour Retry-After. | Problem |
500 | The delete could not be recorded (internal). | Problem |
curl -X DELETE "https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10" \
-H "Authorization: Bearer $ESFERA_API_KEY"import { Esfera } from "@esfera/sdk";
const esfera = new Esfera({ apiKey: process.env.ESFERA_API_KEY });
await esfera.conversions.delete(id);import os
import requests
res = requests.delete(
"https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10",
headers={
"Authorization": f"Bearer {os.environ['ESFERA_API_KEY']}",
},
)
res.raise_for_status()
print(res.json())Response · 200
{
"ok": true
}POST Start a multipart upload of the master
POST /v1/conversions/{id}/multipart/init
For masters over 5 GiB (a single PUT caps there) and any large master, where parallel parts are faster. Every part URL is presigned up front: PUT each part's bytes to its URL (valid 1 hour), keep the ETag response header, then call multipart/complete. The conversion must still be awaiting its upload.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string (uuid) | yes | The resource id (account-scoped). |
Request body · MultipartInitRequest
| Field | Type | Required | Description |
|---|---|---|---|
parts | integer | yes | How many parts the master is split into. 1 to 10000. |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The upload id and one presigned PUT URL per part. | MultipartInitResponse |
401 | The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key). | Problem |
404 | No such conversion (not-found). | Problem |
409 | The conversion is past the upload state (already-started). | Problem |
422 | parts is not an integer from 1 to 10000 (invalid-multipart). | Problem |
429 | Over 120 requests/minute for this key (rate-limited). Honour Retry-After. | Problem |
500 | The upload could not be started (internal). | Problem |
curl -X POST "https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/multipart/init" \
-H "Authorization: Bearer $ESFERA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"parts":12}'// No SDK method: conversions.create() does this for you. Plain fetch shown.
const res = await fetch(`https://api.esfera.audio/v1/conversions/${id}/multipart/init`, {
method: "POST",
headers: { Authorization: `Bearer ${process.env.ESFERA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ parts: 12 }),
});
const result = await res.json();import os
import requests
res = requests.post(
"https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/multipart/init",
headers={
"Authorization": f"Bearer {os.environ['ESFERA_API_KEY']}",
},
json={
"parts": 12,
},
)
res.raise_for_status()
print(res.json())Response · 200
{
"uploadId": "mpu_7f3a2c91",
"partUrls": [
{
"partNumber": 1,
"url": "https://<account>.r2.cloudflarestorage.com/…?partNumber=1&X-Amz-Signature=…"
},
{
"partNumber": 2,
"url": "https://<account>.r2.cloudflarestorage.com/…?partNumber=2&X-Amz-Signature=…"
}
]
}POST Finish a multipart upload
POST /v1/conversions/{id}/multipart/complete
Send every part's number and ETag. The master is then in place, as if the single PUT had landed.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string (uuid) | yes | The resource id (account-scoped). |
Request body · MultipartCompleteRequest
| Field | Type | Required | Description |
|---|---|---|---|
uploadId | string | yes | |
parts | MultipartPart[] | yes |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The upload is finalised. | OkResponse |
401 | The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key). | Problem |
404 | No such conversion (not-found). | Problem |
409 | The conversion is past the upload state (already-started). | Problem |
422 | uploadId or parts is missing or malformed (invalid-multipart). | Problem |
429 | Over 120 requests/minute for this key (rate-limited). Honour Retry-After. | Problem |
502 | Storage refused to finalise the upload (upload-failed). Retry the upload from the start. | Problem |
curl -X POST "https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/multipart/complete" \
-H "Authorization: Bearer $ESFERA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"uploadId":"mpu_7f3a2c91","parts":[{"partNumber":1,"etag":"\"9b2cf535f27731c974343645a3985328\""},{"partNumber":2,"etag":"\"e4d909c290d0fb1ca068ffaddf22cbd0\""}]}'// No SDK method: conversions.create() does this for you. Plain fetch shown.
const res = await fetch(`https://api.esfera.audio/v1/conversions/${id}/multipart/complete`, {
method: "POST",
headers: { Authorization: `Bearer ${process.env.ESFERA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ uploadId, parts }),
});
const result = await res.json();import os
import requests
res = requests.post(
"https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/multipart/complete",
headers={
"Authorization": f"Bearer {os.environ['ESFERA_API_KEY']}",
},
json={
"uploadId": "mpu_7f3a2c91",
"parts": [
{
"partNumber": 1,
"etag": "\"9b2cf535f27731c974343645a3985328\"",
},
{
"partNumber": 2,
"etag": "\"e4d909c290d0fb1ca068ffaddf22cbd0\"",
},
],
},
)
res.raise_for_status()
print(res.json())Response · 200
{
"ok": true
}POST Abandon a multipart upload
POST /v1/conversions/{id}/multipart/abort
Best effort: frees the stored parts. Never fails with a server error.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string (uuid) | yes | The resource id (account-scoped). |
Request body · MultipartAbortRequest
| Field | Type | Required | Description |
|---|---|---|---|
uploadId | string | yes |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | Abort requested. | OkResponse |
401 | The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key). | Problem |
404 | No such conversion (not-found). | Problem |
409 | The conversion is past the upload state (already-started). | Problem |
422 | uploadId is missing (invalid-multipart). | Problem |
429 | Over 120 requests/minute for this key (rate-limited). Honour Retry-After. | Problem |
curl -X POST "https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/multipart/abort" \
-H "Authorization: Bearer $ESFERA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"uploadId":"mpu_7f3a2c91"}'// No SDK method: conversions.create() does this for you. Plain fetch shown.
const res = await fetch(`https://api.esfera.audio/v1/conversions/${id}/multipart/abort`, {
method: "POST",
headers: { Authorization: `Bearer ${process.env.ESFERA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ uploadId }),
});
const result = await res.json();import os
import requests
res = requests.post(
"https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/multipart/abort",
headers={
"Authorization": f"Bearer {os.environ['ESFERA_API_KEY']}",
},
json={
"uploadId": "mpu_7f3a2c91",
},
)
res.raise_for_status()
print(res.json())Response · 200
{
"ok": true
}POST Analyse an uploaded master without encoding
POST /v1/conversions/{id}/analyze
Two-step flow: discovers the file's programmes, beds and objects. Fires conversion.analyzed when done.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string (uuid) | yes | The resource id (account-scoped). |
Responses
| Status | Meaning | Body |
|---|---|---|
202 | Analysis started. | Accepted |
401 | The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key). | Problem |
404 | No such conversion (not-found). | Problem |
409 | The conversion is past the state analysis applies to (already-started). | Problem |
429 | Over 120 requests/minute for this key (rate-limited). Honour Retry-After. | Problem |
curl -X POST "https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/analyze" \
-H "Authorization: Bearer $ESFERA_API_KEY"import { Esfera } from "@esfera/sdk";
const esfera = new Esfera({ apiKey: process.env.ESFERA_API_KEY });
await esfera.conversions.analyze(id);import os
import requests
res = requests.post(
"https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/analyze",
headers={
"Authorization": f"Bearer {os.environ['ESFERA_API_KEY']}",
},
)
res.raise_for_status()
print(res.json())Response · 202
{
"id": "3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10",
"status": "analyzing"
}POST Start the encode
POST /v1/conversions/{id}/start
Choose the preset (and optionally the programme and the IAMF profile) and queue the encode. profile here overrides one given at create; "auto" clears it; omitting it keeps it.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string (uuid) | yes | The resource id (account-scoped). |
Request body · StartConversionRequest
| Field | Type | Required | Description |
|---|---|---|---|
preset | esfera | youtube | bed714_3oa | oa3 | no | |
programme | integer | no | 0-based. Required when the file declares several programmes. |
source | object | no | Ambisonic sources only. Default sn3d (AmbiX). fuma is first order only. |
profile | simple | base | base-enhanced | advanced-1 | advanced-2 | auto | no | Overrides a profile given at create; auto clears it; omit to keep it. |
Responses
| Status | Meaning | Body |
|---|---|---|
202 | Queued (or analysing first, for a one-step start). | Accepted |
401 | The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key). | Problem |
403 | No minutes left for this job (quota-exhausted). | Problem |
404 | No such conversion (not-found). | Problem |
409 | Already started (already-started), several programmes and none chosen (programme-required), or the source was removed by retention (source-removed). | Problem |
422 | Unknown preset, bad programme, a bad or read-only profile, a bad source.normalization (invalid-source-normalization), a preset this source cannot take (preset-not-for-source), or a preset whose plan is over its profile budget for this master (preset-over-cap). | Problem |
429 | Over 120 requests/minute for this key (rate-limited). Honour Retry-After. | Problem |
curl -X POST "https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/start" \
-H "Authorization: Bearer $ESFERA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"preset":"youtube","programme":0,"profile":"base"}'import { Esfera } from "@esfera/sdk";
const esfera = new Esfera({ apiKey: process.env.ESFERA_API_KEY });
await esfera.conversions.start(id, { preset: "youtube", programme: 0, profile: "base" });import os
import requests
res = requests.post(
"https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/start",
headers={
"Authorization": f"Bearer {os.environ['ESFERA_API_KEY']}",
},
json={
"preset": "youtube",
"programme": 0,
"profile": "base",
},
)
res.raise_for_status()
print(res.json())Response · 202
{
"id": "3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10",
"status": "analyzing"
}GET Download the IAMF output
GET /v1/conversions/{id}/output
Available while the conversion is ready, for 72 hours after it finished (expiresAt). Supports Range.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string (uuid) | yes | The resource id (account-scoped). |
Range | header | string | no | bytes=start-end for a partial download. |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The whole file. | audio/iamf bytes |
206 | The requested byte range. | audio/iamf bytes |
401 | The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key). | Problem |
404 | No output yet, or the output has expired (not-found). | Problem |
429 | Over 120 requests/minute for this key (rate-limited). Honour Retry-After. | Problem |
curl "https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/output" \
-H "Authorization: Bearer $ESFERA_API_KEY" \
-o master.iamfimport { Esfera } from "@esfera/sdk";
const esfera = new Esfera({ apiKey: process.env.ESFERA_API_KEY });
const stream = await esfera.conversions.download(id);import os
import requests
res = requests.get(
"https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/output",
headers={
"Authorization": f"Bearer {os.environ['ESFERA_API_KEY']}",
},
stream=True,
)
res.raise_for_status()
with open("master.iamf", "wb") as f:
for chunk in res.iter_content(1 << 20):
f.write(chunk)Response · 206 · audio/iamf bytes
Objects
Conversion
A conversion job and, once ready, its output.
| Field | Type | Required | Description |
|---|---|---|---|
id | string (uuid) | yes | |
name | string | yes | The filename you gave at create. |
status | uploading | analyzing | analyzed | waiting | queued | running | ready | error | yes | |
stage | string or null | no | Finer-grained step within status (e.g. downloading, encoding). |
progress | integer | yes | 0 to 100. |
sourceDurationSec | number or null | no | |
outputDurationSec | number or null | no | |
outputChannels | integer or null | no | |
objectCount | integer or null | no | Discrete objects found in the source. |
outputLoudnessLufs | number or null | no | Integrated loudness of the output on the 7.1.4 bus (ITU-R BS.1770). |
outputSizeBytes | integer or null | no | |
errorMessage | string or null | no | |
createdAt | string (date-time) | yes | When it was created. |
updatedAt | string (date-time) | yes | |
programmeCount | integer or null | no | Programmes the ADM declares; null until analysed. |
preset | esfera | youtube | bed714_3oa | oa3 or null | yes | The chosen preset; null until chosen. |
programme | integer or null | yes | 0-based programme index; null when the file has one programme. |
expiresAt | string or null | no | When the output is swept (72 h after ready). |
profile | simple | base | base-enhanced | advanced-1 | advanced-2 | auto | yes | The profile you asked for; auto when you left it to the preset. |
outputProfile | simple | base | base-enhanced | base-advanced | advanced-1 | advanced-2 or null | yes | The profile the written file declares; null until ready. |
source | Source | yes | What the source file is. adm, or ambisonic (a bare AmbiX/FuMa WAV, 1OA–3OA). |
output | Output or null | yes | What the written file holds; null until ready. |
Source
What the source file is. adm, or ambisonic (a bare AmbiX/FuMa WAV, 1OA–3OA).
| Field | Type | Required | Description |
|---|---|---|---|
kind | adm | ambisonic | yes | |
order | 1 | 2 | 3 or null | yes | Ambisonic order when kind is ambisonic. |
normalization | sn3d | n3d | fuma or null | yes | |
note | string or null | no | The probe's doubt for 4-channel files (first-order ambisonic or quad); absent for ADM. |
Output
What the written file holds, once ready: its profile, the IAMF audio elements and mix presentations the encoder wrote, and how many source objects were folded into a bed or scene rather than kept as their own element.
| Field | Type | Required | Description |
|---|---|---|---|
profile | simple | base | base-enhanced | base-advanced | advanced-1 | advanced-2 | yes | The profile the written file declares. |
channels | integer | yes | Channels across every element. |
elementCount | integer | yes | Audio elements written. |
foldedObjects | integer | yes | Source objects folded into a bed or scene instead of kept discrete. |
elements | OutputElement[] | yes | |
mixPresentations | MixPresentation[] | yes |
OutputElement
| Field | Type | Required | Description |
|---|---|---|---|
kind | bed | object | scene | yes | bed = channel-based, object = one discrete object, scene = ambisonics. |
label | string | yes | |
layout | string or null | yes | Loudspeaker layout of a bed (7.1.4) or the order of a scene (3OA); null for an object. |
channels | integer | yes |
MixPresentation
| Field | Type | Required | Description |
|---|---|---|---|
label | string | yes | |
language | string or null | yes | BCP 47 tag; null when the master did not say. |
elements | integer | yes | Elements this presentation mixes. |