Skip to content

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

NameInTypeRequiredDescription
Idempotency-KeyheaderstringnoAny unique string per logical create. Reuse on retry. At most 255 characters.

Request body · CreateConversionRequest

FieldTypeRequiredDescription
filenamestringyesEchoed back as name. At most 255 characters.
durationSecnumberyesSource duration, used to reserve minutes up front. Cap: 180 minutes per file.
sizeBytesintegernoSource size in bytes. Optional, but send it: a source over 107374182400 bytes is refused here (file-too-large) instead of failing after the upload.
presetesfera | youtube | bed714_3oa | oa3noSupply 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.
programmeintegerno0-based programme to convert when the ADM declares several. 0 to 32767.
sourceobjectnoAmbisonic sources only. Default sn3d (AmbiX). fuma is first order only.
profilesimple | base | base-enhanced | advanced-1 | advanced-2 | autonoIAMF profile to declare. auto lets the preset decide. Ids from GET /v1/presets; a listed-but-unwritable id is refused. Default auto.

Responses

StatusMeaningBody
200Idempotent replay: the same job as the first call; no new upload URL.CreateConversionDuplicate
201Created. Upload the bytes to uploadUrl with a plain PUT and an explicit Content-Length.CreateConversionCreated
400filename or a positive durationSec is missing (invalid-request).Problem
401The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key).Problem
403No minutes left for this job (quota-exhausted).Problem
409At the concurrent-conversion limit (concurrency-limit).Problem
422Unknown 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
429Over 120 requests/minute for this key (rate-limited). Honour Retry-After.Problem
500The job could not be created (internal).Problem
bash
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"}'
js
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" });
python
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

json
{
  "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

NameInTypeRequiredDescription
statusqueryuploading | analyzing | analyzed | waiting | queued | running | ready | errornoFilter by status.
pagequeryintegernoDefault 1.
pageSizequeryintegernoDefault 25. Maximum 100.

Responses

StatusMeaningBody
200A page of conversions.ConversionPage
401The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key).Problem
429Over 120 requests/minute for this key (rate-limited). Honour Retry-After.Problem
500The list could not be read (internal).Problem
bash
curl "https://api.esfera.audio/v1/conversions?status=ready&page=1" \
  -H "Authorization: Bearer $ESFERA_API_KEY"
js
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 });
python
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

json
{
  "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

NameInTypeRequiredDescription
idpathstring (uuid)yesThe resource id (account-scoped).

Responses

StatusMeaningBody
200The conversion.Conversion
401The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key).Problem
404No such conversion for this account (not-found).Problem
429Over 120 requests/minute for this key (rate-limited). Honour Retry-After.Problem
bash
curl "https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10" \
  -H "Authorization: Bearer $ESFERA_API_KEY"
js
import { Esfera } from "@esfera/sdk";

const esfera = new Esfera({ apiKey: process.env.ESFERA_API_KEY });

const conversion = await esfera.conversions.get(id);
python
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

json
{
  "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

NameInTypeRequiredDescription
idpathstring (uuid)yesThe resource id (account-scoped).

Responses

StatusMeaningBody
200Deleted.Deleted
401The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key).Problem
404No such conversion (not-found).Problem
429Over 120 requests/minute for this key (rate-limited). Honour Retry-After.Problem
500The delete could not be recorded (internal).Problem
bash
curl -X DELETE "https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10" \
  -H "Authorization: Bearer $ESFERA_API_KEY"
js
import { Esfera } from "@esfera/sdk";

const esfera = new Esfera({ apiKey: process.env.ESFERA_API_KEY });

await esfera.conversions.delete(id);
python
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

json
{
  "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

NameInTypeRequiredDescription
idpathstring (uuid)yesThe resource id (account-scoped).

Request body · MultipartInitRequest

FieldTypeRequiredDescription
partsintegeryesHow many parts the master is split into. 1 to 10000.

Responses

StatusMeaningBody
200The upload id and one presigned PUT URL per part.MultipartInitResponse
401The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key).Problem
404No such conversion (not-found).Problem
409The conversion is past the upload state (already-started).Problem
422parts is not an integer from 1 to 10000 (invalid-multipart).Problem
429Over 120 requests/minute for this key (rate-limited). Honour Retry-After.Problem
500The upload could not be started (internal).Problem
bash
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}'
js
// 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();
python
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

json
{
  "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

NameInTypeRequiredDescription
idpathstring (uuid)yesThe resource id (account-scoped).

Request body · MultipartCompleteRequest

FieldTypeRequiredDescription
uploadIdstringyes
partsMultipartPart[]yes

Responses

StatusMeaningBody
200The upload is finalised.OkResponse
401The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key).Problem
404No such conversion (not-found).Problem
409The conversion is past the upload state (already-started).Problem
422uploadId or parts is missing or malformed (invalid-multipart).Problem
429Over 120 requests/minute for this key (rate-limited). Honour Retry-After.Problem
502Storage refused to finalise the upload (upload-failed). Retry the upload from the start.Problem
bash
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\""}]}'
js
// 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();
python
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

json
{
  "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

NameInTypeRequiredDescription
idpathstring (uuid)yesThe resource id (account-scoped).

Request body · MultipartAbortRequest

FieldTypeRequiredDescription
uploadIdstringyes

Responses

StatusMeaningBody
200Abort requested.OkResponse
401The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key).Problem
404No such conversion (not-found).Problem
409The conversion is past the upload state (already-started).Problem
422uploadId is missing (invalid-multipart).Problem
429Over 120 requests/minute for this key (rate-limited). Honour Retry-After.Problem
bash
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"}'
js
// 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();
python
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

