/status/{object_type}/{object_id}Check when an audio job is finished
Audio processing takes time. Use one reusable polling loop to check downloads, restorations, masters, stem splits, and MIDI conversions. Your app or agent can continue as soon as the job finishes.
How this endpoint works
Use this endpoint after any API call that starts background work. The same response fields work across job types, so your backend can handle completion, failure, and download URLs without writing a different status client for every feature.
- 1
Save the job ID
Keep the ID and object type returned by the endpoint that started the job.
- 2
Check every few seconds
Poll the status API until is_complete or is_failed becomes true.
- 3
Continue or show the error
Download the finished result on success, or show error_message when processing fails.
Common use cases
Choose this operation when it matches the source and result your workflow needs.
Show processing status
Display processing, completed, and failed states in your app.
Chain API jobs
Wait for restoration to finish before starting mastering, stems, MIDI, or download.
Handle failures safely
Stop polling and return a useful error instead of leaving a worker running forever.
Processing used by 60,000+ music makers
Results people rely on
“Love it! Makes everything crisp!”
The Grim Tower
“Sensacional”
Francisco
“Highend services!”
Tommi, Studionet
“Easy to use and high quality results.”
Bjark
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;
async function waitForCompletion(objectType, objectId) {
while (true) {
const response = await fetch(`${API_URL}/status/${objectType}/${objectId}`, {
headers: { "X-API-Key": API_KEY },
});
if (!response.ok) {
throw new Error(`Status check failed with ${response.status}`);
}
const status = await response.json();
if (status.is_failed) {
throw new Error(status.error_message || `${objectType} processing failed`);
}
if (status.is_complete) {
return status;
}
await new Promise((resolve) => setTimeout(resolve, 5000));
}
}
const requestResponse = await fetch(`${API_URL}/upscale-audio`, {
method: "POST",
headers: {
"X-API-Key": API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"audio_id": "6c62f8e7-02a3-48c0-a5b5-5de87ed9c31a",
"preset": "universal_enhancer",
"bit_depth": 24
}),
});
if (!requestResponse.ok) {
throw new Error(`Restoration request failed with ${requestResponse.status}`);
}
const result = await requestResponse.json();
const jobId = result["id"];
const status = await waitForCompletion("upscaled", jobId);
console.log(status);Parameters
Send the API key from a trusted server. Never expose it in client-side JavaScript.
Path and query parameters
object_typeobject_idSuccessful response
object_typeKind of object that was checked.
Example: "upscaled"
object_idID of the checked job or artifact.
Example: "d66cf940-bf26-45bb-80f7-332f26b6859a"
statusCurrent processing state.
Example: "completed"
is_completeTrue when the artifact is ready to download or use.
Example: true
is_failedTrue when the job cannot complete and error_message is set.
Example: false
download_urlDownload endpoint URL for completed downloadable artifacts.
Example: "https://api.neuralanalog.com/download/upscaled/d66cf940-bf26-45bb-80f7-332f26b6859a"
audio_idParent audio asset ID when the checked object belongs to a track.
Example: "6c62f8e7-02a3-48c0-a5b5-5de87ed9c31a"
status_detailsAdditional human-readable progress details when available.
Example: "Restoration completed"
error_messageFailure reason when is_failed is true.
Example: "Source audio is no longer available"
created_atISO timestamp for when the job or artifact was created.
Example: "2026-05-05T10:15:30Z"
completed_atISO timestamp for when processing completed.
Example: "2026-05-05T10:18:42Z"
Errors
X-API-Key returns an authentication error. Validation errors use the declared 422 response below.detailNo description provided.