Browse API endpoints
post/batch/exports

Build and monitor a multi-track ZIP export

Choose the exact audio IDs and either package completed artifacts or render their saved Studio mixes. The API starts a persistent export job, reports skipped versions precisely, and returns a temporary ZIP URL when it completes.

How this endpoint works

Use download mode for original, restored, mastered, transcribed, and stem files that already exist. Use render mode when effects, current version choices, combined stems, Atmos, or an MP4 target must be produced first. Only the supplied audio_ids are added.

  1. 1

    Choose a mode and selection

    Send audio_ids with download versions, or the render source, target, format, and bit depth.

  2. 2

    Monitor the export job

    Poll GET /batch/exports/{export_id}, or subscribe to archive_exports, until status is completed, completed_with_missing_files, failed, or cancelled. The partial-success status means the ZIP is ready and missing_items explains what could not be included. Cancel an active worker with POST /batch/exports/{export_id}/cancel.

  3. 3

    Download the ZIP

    Use download_url before expires_at; archives remain available for 24 hours. To leave the progress UI and force email delivery, call POST /batch/exports/{export_id}/send-email.

Common use cases

Choose this operation when it matches the source and result your workflow needs.

Export a user’s music library

Package multiple downloaded or uploaded tracks into one file for backup or migration.

Deliver a stem pack

Return all requested vocal, drum, bass, and instrument stems as one ZIP.

Deliver processed versions

Bundle the original, restored, and mastered versions for a project handoff.

Processing used by 50,000+ music makers

Results people rely on

It worked! Well done :) Many thanks :))))

Vicki (People Like Us)

2600+ songs saved

I love the interface. I love the bulk upload/download features. They’re a life saver! Also I just realized that Apollo is magic and I don’t even need to use denoise. Apollo somehow removes noise much more naturally. So I’m actually spending way less credits than I expected.
I

IMDK

Love it! Makes everything crisp!
TG

The Grim Tower

Sensacional
F

Francisco

Code examples

Server-side example

JavaScript (Node.js)
import { writeFile } from "node:fs/promises";

const API_URL = "https://api.neuralanalog.com";
const API_KEY = process.env.NEURALANALOG_API_KEY;
const audioId = "6c62f8e7-02a3-48c0-a5b5-5de87ed9c31a";
const response = await fetch(`${API_URL}/batch/exports`, {
  method: "POST",
  headers: {
    "X-API-Key": API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    audio_ids: [audioId],
    mode: "download",
    versions: ["original", "restored", "mastered"],
    download_profile: "optimal",
  }),
});
if (!response.ok) {
  throw new Error(`Archive request failed with ${response.status}`);
}

const started = await response.json();
let archive;
for (;;) {
  const statusResponse = await fetch(
    `${API_URL}/batch/exports/${started.export_id}`,
    { headers: { "X-API-Key": API_KEY } },
  );
  if (!statusResponse.ok) {
    throw new Error(`Archive status failed with ${statusResponse.status}`);
  }
  archive = await statusResponse.json();
  if (archive.status === "completed") break;
  await new Promise((resolve) => setTimeout(resolve, 2000));
}

const download = await fetch(archive.download_url, { redirect: "follow" });
if (!download.ok) {
  throw new Error(`Archive download failed with ${download.status}`);
}
await writeFile("neuralanalog-archive.zip", Buffer.from(await download.arrayBuffer()));

Parameters

Send the API key from a trusted server. Never expose it in client-side JavaScript.

JSON request body

audio_ids
optionalarray<string>

Selected audio asset IDs. Omit to export every owned track in batch_id.

batch_id
optionalstring | null

Import batch used to scope progress and, when audio_ids is omitted, select every owned non-deleted track in the batch.

request_key
optionalstring | null

Opaque client key used to reconnect to the same durable archive export.

mode
optionalstring

render applies each track's persisted mix before archiving; download packages existing artifacts without changing them.

"download""render"

Default: "render"

format
optionalstring

Audio format for rendered artifacts.

Default: "original"

download_profile
optionalstring | null

Per-version format profile used in download mode. Optimal preserves original uploads and uses FLAC for processed audio; Standard uses MP3 originals and FLAC processed audio; Heavy uses MP3 originals and WAV processed audio.

"optimal""standard""heavy"
versions
optionalarray<string>

Existing artifact categories to include in download mode. Transcriptions remain MIDI files regardless of audio format.

source
optionalstring

Mix source used in render mode.

"main""stems""individual_stems"

Default: "main"

target
optionalstring

Audio export, original-video MP4 with replaced audio, or cover-art MP4.

"audio""video""cover-video"

Default: "audio"

bit_depth
optionalinteger

No description provided.

1624

Default: 24

Successful response

200Successful Response
export_id
requiredstring

No description provided.

user_id
requiredstring

No description provided.

audio_ids
requiredarray<string>

No description provided.

mode
requiredstring

No description provided.

"download""render"
status
requiredstring

No description provided.

"queued""rendering""archiving""completed""completed_with_missing_files""failed""cancelled"
created_at
requiredstring<date-time>

No description provided.

updated_at
requiredstring<date-time>

No description provided.

request_key
optionalstring | null

No description provided.

total_tracks
optionalinteger

No description provided.

Default: 0

completed_tracks
optionalinteger

No description provided.

Default: 0

total_files
optionalinteger

No description provided.

Default: 0

files_added
optionalinteger

No description provided.

Default: 0

files_skipped
optionalinteger

No description provided.

Default: 0

progress_percent
optionalinteger

No description provided.

Default: 0

progress_message
optionalstring | null

No description provided.

missing_items
optionalarray<object>

No description provided.

batch_id
optionalstring | null

No description provided.

error_message
optionalstring | null

No description provided.

modal_function_call_id
optionalstring | null

No description provided.

email_sent_at
optionalstring<date-time> | null

No description provided.

completed_at
optionalstring<date-time> | null

No description provided.

expires_at
optionalstring<date-time> | null

No description provided.

download_url
optionalstring | null

Persisted private archive URL, available until expires_at after completion.

Errors

A missing or invalid X-API-Key returns an authentication error. Validation errors use the declared 422 response below.
422Validation Error
detail
optionalarray<object>

No description provided.

Next steps