Skip to content

API

Let tools on the local network list files at each stage from Delivery to On Servers, set a file’s programming status, note and flag, and start and check Distribution jobs.

The API defaults to off and is turned on with the enable switch in the API section of Settings. Volare then listens on every network address the workstation has, at the port set there (default 3100).

To change the port, type the new one and press Enter or click out of the field.

A file is identified by its path inside Staged, or inside Delivery if it hasn’t been staged yet. Files in Delivery can’t be changed through the API. For a file at D:\Show\Staged\Song_01\Intro_v02.mov, either of these works:

  • Song_01/Intro_v02.mov
  • Intro_v02.mov

Leave out the Staged (or Delivery) folder itself and anything above it. File paths are case-insensitive, and forward or back slashes both work.

If two folders in Staged hold a file with the same name, looking it up returns both. To change one of them, send enough of its path to pick it out, such as Song_01/Intro_v02.mov instead of Intro_v02.mov. Otherwise Volare changes nothing and answers with both paths.

MethodRoute
GET/assets

Returns files by path, by where they are on their journey, or both. A path on its own looks in Staged. A search that matches nothing returns an empty list.

Send path, location or both.

NameTypeRequiredDescription
pathStringNoAny trailing part of the file’s path, URI encoded. See Identifying a file.
locationStringNoinDelivery, staged, syncing or onServers: every file at that stage.
const VOLARE = "http://192.168.30.151:3100";
const path = encodeURIComponent("Song_01/Intro_v02.mov");
const res = await fetch(`${VOLARE}/assets?path=${path}`);
const { assets } = await res.json();

To list every file in Delivery:

const res = await fetch(`${VOLARE}/assets?location=inDelivery`);

Returns 200 OK with an assets list of Asset objects.

{
"assets": [
{
"id": "6c1d0f9e-2b7a-4e35-9d84-0a3f5c2e7b19",
"path": "Song_01/Intro_v02.mov",
"location": "staged",
"originalName": "Intro_IN120_OUT1920_v02.mov",
"programmingStatus": "needsReview",
"inFrame": 120,
"outFrame": 1920,
"holdFrame": null,
"flagged": false,
"notes": null,
"errorCheck": {
"codec": "pass",
"resolution": "pass",
"frameRate": "pass",
"sampleRate": "pass",
"bitDepth": "pass",
"channels": "fail"
}
}
]
}
MethodRoute
PUT/assets/programming-status

Sets a file’s programming status to needsProgramming, needsReview, programmed or notUsed.

NameTypeRequiredDescription
pathStringYesIdentifies one file in Staged. See Identifying a file.
statusStringYesneedsProgramming, needsReview, programmed or notUsed.
const VOLARE = "http://192.168.30.151:3100";
const res = await fetch(`${VOLARE}/assets/programming-status`, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ path: "Song_01/Intro_v02.mov", status: "programmed" }),
});
const asset = await res.json();

Returns 200 OK with the updated Asset object.

MethodRoute
PUT/assets/flag

Flags a file or clears its flag.

NameTypeRequiredDescription
pathStringYesIdentifies one file in Staged. See Identifying a file.
flaggedBooleanYestrue flags the file; false clears the flag.
const VOLARE = "http://192.168.30.151:3100";
const res = await fetch(`${VOLARE}/assets/flag`, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ path: "Song_01/Intro_v02.mov", flagged: true }),
});
const asset = await res.json();

Returns 200 OK with the updated Asset object.

MethodRoute
PUT/assets/notes

Sets a file’s note.

NameTypeRequiredDescription
pathStringYesIdentifies one file in Staged. See Identifying a file.
notesStringYesThe whole note, replacing the old one. "" clears it.
const VOLARE = "http://192.168.30.151:3100";
const res = await fetch(`${VOLARE}/assets/notes`, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
path: "Song_01/Intro_v02.mov",
notes: "Frame glitch at frame 279",
}),
});
const asset = await res.json();

Returns 200 OK with the updated Asset object. A cleared note comes back as null.

MethodRoute
POST/distribution/runs

Starts a Distribution job.

NameTypeRequiredDescription
jobIdStringYesThe 8 characters at the top right of the job’s Details section on the Distribution page.
const VOLARE = "http://192.168.30.151:3100";
const res = await fetch(`${VOLARE}/distribution/runs`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ jobId: "a8f6eb77" }),
});
const { runId } = await res.json();

Returns 200 OK with the new run’s ID.

{
"started": true,
"runId": "9d2f4a61-0c3e-4b7a-8e15-6a0b2c7d1f48"
}
MethodRoute
GET/distribution/runs

Returns the job’s most recent run: the one in progress, or the last one if nothing is running.

NameTypeRequiredDescription
jobIdStringYesThe 8 characters at the top right of the job’s Details section on the Distribution page.
const VOLARE = "http://192.168.30.151:3100";
const res = await fetch(`${VOLARE}/distribution/runs?jobId=a8f6eb77`);
const { run } = await res.json();

Returns 200 OK with the job’s latest run. A job that has never run returns { "run": null }.

{
"run": {
"runId": "9d2f4a61-0c3e-4b7a-8e15-6a0b2c7d1f48",
"jobName": "Show VideoFile",
"state": "completed",
"trigger": "api",
"startedAt": "2026-11-05T14:02:11.000Z",
"finishedAt": "2026-11-05T14:05:40.000Z"
}
}
PropertyTypeDescription
runIdStringThe run’s ID, as returned when it was started through the API.
jobNameStringThe job’s name.
stateStringrunning, completed, failed or cancelled.
triggerStringWhat started it: manual (the Distribution page), schedule or api.
startedAtStringWhen the run started, in UTC (ISO 8601).
finishedAtString or nullWhen the run ended, in UTC (ISO 8601). null while it’s running.
PropertyTypeDescription
idStringThe file’s ID in Volare.
pathString or nullThe file’s full path under the folder it’s in: Delivery for a file in Delivery, otherwise under Staged.
locationStringWhere the file is on its journey: inDelivery, staged, syncing or onServers.
originalNameStringThe name the file had when Volare first detected it.
programmingStatusString or nullneedsProgramming, needsReview, programmed or notUsed.
inFrameNumber or nullThe frame from the file’s In tag.
outFrameNumber or nullThe frame from the file’s Out tag.
holdFrameNumber or nullThe frame from the file’s Hold tag.
flaggedBooleantrue when the file is flagged.
notesString or nullThe file’s note.
errorCheckObject or nullEach check’s result, pass, fail or unknown. A video has codec, resolution and frameRate, plus sampleRate, bitDepth and channels when it has an audio track. An audio file has only sampleRate, bitDepth and channels.

When Volare can’t do what a request asks, it answers with an error status and a short message saying what went wrong:

{
"error": "status must be one of needsProgramming, needsReview, programmed, notUsed"
}
StatusMeaning
400 Bad RequestA field is missing, a value isn’t one the request accepts, or the body isn’t JSON.
403 ForbiddenVolare isn’t licensed.
404 Not FoundThere’s no such route, no Staged file matches the path, or no job has that ID.
409 ConflictThe path matches more than one file, or the job is already running or has no targets.
500 Internal Server ErrorSomething went wrong inside Volare.

If a path matches more than one file, the answer also lists every match under paths. Send one of those back to pick that file.

{
"error": "Multiple files found",
"paths": ["Song_01/Intro_v02.mov", "Song_02/Intro_v02.mov"]
}

fetch doesn’t throw an error for these statuses, so check res.ok before using the answer:

if (!res.ok) {
const { error } = await res.json();
console.error(`Volare refused the request (${res.status}): ${error}`);
}