json
{
  "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

NameInTypeRequiredDescription
idpathstring (uuid)yesThe resource id (account-scoped).

Responses

StatusMeaningBody
202Analysis started.Accepted
401The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key).Problem
404No such conversion (not-found).Problem
409The conversion is past the state analysis applies to (already-started).Problem
429Over 120 requests/minute for this key (rate-limited). Honour Retry-After.Problem
bash
curl -X POST "https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/analyze" \
  -H "Authorization: Bearer $ESFERA_API_KEY"
js
import { Esfera } from "@esfera/sdk";

const esfera = new Esfera({ apiKey: process.env.ESFERA_API_KEY });

await esfera.conversions.analyze(id);
python
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

json
{
  "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

NameInTypeRequiredDescription
idpathstring (uuid)yesThe resource id (account-scoped).

Request body · StartConversionRequest

FieldTypeRequiredDescription
presetesfera | youtube | bed714_3oa | oa3no
programmeintegerno0-based. Required when the file declares several programmes.
sourceobjectnoAmbisonic sources only. Default sn3d (AmbiX). fuma is first order only.
profilesimple | base | base-enhanced | advanced-1 | advanced-2 | autonoOverrides a profile given at create; auto clears it; omit to keep it.

Responses

StatusMeaningBody
202Queued (or analysing first, for a one-step start).Accepted
401The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key).Problem
403No minutes left for this job (quota-exhausted).Problem
404No such conversion (not-found).Problem
409Already started (already-started), several programmes and none chosen (programme-required), or the source was removed by retention (source-removed).Problem
422Unknown 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
429Over 120 requests/minute for this key (rate-limited). Honour Retry-After.Problem
bash
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"}'
js
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" });
python
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

json
{
  "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

NameInTypeRequiredDescription
idpathstring (uuid)yesThe resource id (account-scoped).
Rangeheaderstringnobytes=start-end for a partial download.

Responses

StatusMeaningBody
200The whole file.audio/iamf bytes
206The requested byte range.audio/iamf bytes
401The API key is missing, malformed, unknown, revoked, expired, or for the other environment (invalid-api-key).Problem
404No output yet, or the output has expired (not-found).Problem
429Over 120 requests/minute for this key (rate-limited). Honour Retry-After.Problem
bash
curl "https://api.esfera.audio/v1/conversions/3f2b8c1e-5a47-4d0e-9c1a-7b6e2d8f4a10/output" \
  -H "Authorization: Bearer $ESFERA_API_KEY" \
  -o master.iamf
js
import { Esfera } from "@esfera/sdk";

const esfera = new Esfera({ apiKey: process.env.ESFERA_API_KEY });

const stream = await esfera.conversions.download(id);
python
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.

FieldTypeRequiredDescription
idstring (uuid)yes
namestringyesThe filename you gave at create.
statusuploading | analyzing | analyzed | waiting | queued | running | ready | erroryes
stagestring or nullnoFiner-grained step within status (e.g. downloading, encoding).
progressintegeryes0 to 100.
sourceDurationSecnumber or nullno
outputDurationSecnumber or nullno
outputChannelsinteger or nullno
objectCountinteger or nullnoDiscrete objects found in the source.
outputLoudnessLufsnumber or nullnoIntegrated loudness of the output on the 7.1.4 bus (ITU-R BS.1770).
outputSizeBytesinteger or nullno
errorMessagestring or nullno
createdAtstring (date-time)yesWhen it was created.
updatedAtstring (date-time)yes
programmeCountinteger or nullnoProgrammes the ADM declares; null until analysed.
presetesfera | youtube | bed714_3oa | oa3 or nullyesThe chosen preset; null until chosen.
programmeinteger or nullyes0-based programme index; null when the file has one programme.
expiresAtstring or nullnoWhen the output is swept (72 h after ready).
profilesimple | base | base-enhanced | advanced-1 | advanced-2 | autoyesThe profile you asked for; auto when you left it to the preset.
outputProfilesimple | base | base-enhanced | base-advanced | advanced-1 | advanced-2 or nullyesThe profile the written file declares; null until ready.
sourceSourceyesWhat the source file is. adm, or ambisonic (a bare AmbiX/FuMa WAV, 1OA–3OA).
outputOutput or nullyesWhat the written file holds; null until ready.

Source ​

What the source file is. adm, or ambisonic (a bare AmbiX/FuMa WAV, 1OA–3OA).

FieldTypeRequiredDescription
kindadm | ambisonicyes
order1 | 2 | 3 or nullyesAmbisonic order when kind is ambisonic.
normalizationsn3d | n3d | fuma or nullyes
notestring or nullnoThe 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.

FieldTypeRequiredDescription
profilesimple | base | base-enhanced | base-advanced | advanced-1 | advanced-2yesThe profile the written file declares.
channelsintegeryesChannels across every element.
elementCountintegeryesAudio elements written.
foldedObjectsintegeryesSource objects folded into a bed or scene instead of kept discrete.
elementsOutputElement[]yes
mixPresentationsMixPresentation[]yes

OutputElement ​

FieldTypeRequiredDescription
kindbed | object | sceneyesbed = channel-based, object = one discrete object, scene = ambisonics.
labelstringyes
layoutstring or nullyesLoudspeaker layout of a bed (7.1.4) or the order of a scene (3OA); null for an object.
channelsintegeryes

MixPresentation ​

FieldTypeRequiredDescription
labelstringyes
languagestring or nullyesBCP 47 tag; null when the master did not say.
elementsintegeryesElements this presentation mixes.

developers.esfera.audio · the Esfera Converter API, SDK and CLI