Configuration
GET /api/settings/get
Returns the full Composer settings object as JSON — every public property on Settings.cs (currently ~87 fields covering audio, GPU, project management, render tuning, web API, alarms, autosave, etc.). Use this to snapshot the configured state of a running Composer for diagnostics, configuration drift detection, or to seed a backup.
For the per-property reference (and which properties are runtime-mutable via /api/settings/set), see the settings.xml reference in the docs site.
Parameters: None
Response: 200 OK — JSON object with every setting; deeply nested objects are fully serialised.
GET /api/settings/set
Sets a Composer setting at runtime. Only settings marked with the [ApiSetting] attribute can be modified; all other settings return 403 Forbidden.
Parameters:
| Parameter | Required | Description |
|---|---|---|
property |
Yes | Setting property name (case-sensitive) |
value |
Yes | New value |
Example:
/api/settings/set?property=EnableParallelAudioProcessing&value=true
Response:
200 OK—Setting '{name}' set to '{value}' successfully400 Bad Request— Missing parameters, property not found, or conversion error403 Forbidden— Property exists but is not allowed to be modified via the API
GET /api/settings/getjson
Identical behaviour to /api/settings/get — same JSON, same response code. Retained as an alias because some older client integrations call this URL. Prefer /api/settings/get for new code.
Parameters: None
Response: 200 OK — JSON object with every setting (same shape as /api/settings/get).
GET /api/license/get
Returns the current LicenseInformation for this Composer host as JSON — the licence key, customer, type, expiry, plug-in licences, and host-locking flags read from the licence file on disk. Returns the same payload regardless of trial / evaluation / subscription status; callers can inspect IsTrial / LicenseType / Expirydate to differentiate.
For an all-in-one validity verdict (rather than the raw licence content), use /api/license/validate.
Parameters: None
Response: 200 OK — JSON object:
{
"LicenseKey": "ABCD-1234-…",
"CompanyName": "RealSprint AB",
"ProductName": "Vindral Composer",
"MaxChannels": 4,
"HostName": "STUDIO-01",
"HostNameKey": "…",
"LockedToHostName": true,
"MaxAssemblyMainVersion": 2,
"CreatedDate": "2026-01-15T00:00:00",
"LicenseType": "Subscription",
"ContactPerson": "ops@example.com",
"MaxInstances": 1,
"PushUsageToLicenseServer": true,
"OnlyVerifyWithLicenseServerAtStart": false,
"Expirydate": "2027-01-15T00:00:00",
"Guid": "…",
"Comment": "(-)",
"PluginLicenses": [],
"IsTrial": false,
"CopyrightInfo": "",
"ProjectKey": ""
}
GET /api/license/validate
Returns the current local validation state of the licence — a snapshot of the flags Composer maintains in memory. Local check only — this endpoint does not initiate a fresh round-trip to license.vindral.com; it reads the cached state from the most recent server interaction (which Composer performs on its own schedule). Use this as a quick health probe in monitoring or readiness checks.
Parameters: None
Response: 200 OK — JSON object:
{
"IsTrial": false,
"IsEvaluation": false,
"IsValidLicenseFile": true,
"IsVerifiedByLicenseServer": true,
"IsPostedToLicensedServer": true,
"IsExpired": false,
"IsLocked": false,
"ChecksumError": false
}
| Field | Meaning |
|---|---|
IsTrial |
Composer is running in trial mode (no licence key found). |
IsEvaluation |
The active licence is an evaluation licence. |
IsValidLicenseFile |
The on-disk licence file parsed cleanly and matches the host. |
IsVerifiedByLicenseServer |
The most recent online verification against license.vindral.com succeeded. |
IsPostedToLicensedServer |
A successful POST has occurred at least once this session. |
IsExpired |
The licence has passed its Expirydate. |
IsLocked |
Composer is in the licence-locked state (e.g. trial expired, validation failed beyond the grace period). |
ChecksumError |
The licence file's checksum doesn't match — the file may have been tampered with or corrupted. |
Script structure: legacy globals vs. ES6 modules
Composer's script engine (Jint) supports two modes for the project script. The mode is detected automatically from the file's contents — there is no flag or setting to toggle.
Legacy mode (default). If the main script has no top-level import or export statements, the engine evaluates it as a classic script: top-level function declarations land on the global object, and host code looks them up by name. This is how every existing Composer script works, and nothing in those scripts needs to change.
// Legacy: functions on the global object
var Project = importNamespace('VindralEngine').Project.RunningInstance;
function OnProjectInit() { log("ready"); }
function OnConnectorPing(p) { return "pong:" + p; }
The runtime helper LoadScript("file.js") is still available and inlines the named file (resolved relative to the main script directory) into the same global scope.
Module mode. If the main script contains any top-level import or export, it is loaded as an ES6 module via engine.Modules.Import(...). Module-mode scripts can split code across as many .js files as you want; relative specifiers ("./foo.js", "./util/bar.js") resolve against the main script's directory and a built-in path-traversal guard rejects paths outside that directory.
// main.js (module mode — has `import`/`export`)
import { greet } from "./lib.js";
export { OnConnectorPing } from "./lib.js"; // re-export from a library
export function OnProjectInit() { log("ready"); }
export function OnConnectorGreet(p) { return greet(p); }
// lib.js
export function greet(name) { return "hello " + name; }
export function OnConnectorPing(p) { return "pong:" + p; }
Key rules for module mode:
- Public-surface rule. Entry points the host needs to invoke —
OnProjectInit,OnProjectStop,OnRenderFrame, everyOnConnector{Name}, and any function called via/api/scriptengine/executeorScriptOperator.MethodName— must be exported by the main script. To host the implementation in a library, use a re-export (export { OnConnectorPing } from "./lib.js";). A bareimport "./lib.js";(side-effect only) loads the library but its exports stay invisible to the host, so connectors and API calls targeting those names silently miss. - Host objects stay global.
log,DebugLog,jsHelper,Logger,LoadScript, and allAllowClrtypes (e.g.importNamespace('VindralEngine')) remain on the global object — modules can use them without importing anything. Thevar Logger=VindralLogLibrary.Logger;legacy stripping is not applied to imported library files; new code should use the globalLoggerdirectly. - Path resolution. Specifiers must be relative paths starting with
./or../(subject to the traversal guard); bare specifiers like"some-package"are not resolved by Composer. LoadScript()in module mode. Still works, but logs a warning when called: anything it inlines goes to the global scope and is invisible from inside a module. Preferimportinstead.
GET /api/scriptengine/execute
Executes a JavaScript function in the Composer Script Engine. The function's return value shapes the HTTP response using the same contract as /api/connector/trigger — string returns become text/plain, objects/arrays become application/json, and a returned object with a numeric httpStatus lets the script set the response code.
Preconditions:
EnableScriptEnginemust betrueEnableScriptEngineApiCallsmust betrue- Script engine must be initialized without errors
Parameters:
| Parameter | Required | Description |
|---|---|---|
function |
Yes | Name of the JavaScript function to call |
parameter |
No | Parameter to pass to the function. JSON strings are passed as-is; other strings have quotes stripped. |
Example:
/api/scriptengine/execute?function=myFunction¶meter=hello
/api/scriptengine/execute?function=setConfig¶meter={"key":"value"}
Response:
- Custom status / body / content type — when the called function returns a usable value (see contract).
200 OK— fallbacktext/htmlbodySuccessfully invoked function {name}() with parameter: {param}when the function returns nothing.400 Bad Request— Missing function name403 Forbidden— Script engine disabled or API calls not allowed500 Internal Server Error— Script engine error or execution failure