/batch/exportsBuild 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
Choose a mode and selection
Send audio_ids with download versions, or the render source, target, format, and bit depth.
- 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
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.”
IMDK
“Love it! Makes everything crisp!”
The Grim Tower
“Sensacional”
Francisco
Code examples
Server-side example
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_idsSelected audio asset IDs. Omit to export every owned track in batch_id.
batch_idImport batch used to scope progress and, when audio_ids is omitted, select every owned non-deleted track in the batch.
request_keyOpaque client key used to reconnect to the same durable archive export.
moderender applies each track's persisted mix before archiving; download packages existing artifacts without changing them.
Default: "render"
formatAudio format for rendered artifacts.
Default: "original"
download_profilePer-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.
versionsExisting artifact categories to include in download mode. Transcriptions remain MIDI files regardless of audio format.
sourceMix source used in render mode.
Default: "main"
targetAudio export, original-video MP4 with replaced audio, or cover-art MP4.
Default: "audio"
bit_depthNo description provided.
Default: 24
Successful response
export_idNo description provided.
user_idNo description provided.
audio_idsNo description provided.
modeNo description provided.
statusNo description provided.
created_atNo description provided.
updated_atNo description provided.
request_keyNo description provided.
total_tracksNo description provided.
Default: 0
completed_tracksNo description provided.
Default: 0
total_filesNo description provided.
Default: 0
files_addedNo description provided.
Default: 0
files_skippedNo description provided.
Default: 0
progress_percentNo description provided.
Default: 0
progress_messageNo description provided.
missing_itemsNo description provided.
batch_idNo description provided.
error_messageNo description provided.
modal_function_call_idNo description provided.
email_sent_atNo description provided.
completed_atNo description provided.
expires_atNo description provided.
download_urlPersisted private archive URL, available until expires_at after completion.
Errors
X-API-Key returns an authentication error. Validation errors use the declared 422 response below.detailNo description provided.