DjMirrorPulse Local AI API (1.0.0)

Download OpenAPI specification:

Uniform contract for every /api/v1/* route exposed by DjMirrorPulse's HTTP configuration server (HttpConfigServer). Every response is wrapped in the same envelope ({ok, data, error, meta}) where meta.revision is a monotonic live-config counter. Exceptions: GET /config/subscribe (long-poll event shape) and binary download routes (raw bytes, no envelope).

This file is the single source of truth for the /api/v1 surface: every route the server registers has an operation here, each with a unique operationId. docs_tech/docs_http_ws/README_HTTP_API_REFERENCE.md keeps the design notes. The legacy, unversioned surface (ad-hoc per-endpoint shapes) is intentionally out of scope here; with an API key set it needs the same credentials as /api/v1.

Vendor extensions used in this file:

  • x-edition (operation): the minimum license edition (professional, enterprise) needed to switch the feature on or start it. Reading its state always works; a refused call answers 403 EDITION_REQUIRED. The editions are listed by GET /license.
  • x-internal (operation): not part of the supported contract (test-only routes); leave them out of published documentation.
  • x-websocket-events (root): the events pushed over the WebSocket, which OpenAPI cannot describe.

Authentication is the user's choice: with no API key ("apiKey" in config.json, or DJMIRROR_API_TOKEN, which wins) every route answers without credentials. With one, every route needs the API key or the deviceToken of a phone paired by QR, except the pairing routes that declare their own security below.

WebSocket events

Pushed over ws://localhost:<httpPort+1> (with an API key, add ?token=). Every event except config.changed arrives as {type: event, eventType: custom.event, resource: event, action: triggered, name, data, requestId, timestamp}; config.changed uses eventType config.changed with resource config and action updated. These events are not delivered to the GET /config/subscribe long-poll.

Event When data
config.changed The live config changed. Same body as the long-poll event; also pushed over the WebSocket as eventType config.changed (not custom.event). the changed fragment
ping Heartbeat every 30 s while at least one client is connected. none
license.changed The edition in force changed (a pairing or activation changed it). LicenseInfo-like object
recording.started A recording started. as POST /recording/start
recording.stopped A recording stopped. as POST /recording/stop
recording.snapshot A snapshot was captured. as POST /recording/snapshot
spout.started The Spout output started. SpoutStatus
spout.stopped The Spout output stopped. SpoutStatus
spout.updated Its settings changed (at most once per 150 ms). SpoutConfig
spout.error The output failed (for instance a source that gives no texture). {code, message}
spout.layout.started The Spout layout service started. SpoutLayoutStatus
spout.layout.stopped The Spout layout service stopped. SpoutLayoutStatus
spout.layout.updated Its settings or the reloaded file changed (at most once per 150 ms). SpoutLayoutConfig
spout.layout.error A service-level failure, such as a bad layout file. One output's own failure only shows in the status. {code, message}
ndi.started The NDI bridge started. NdiStatus
ndi.stopped The NDI bridge stopped. NdiStatus
ndi.updated Its settings changed (at most once per 150 ms). NdiSettings
ndi.error The bridge exited on its own while expected to keep running. {code: EXITED, message}
dmx.fixtures.updated The fixture list changed on disk or through the API. none
dmx.scenes.updated The scenes changed. none
dmx.fixtureProfiles.updated The fixture profiles changed. none
dmx.movementPatterns.updated The movement patterns changed. none
dmx.laserPatterns.updated The laser patterns changed. none
dmx.config.updated The DMX configuration changed. none
dmx.runtime.changed Live DMX output changed (scene applied, channels set). optional, event-specific
dmx.blackout.changed Blackout switched. {active}
dmx.silence.changed The silence state or its fade settings changed. {active, fadeMs, curve}
dmx.macro.triggered A macro was triggered. event-specific
dmx.playall.changed Play All switched (POST /dmx/runtime/playall). {running}
dmx.scenemode.changed The forced scene mode changed (POST /dmx/runtime/scene-mode). {mode}
dmx.autoconnect.changed The DMX auto-connect setting changed. event-specific

Health

Liveness and capability discovery.

Liveness check

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Server capability discovery

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the active license edition and its features

The edition in force on this computer and, for every feature that is not in all editions, whether it is included. A paired phone sees the desktop's license.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Config

Generic and flattened "global settings" configuration access.

Get the full config tree

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Deep-merge a fragment into the full config tree

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Get the flattened, defaulted global settings view

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Update a subset of the global settings

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
defaultColor
string
globalOutputBrightness
number
globalOutputContrast
number
globalOutputSaturation
number
globalOutputBlur
number
globalVideoAudioEnabled
boolean
globalVideoStretchMode
integer
globalVideoAudioOutputDevice
string
globalCaptureInputVolume
number
screenScale
number
language
string
object
sources.visualizer.devicePattern
string
sources.visualizer.fallbackPattern
string
dmxAutoConnect
boolean

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "defaultColor": "string",
  • "globalOutputBrightness": 0,
  • "globalOutputContrast": 0,
  • "globalOutputSaturation": 0,
  • "globalOutputBlur": 0,
  • "globalVideoAudioEnabled": true,
  • "globalVideoStretchMode": 0,
  • "globalVideoAudioOutputDevice": "string",
  • "globalCaptureInputVolume": 0,
  • "screenScale": 0,
  • "language": "string",
  • "sources": {
    },
  • "sources.visualizer.devicePattern": "string",
  • "sources.visualizer.fallbackPattern": "string",
  • "dmxAutoConnect": true
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Layers

Visual layer visibility and per-layer configuration (elements.*).

List every valid layerId (top-level layers and addressable sub-layers)

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
data
required
Array of strings
Items Enum: "imagesBackgroundView" "avatarsBackgroundView" "videoBackgroundView" "vinylDiscView" "lightingView" "waveFormView" "artistCardView" "marqueeTextView" "maskView" "waveFormView.waveformVisualizer" "waveFormView.particleWaveVisualizer" "waveFormView.analogWaveVisualizer" "waveFormView.spectrumVisualizer" "waveFormView.xyVisualizer" "lightingView.midi" "lightingView.particles" "lightingView.spotlights" "lightingView.strobes"

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

Get the raw elements object (all layers, unfiltered)

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Toggle visibility of a layer or sub-layer

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
layerId
required
string (LayerId)
Enum: "imagesBackgroundView" "avatarsBackgroundView" "videoBackgroundView" "vinylDiscView" "lightingView" "waveFormView" "artistCardView" "marqueeTextView" "maskView" "waveFormView.waveformVisualizer" "waveFormView.particleWaveVisualizer" "waveFormView.analogWaveVisualizer" "waveFormView.spectrumVisualizer" "waveFormView.xyVisualizer" "lightingView.midi" "lightingView.particles" "lightingView.spotlights" "lightingView.strobes"

Any addressable layer or sub-layer id, as returned by GET /config/layer-ids.

enabled
required
boolean

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "layerId": "imagesBackgroundView",
  • "enabled": true
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Get elements.<layerId>

Authorizations:
bearerAuthapiKeyAuth
path Parameters
layerId
required
string (TopLevelLayerId)
Enum: "imagesBackgroundView" "avatarsBackgroundView" "videoBackgroundView" "vinylDiscView" "lightingView" "waveFormView" "artistCardView" "marqueeTextView" "maskView"

One of the 9 layer ids with their own full-object GET/PATCH endpoint.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Deep-merge a fragment into elements.<layerId>

Authorizations:
bearerAuthapiKeyAuth
path Parameters
layerId
required
string (TopLevelLayerId)
Enum: "imagesBackgroundView" "avatarsBackgroundView" "videoBackgroundView" "vinylDiscView" "lightingView" "waveFormView" "artistCardView" "marqueeTextView" "maskView"

One of the 9 layer ids with their own full-object GET/PATCH endpoint.

Request Body schema: application/json
required
non-empty
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Marquee

Individual message CRUD for the marquee text ticker carousel.

List all messages in the carousel (current order)

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
Array of objects

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

Add a new message to the carousel

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
source
required
string (MarqueeMessageSource)
Enum: "custom" "artistName" "artistDescription"
customText
string
enabled
boolean
Default: true

Responses

Request samples

Content type
application/json
{
  • "source": "custom",
  • "customText": "string",
  • "enabled": true
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Reorder the carousel

Registered before the {messageId} route so this exact path is matched instead of being captured as an id.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
order
required
Array of strings

Exact permutation of the current message ids (same size, each id present exactly once).

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
Array of objects

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "order": [
    ]
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

Update one or more fields of an existing message

Authorizations:
bearerAuthapiKeyAuth
path Parameters
messageId
required
string
Request Body schema: application/json
required
non-empty
source
string (MarqueeMessageSource)
Enum: "custom" "artistName" "artistDescription"
customText
string
enabled
boolean

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "source": "custom",
  • "customText": "string",
  • "enabled": true
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Delete a message by id

Authorizations:
bearerAuthapiKeyAuth
path Parameters
messageId
required
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Styles

Visual style listing, the (orphaned) config.styles block, and individual style content management.

Get the raw config.styles block (orphaned, see description)

Disconnected from actual style file content. See /visuals/styles/{name} below for the real thing.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Deep-merge a fragment into config.styles (orphaned, see description)

Disconnected from actual style file content. See PUT /visuals/styles/{name} below to modify a style's real content.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Create a new style from the live server configuration

Captures defaultColor/currentImageFile/currentVideoFile/currentAvatarFile (resolved the same way GET /config/global resolves them) and the full current elements tree under a new name.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
name
required
string non-empty

Must not contain '..', '/' or ''.

object (StyleMetadata)
overwrite
boolean
Default: false
defaultColor
string

Optional override; otherwise resolved from live config.

currentImageFile
string
currentVideoFile
string
currentAvatarFile
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "metadata": {
    },
  • "overwrite": false,
  • "defaultColor": "string",
  • "currentImageFile": "string",
  • "currentVideoFile": "string",
  • "currentAvatarFile": "string"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Read the full content of a style

Individual Style Management -- distinct from GET /visuals/styles above (names only) and from currentStyle (GET/PATCH /config), which only tracks which name is active.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
name
required
string

Style name (matches a Visuals/Styles/.json file, without extension).

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Replace a style's content explicitly (creates it if missing)

Authorizations:
bearerAuthapiKeyAuth
path Parameters
name
required
string

Style name (matches a Visuals/Styles/.json file, without extension).

Request Body schema: application/json
required
object (StyleMetadata)
defaultColor
string
currentImageFile
string
currentVideoFile
string
currentAvatarFile
string
object (ElementsTree)

Raw elements config object (all layers, unfiltered).

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "metadata": {
    },
  • "defaultColor": "string",
  • "currentImageFile": "string",
  • "currentVideoFile": "string",
  • "currentAvatarFile": "string",
  • "elements": { }
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Deep-merge a fragment into a style's on-disk content

Edits Visuals/Styles/{name}.json without touching the live config -- counterpart to PUT (full replace) and POST .../apply (load onto live). MCP equivalent: patch_style(name, fragment).

Authorizations:
bearerAuthapiKeyAuth
path Parameters
name
required
string

Style name (matches a Visuals/Styles/.json file, without extension).

Request Body schema: application/json
required
non-empty
object (StyleMetadata)
defaultColor
string
currentImageFile
string
currentVideoFile
string
currentAvatarFile
string
object (ElementsTree)

Raw elements config object (all layers, unfiltered).

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "metadata": {
    },
  • "defaultColor": "string",
  • "currentImageFile": "string",
  • "currentVideoFile": "string",
  • "currentAvatarFile": "string",
  • "elements": { }
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Delete a style by name

The "default" style is protected and cannot be deleted (checked before existence).

Authorizations:
bearerAuthapiKeyAuth
path Parameters
name
required
string

Style name (matches a Visuals/Styles/.json file, without extension).

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Atomically load a saved style onto the live config

Sets currentStyle, visualization.{defaultColor,currentImageFile, currentVideoFile,currentAvatarFile}, and elements together in a single update -- unlike PATCH /config with { currentStyle: name }, which only flips the active-name pointer and relies on the desktop app to notice and reload the style from disk on its own, asynchronously. If overrides is given, it's deep-merged onto the style's own content before that atomic apply. Auto-download: if the style is only a stub (metadata.isInstalled === false with a metadata.downloadUrl set -- e.g. listed via a catalog but never fetched by this client), the package is downloaded and installed first (unzipped into Visuals/Styles, Images, Videos and Avatars, the same flow the desktop UI runs when an uninstalled style tile is clicked) before applying it. The request blocks for the duration of the download/install (up to 60s).

Authorizations:
bearerAuthapiKeyAuth
path Parameters
name
required
string

Style name (matches a Visuals/Styles/.json file, without extension).

Request Body schema: application/json
optional
object (StyleOverrides)

Deep-merged onto the style's own content before the atomic apply.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "overrides": {
    }
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

AutoFX

Audio-reactive rule configuration (elements.audioRules).

Get elements.audioRules

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Deep-merge a fragment into elements.audioRules

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Artists

Whole-list and individual artist profile management.

List all artists (normalized to an array)

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Replace the whole artists list

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
required
Array of objects or object

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "artists": [
    ]
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Add a single new artist

Granular alternative to PATCH above -- appends one artist instead of replacing the whole list.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
name
required
string non-empty
logo
string
description
string

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "logo": "string",
  • "description": "string"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Reorder the artists list

Registered before the {artistId} route so this exact path is matched instead of being captured as an id. Adjusts artist.currentArtistIndex so the same artist (by id) stays "current" across the reorder.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
order
required
Array of strings

Exact permutation of the current artist ids (same size, each id present exactly once).

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "order": [
    ]
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Update one or more fields of an existing artist

Authorizations:
bearerAuthapiKeyAuth
path Parameters
artistId
required
string
Request Body schema: application/json
required
non-empty
name
string non-empty
logo
string
description
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "name": "string",
  • "logo": "string",
  • "description": "string"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Delete an artist by id

Adjusts artist.currentArtistIndex to keep pointing at the same logical artist.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
artistId
required
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Playlists

Config-level image/avatar/video playlist arrays.

Get the imagePlaylists array

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
data
Array of strings

Absent when the value was never set.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

Replace the imagePlaylists array wholesale

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
Array
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
data
required
Array of strings

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
[
  • "string"
]

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

Get the avatarPlaylists array

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
data
Array of strings

Absent when the value was never set.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

Replace the avatarPlaylists array wholesale

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
Array
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
data
required
Array of strings

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
[
  • "string"
]

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

Get the videoPlaylists array

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
data
Array of strings

Absent when the value was never set.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

Replace the videoPlaylists array wholesale

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
Array
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
data
required
Array of strings

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
[
  • "string"
]

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

Visuals

Filesystem listings under the Visuals base folder, and local media metadata.

List style names (Visuals/Styles/*.json basenames)

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
data
required
Array of strings

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

List video playlist file names (Visuals/Videos/*.txt)

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
data
required
Array of strings

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

List image playlist file names (Visuals/Images/*.txt)

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
data
required
Array of strings

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

List avatar playlist file names (Visuals/Avatars/*.txt)

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
data
required
Array of strings

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

List logo image file names (Visuals/Logos/*.{jpg,jpeg,png,gif})

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
data
required
Array of strings

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

List images on disk referenced by the currently active image playlist

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
Array of objects

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

List videos on disk referenced by the currently active video playlist

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
Array of objects

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

List avatars on disk referenced by the currently active avatar playlist

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
Array of objects

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

List the styles with their install state

Lightweight bulk listing (name, isInstalled, downloadUrl) instead of the full style content GET /visuals/styles/{name} returns, so a client can show the install state of every style without one fetch per name.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
Array of objects

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

Media

External stock media (Pixabay/Pexels) search and download.

Search stock images (Pixabay/Pexels)

Authorizations:
bearerAuthapiKeyAuth
query Parameters
q
required
string
page
integer >= 1
Default: 1
perPage
integer
Default: 0
service
string
Default: "both"
Enum: "pixabay" "pexels" "both"

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Download a search result into Visuals/Images and the active playlist

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
url
required
string <uri>
fileName
string

Must not contain '..', '/' or ''. Auto-generated from tags/timestamp when omitted.

tags
string
object

Optional raw provider item, forwarded to the download service.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Search stock videos (Pixabay/Pexels)

Authorizations:
bearerAuthapiKeyAuth
query Parameters
q
required
string
page
integer >= 1
Default: 1
perPage
integer
Default: 0
service
string
Default: "both"
Enum: "pixabay" "pexels" "both"

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Download a search result into Visuals/Videos and the active playlist

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
url
required
string <uri>
fileName
string

Must not contain '..', '/' or ''. Auto-generated from tags/timestamp when omitted.

tags
string
object

Optional raw provider item, forwarded to the download service.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Search stock avatars (reuses the image search -- an avatar is just an image saved to a different folder/playlist)

Authorizations:
bearerAuthapiKeyAuth
query Parameters
q
required
string
page
integer >= 1
Default: 1
perPage
integer
Default: 0
service
string
Default: "both"
Enum: "pixabay" "pexels" "both"

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Download a search result into Visuals/Avatars and the active playlist

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
url
required
string <uri>
fileName
string

Must not contain '..', '/' or ''. Auto-generated from tags/timestamp when omitted.

tags
string
object

Optional raw provider item, forwarded to the download service.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

DMX

DMX fixtures, scenes, movement/laser patterns, fixture profiles, runtime control, and export/import.

Get all DMX fixtures

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
Array of objects

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

Replace all DMX fixtures

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
One of
Array
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
Array of objects

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
Example
[ ]

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

Replace all DMX fixtures (object body only, unlike PUT)

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
required
Array of objects (DmxFixture)

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
Array of objects

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "fixtures": [
    ]
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": [
    ],
  • "error": { },
  • "meta": {
    }
}

Get the full contents of dmx_scenes.json

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Replace the full scenes root object

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
One of
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
Example
{ }

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Shallow-merge into the scenes root object

If the body includes a scenes key, the entire scenes array is replaced, not appended to -- there is no per-scene merge.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Get the raw fixture movement pattern file

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Overwrite the fixture movement pattern file (no schema validation)

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Get the raw laser movement pattern file

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Overwrite the laser movement pattern file (no schema validation)

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": { },
  • "error": { },
  • "meta": {
    }
}

Get DMX fixture color/behavior profiles

If the DMX runtime helper isn't available, responds 200 with { "profiles": [] } rather than an error.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Replace all DMX fixture profiles

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
One of
Array
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
Example
[ ]

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Replace all DMX fixture profiles (full replace, same as PUT)

Patch behaves as replace for now (same as PUT), to keep parity with list semantics.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
One of
Array
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
Example
[ ]

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Instantly (or progressively) apply a DMX scene

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
object

Full scene object, applied directly.

sceneId
string

Looked up in dmx_scenes.json.

progress
number [ 0 .. 1 ]

If present and >= 0, applies with progress instead of instantly.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "scene": { },
  • "sceneId": "string",
  • "progress": 0
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Apply raw DMX channel values immediately

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
universe
integer
Default: 0
required
Array of objects

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "universe": 0,
  • "channels": [
    ]
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Toggle global DMX blackout

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
optional
active
boolean
Default: true

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "active": true
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Audio-silence state of the DMX per-element silence behavior

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Force the audio-silence state and/or set its global fade

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
active
boolean
fadeMs
integer [ 0 .. 5000 ]
curve
string
Enum: "linear" "smooth" "easeIn" "easeOut"

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "active": true,
  • "fadeMs": 0,
  • "curve": "linear"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Control global movement speed and enabled state

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
enabled
boolean
globalSpeed
number

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "enabled": true,
  • "globalSpeed": 0
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Toggle auto-dimmer mode and/or set its level

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
enabled
boolean

Toggles auto-dimmer mode.

autoValue
integer [ 0 .. 255 ]

Level used while auto-dimmer mode is on.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "enabled": true,
  • "autoValue": 0
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Trigger a DMX macro (fog, haze, laser-blackout, strobe)

Authorizations:
bearerAuthapiKeyAuth
path Parameters
macro
required
string (DmxMacroName)
Enum: "fog" "haze" "laser-blackout" "strobe"
Request Body schema: application/json
optional
intensity
number
Default: 1

No range validation applied.

durationMs
integer

fog only. Burst duration in ms, server-clamped to [50, 30000]. Omit (or send <= 0) for the default short burst (~900ms); pass several thousand ms for a long burst.

color
string

strobe only. Hex flash color, e.g. #FFFFFF. Invalid/empty defaults to white.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "intensity": 1,
  • "durationMs": 0,
  • "color": "string"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Bundle the current DMX state into one object

Always succeeds -- missing files degrade to empty defaults, not errors.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Import a DMX state snapshot

An entirely empty body {} is accepted and is effectively a no-op success. See DmxImportRequest for the merge-vs-replace and scenes-shape caveats.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
optional
mode
string

'merge' merges fixtures/scenes by id (incoming wins); anything else (including omitted) is a full replace. movementPatterns/laserPatterns/fixtureProfiles are always a full replace regardless of mode.

dryRun
boolean
Default: false

When true, validation still runs but nothing is written or reloaded.

Array of objects (DmxFixture)
Array of objects
object (DmxPatternFile)

Raw contents of a movement/laser pattern file. No schema validation is applied -- written/read as-is.

object (DmxPatternFile)

Raw contents of a movement/laser pattern file. No schema validation is applied -- written/read as-is.

Array of objects

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "mode": "merge",
  • "dryRun": false,
  • "fixtures": [
    ],
  • "scenes": [
    ],
  • "movementPatterns": { },
  • "laserPatterns": { },
  • "fixtureProfiles": [
    ]
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Broadcast the Play All state to the other clients

Pure coordination: nothing is stored on the server. It fans running out to every connected client (WebSocket event dmx.playall.changed), so a client that connects later sees false until the next change.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
running
boolean
Default: false

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "running": true
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Force a scene playback mode on every client

Pure coordination, same as /dmx/runtime/playall (WebSocket event dmx.scenemode.changed). Any value other than auto, manual or mixto is stored as perScene (each scene plays its own saved mode).

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
mode
string
Enum: "auto" "manual" "mixto" "perScene"

Any other value is answered as perScene.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "mode": "auto"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the live DMX runtime state

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Read a fixture's channels by role

Addresses channels as the absolute DMX channels the fixture occupies (the way the desktop's per-fixture fine-control panel does), so a client does not have to duplicate the fixture to port/universe routing. Only channels inside 1-512 are listed.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
fixtureId
required
string

Fixture id, as in GET /dmx/fixtures.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Set a fixture's channels

Same addressing as the GET. Broadcasts dmx.runtime.changed.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
fixtureId
required
string

Fixture id, as in GET /dmx/fixtures.

Request Body schema: application/json
required
required
Array of objects

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "channels": [
    ]
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Recording

Start/stop/status/list/download of MP4 recordings of the main application window, plus single-frame PNG snapshots.

Start recording the main application window to an MP4 file

Only one recording can be active at a time. maxDurationSec enforces an auto-stop safety net since this can be triggered remotely with no on-screen recording indicator. Audio is recorded automatically from whichever input device is currently selected for audio analysis (falling back to the system default input); there is no separate toggle for it.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
optional
fps
integer
Default: 20

Clamped to [5, 60].

maxDurationSec
integer
Default: 1800

Clamped to [5, 7200]; the recording auto-stops when reached.

fileName
string

Sanitized against path traversal; .mp4 appended if missing; auto-generated timestamped name if omitted.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "fps": 20,
  • "maxDurationSec": 1800,
  • "fileName": "string"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Stop and finalize the current recording

Blocks briefly server-side (up to ~5s) until the encoder confirms the file is fully written before responding.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the current recording status

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

List saved recordings

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Download a saved recording

Returns the raw MP4 bytes, not the standard ok/data envelope -- fileName is sanitized against path traversal.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
fileName
required
string

Responses

Response Schema: video/mp4
string <binary>

Response samples

Content type
application/json
{
  • "ok": false,
  • "data": { },
  • "error": {
    },
  • "meta": {
    }
}

Capture a single PNG snapshot of the main application window

Independent of any in-progress video recording -- can be called whether or not /recording/start is active.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
optional
fileName
string

Sanitized against path traversal; .png appended if missing; auto-generated timestamped name if omitted.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "fileName": "string"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

List saved snapshots

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Download a saved snapshot

Returns the raw PNG bytes, not the standard ok/data envelope -- fileName is sanitized against path traversal.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
fileName
required
string

Responses

Response Schema: image/png
string <binary>

Response samples

Content type
application/json
{
  • "ok": false,
  • "data": { },
  • "error": {
    },
  • "meta": {
    }
}

Spout

Spout output (Windows only, builds with the Spout SDK): share the visual output as a texture with OBS, Resolume, TouchDesigner, VJ apps... on the same computer, with no encoding. Status, settings, start/stop and the list of senders registered on the machine.

Get the live state of the Spout output

Always answers, also on a build without the SDK (available: false). A stopped output has null for everything that comes from a frame.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the Spout output settings

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Change some of the Spout output settings

Persists the change (the same store as the Settings > Spout Output panel). Works while the output is stopped or running: see SpoutConfigPatch for what applies live and what recreates the sender. The answer is the resulting settings.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
senderName
string
fps
integer
scale
number
width
integer
height
integer
string or integer
string or integer
adapterIndex
integer
autoStart
boolean

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "senderName": "string",
  • "fps": 0,
  • "scale": 0,
  • "width": 0,
  • "height": 0,
  • "source": "output",
  • "mode": "auto",
  • "adapterIndex": 0,
  • "autoStart": true
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Start the Spout output

The body is optional. Sending settings starts with them and stores them only if the output really starts. The GPU path needs the application window to be shown: a hidden or minimised window renders nothing, so the output would report stalled. A receiver must run on the same GPU as the sender (with several GPUs use mode cpu and adapterIndex).

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
optional
senderName
string
fps
integer
scale
number
width
integer
height
integer
string or integer
string or integer
adapterIndex
integer
autoStart
boolean

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "senderName": "string",
  • "fps": 0,
  • "scale": 0,
  • "width": 0,
  • "height": 0,
  • "source": "output",
  • "mode": "auto",
  • "adapterIndex": 0,
  • "autoStart": true
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Stop the Spout output

Removes the sender from Spout. The settings are kept.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

List the Spout senders registered on this machine

To check that a receiver can see this application (its own sender is listed when running).

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Read a Spout layout file

Tolerant read (an output with unusable data is dropped or falls back; it never rejects the file). valid/validationErrors report the strict check PUT would apply to this same file. A file that is not a JSON object at all is 422 INVALID_PAYLOAD.

Authorizations:
bearerAuthapiKeyAuth
query Parameters
path
string

Layout file, relative to the application folder or absolute. Default spout_config/spout_layout_config.example.json.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Write a Spout layout file

The whole layout is validated strictly (unique non-empty names, at most 16 outputs, a valid shape per mask type...) and refused as one if anything is wrong: no partial save. Written exactly as sent; if path is the running layout it is reloaded at once. Broadcasts spout.layout.updated.

Authorizations:
bearerAuthapiKeyAuth
query Parameters
path
string

Layout file, relative to the application folder or absolute. Default spout_config/spout_layout_config.example.json.

Request Body schema: application/json
required
required
Array of objects (LayoutOutput) <= 16 items

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "outputs": [
    ]
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the live state of the Spout layout service

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the Spout layout service settings

The service's own settings, not the layout file's content.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Change the Spout layout service settings

Unlike PATCH /spout/config every field applies immediately (a layoutPath change reloads a running layout in place). An empty patch is 422 EMPTY_PATCH. Broadcasts spout.layout.updated.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
layoutPath
string
mode
string
Enum: "auto" "gpu" "cpu"
source
string
Enum: "output" "window"
fps
integer [ 0 .. 120 ]
adapterIndex
integer >= -1
autoStart
boolean

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "fps": 30,
  • "autoStart": true
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Start the Spout layout service

The body is optional, with the same fields as PATCH /spout/layout/config; they apply immediately even if the start then fails. Broadcasts spout.layout.started.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
optional
layoutPath
string
mode
string
Enum: "auto" "gpu" "cpu"
source
string
Enum: "output" "window"
fps
integer [ 0 .. 120 ]
adapterIndex
integer >= -1
autoStart
boolean

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "fps": 30,
  • "autoStart": true
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Stop the Spout layout service

Broadcasts spout.layout.stopped.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Re-read the layout file now

Instead of waiting for the 500 ms watch. If the file went missing or stopped parsing the previous layout keeps running.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

List the saved layout files

Base names (no extension) of the .json files under spout_config/, to build a ?path= picker. Empty, not an error, before the folder has anything in it.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the live Ableton Link session state

Read-only. Also answers on a build without the SDK (available false, everything else 0 / false).

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the Ableton Link settings

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Change some of the Ableton Link settings

Persists the change (the same store as the Settings > Ableton Link panel) and applies it live. The answer is the resulting settings.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
enabled
boolean
quantum
integer [ 1 .. 32 ]
phaseOffsetMs
integer [ -500 .. 500 ]
barOffsetBeats
integer [ 0 .. 31 ]
string or integer
string or integer
mirrorLinkBeatsToLegacySignal
boolean
beatWindowMs
integer [ 10 .. 200 ]
tempoSmoothingMs
integer [ 0 .. 2000 ]
fallbackToAudioOnDisconnect
boolean
beatsDuringSilence
boolean

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "enabled": true,
  • "quantum": 1,
  • "phaseOffsetMs": -500,
  • "barOffsetBeats": 0,
  • "clockSource": "audio",
  • "beatPolicy": "linkGrid",
  • "mirrorLinkBeatsToLegacySignal": true,
  • "beatWindowMs": 10,
  • "tempoSmoothingMs": 0,
  • "fallbackToAudioOnDisconnect": true,
  • "beatsDuringSilence": true
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Make the Link beat playing now the 1 of the bar

Call it when you hear the first beat of the bar (a little before or after is fine): the Link beat nearest to now becomes beat 1, which sets barOffsetBeats. It persists and applies live, and only shifts this application's own bar count: the session tempo and the other apps are untouched. It needs a live session, so with Link off, alone or without a valid tempo the answer is 409 NO_CLOCK and nothing changes.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Beat

The beat clock: the musical time base that effects and cues build on the Ableton Link session (beat line, position in the bar and the phrase, phrase anchor, effect tempo multiplier). Read-mostly: it has no clock of its own, so with Link off or alone in the session it reports valid false.

Get the live state of the beat clock

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the beat clock settings

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Change the beat clock settings

Persists the change and applies it live. The answer is the resulting settings.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
tempoMultiplier
number
Enum: 0.25 0.5 1 2 4

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "tempoMultiplier": 0.25
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Mark the start of the phrase

The downbeat nearest to now becomes bar 0 and bars are counted from there (a little before or after the downbeat is fine). Changing barOffsetBeats or the quantum, or losing the session, puts the anchor back to automatic. Without a beat clock the answer is 409 NO_CLOCK and nothing changes.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Go back to the automatic phrase anchor

Bars are counted again from the bar in progress. Harmless when there is no beat clock.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Timecode

Timecode sync (MTC over MIDI, LTC over an audio channel, or an internal manual clock) and the cue list that fires ActionDispatcher actions when the timecode crosses a cue. Live status, device settings, manual transport and cue CRUD/import/export.

Get the whole cue list

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Change the master switch and/or replace the whole cue list

Applies live and persists (the same store as the desktop Timecode Cues editor). Cue items are validated before anything is applied.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
enabled
boolean
Array of objects (TimecodeCueInput)

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "enabled": true,
  • "entries": [
    ]
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

List the cues

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Create a cue

The id is always generated by the server (one sent in the body is dropped). enabled defaults to true and frames to 0.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
enabled
boolean
Default: true
name
string

Optional label shown in the desktop editor.

hours
required
integer [ 0 .. 23 ]
minutes
required
integer [ 0 .. 59 ]
seconds
required
integer [ 0 .. 59 ]
frames
integer [ 0 .. 29 ]
Default: 0
action
required
string
Enum: "spawnShape" "style" "artist" "imagePlaylist" "avatarPlaylist" "videoPlaylist" "playlistStep" "dmxScene" "layerVisibility" "maskStep" "setConfigValue" "setFromInput" "beatAnchor" "markDownbeat"
target
string

What the action applies to (style name, artist, playlist, scene, layer...); depends on action.

value
any

Action argument; type depends on action. beatAnchor: mark (default) or clear. markDownbeat takes neither a target nor a value.

direction
any

playlistStep only: which way to step.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "enabled": true,
  • "name": "string",
  • "hours": 0,
  • "minutes": 0,
  • "seconds": 0,
  • "frames": 0,
  • "action": "spawnShape",
  • "target": "string",
  • "value": null,
  • "direction": null
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Reorder the cues

Registered before the {entryId} route so this exact path is matched instead of being captured as an id.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
order
required
Array of strings

Every current cue id, each exactly once, in the new order.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "order": [
    ]
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Change some fields of a cue

Authorizations:
bearerAuthapiKeyAuth
path Parameters
entryId
required
string
Request Body schema: application/json
required
enabled
boolean
name
string
hours
integer [ 0 .. 23 ]
minutes
integer [ 0 .. 59 ]
seconds
integer [ 0 .. 59 ]
frames
integer [ 0 .. 29 ]
action
string
Enum: "spawnShape" "style" "artist" "imagePlaylist" "avatarPlaylist" "videoPlaylist" "playlistStep" "dmxScene" "layerVisibility" "maskStep" "setConfigValue" "setFromInput" "beatAnchor" "markDownbeat"
target
string
value
any
direction
any
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object (TimecodeCue)

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "enabled": true,
  • "name": "string",
  • "hours": 0,
  • "minutes": 0,
  • "seconds": 0,
  • "frames": 0,
  • "action": "spawnShape",
  • "target": "string",
  • "value": null,
  • "direction": null
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Delete a cue

Authorizations:
bearerAuthapiKeyAuth
path Parameters
entryId
required
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Fire a cue's action now

Runs the same synchronous ActionDispatcher path as POST /actions/execute, ignoring the incoming timecode; handy to test a new cue. The dispatch context carries source "timecode" and the cue id.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
entryId
required
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

List the saved cue files

For a client with no filesystem access of its own (a phone) that wants a picker; rebuild the path as timecode_cues/.json for the file routes below.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Save the cue list to a JSON file

Writes {enabled, entries} to disk, the server-side counterpart of the desktop editor's Save. Accepts an arbitrary path (relative to the application folder, or absolute), like the editor.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
optional
path
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object (TimecodeCuesFileResult)

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "path": "string"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Load the cue list from a JSON file

Replaces the whole live cue list with the file's {enabled, entries}, the server-side counterpart of the desktop editor's Load. Every entry is validated first; nothing is applied if one fails.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
optional
path
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object (TimecodeCuesFileResult)

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "path": "string"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the live decoded timecode

Read-only; what is being decoded right now, as opposed to /timecode/config (what can be configured).

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the Timecode settings and the available devices

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Change some of the Timecode settings

Same store as the desktop Settings > Timecode panel; applies live. See TimecodeConfigPatch for the order and the fact that it is not atomic.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
sourceMode
integer [ 0 .. 4 ]
selectedMidiInput
integer >= -1

Index in availableMidiInputs, -1 = none.

selectedAudioInput
integer >= -1

Index in availableAudioInputs, -1 = none.

ltcChannelIndex
integer >= 0
enabled
boolean

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "sourceMode": 0,
  • "selectedMidiInput": -1,
  • "selectedAudioInput": -1,
  • "ltcChannelIndex": 0,
  • "enabled": true
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Rescan the MIDI input ports

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Rescan the audio input devices

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the manual clock transport

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Play / pause the manual clock or change its frame rate

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
running
boolean
frameRate
number > 0

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "running": true,
  • "frameRate": 1
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Jump the manual clock to an absolute position

Does not fire the cues it skips (the next position is not compared against the previous one).

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
hours
required
integer
minutes
required
integer
seconds
required
integer
frames
required
integer

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "hours": 0,
  • "minutes": 0,
  • "seconds": 0,
  • "frames": 0
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Jump the manual clock relative to its position

Does not fire the cues it skips (the next position is not compared against the previous one).

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
deltaSeconds
required
number

Relative jump: positive = forward, negative = back (clamped at 00:00:00:00).

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "deltaSeconds": 0
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Schedule

Programming schedule: actions fired at a time of day on chosen weekdays (the desktop Schedule editor's data), entry CRUD, JSON file import/export and a simulated clock to test it.

Get the whole programming schedule

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Change the master switch and/or replace the whole entry list

Applies live and persists (prefs.programmingSchedule, the same data the desktop Schedule editor edits). entries REPLACES the list; every entry is validated first and one bad entry refuses the patch. An empty object is 422 EMPTY_PATCH.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
enabled
boolean
Array of objects (ScheduleEntryInput)

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "enabled": true,
  • "entries": [
    ]
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

List the schedule entries

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Create a schedule entry

The id is always generated by the server (one sent in the body is dropped). enabled defaults to true and second to 0.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
enabled
boolean
Default: true
name
string

Optional label shown in the desktop editor.

hour
required
integer [ 0 .. 23 ]
minute
required
integer [ 0 .. 59 ]
second
integer [ 0 .. 59 ]
Default: 0
daysOfWeek
required
Array of integers non-empty [ items [ 0 .. 6 ] ]

Days it fires, Sunday = 0.

action
required
string
Enum: "spawnShape" "style" "artist" "imagePlaylist" "avatarPlaylist" "videoPlaylist" "playlistStep" "dmxScene" "layerVisibility" "maskStep" "setConfigValue" "setFromInput" "beatAnchor" "markDownbeat"
target
string
value
any

Action argument; type depends on action.

direction
any

playlistStep only: which way to step.

property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "enabled": true,
  • "name": "Opening style",
  • "hour": 21,
  • "minute": 30,
  • "second": 0,
  • "daysOfWeek": [
    ],
  • "action": "style",
  • "target": "Neon Tunnel"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Reorder the schedule entries

Registered before the {entryId} route so this exact path is matched instead of being captured as an id.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
order
required
Array of strings

Every current entry id, each exactly once, in the new order.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "order": [
    ]
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Change some fields of a schedule entry

Any subset of the entry fields, merged into the stored entry (id is ignored). The merged entry is validated. Nothing to change once id is ignored is 422 EMPTY_PATCH.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
entryId
required
string
Request Body schema: application/json
required
enabled
boolean
name
string
hour
integer [ 0 .. 23 ]
minute
integer [ 0 .. 59 ]
second
integer [ 0 .. 59 ]
daysOfWeek
Array of integers non-empty [ items [ 0 .. 6 ] ]
action
string
target
string
value
any
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object (ScheduleEntry)

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "enabled": true,
  • "name": "string",
  • "hour": 0,
  • "minute": 0,
  • "second": 0,
  • "daysOfWeek": [
    ],
  • "action": "string",
  • "target": "string",
  • "value": null
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Delete a schedule entry

Authorizations:
bearerAuthapiKeyAuth
path Parameters
entryId
required
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Fire a schedule entry's action now

Runs the entry's action through the same synchronous ActionDispatcher path as POST /actions/execute, ignoring its hour/minute/days. The dispatch context carries source "schedule" and the entry id.

Authorizations:
bearerAuthapiKeyAuth
path Parameters
entryId
required
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Save the schedule to a JSON file

Writes {enabled, entries} to disk, the server-side counterpart of the desktop editor's Export. path defaults to programming_schedule/programming_schedule.json; a relative path is resolved against the application folder and an absolute one is used as is.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
optional
path
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object (ScheduleFileResult)

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "path": "string"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Load the schedule from a JSON file

Replaces the whole live schedule with the file's {enabled, entries}. Every entry is validated first; nothing is applied if one fails. A file that is not a JSON object with an entries array is 422 INVALID_JSON.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
optional
path
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object (ScheduleFileResult)

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "path": "string"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the simulated-clock offset of the scheduler

Runtime only: the offset is never persisted, so a forgotten offset cannot survive a restart and fire the real schedule at the wrong time.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Set or shift the simulated-clock offset

Send offsetSeconds (absolute) and/or jumpSeconds (relative, added after offsetSeconds when both are sent). One of the two is required. Useful to test a schedule without waiting for its hour.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
offsetSeconds
number

Absolute offset.

jumpSeconds
number

Relative shift of the current offset.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "jumpSeconds": 600
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Actions

Run one ActionDispatcher action now, the same path the schedule, the timecode cues and the MIDI/OSC/HID controllers use.

Run an ActionDispatcher action now

Fire-and-forget: the same synchronous path the Programming Schedule, the timecode cues and the MIDI/OSC/HID controllers use, so an action launched here behaves identically. The dispatch context carries source "api". The vocabulary of action/target/value is the one of the Programming Schedule entries.

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
action
required
string
Enum: "spawnShape" "style" "artist" "imagePlaylist" "avatarPlaylist" "videoPlaylist" "playlistStep" "dmxScene" "layerVisibility" "maskStep" "setConfigValue" "setFromInput" "beatAnchor" "markDownbeat"
target
string

What the action applies to (style name, artist, playlist, scene, layer...); depends on action.

value
any

Action argument; type depends on action.

object

Extra named arguments (playlistStep reads direction here when value is empty).

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "action": "style",
  • "target": "Neon Tunnel"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

NDI

NDI output through the separate DjMirrorPulseNdiBridge process: the layout file it follows (outputs[]) and the control of the process itself (start/stop/status/settings).

Read an NDI layout file

Returns the file's own JSON object plus path. Unlike the Spout layout GET it does not parse outputs[]: the bridge process is the tolerant reader. A file that exists but is not valid JSON is 500 INVALID_JSON.

Authorizations:
bearerAuthapiKeyAuth
query Parameters
path
string

Layout file, relative to the application folder or absolute. Default ndi_config/ndi_bridge_config.example.json.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Write an NDI layout file

outputs must be present and an array, with no per-field validation. Written exactly as sent. DjMirror Pulse holds no live state for it: the bridge re-reads the file by itself while it runs.

Authorizations:
bearerAuthapiKeyAuth
query Parameters
path
string

Layout file, relative to the application folder or absolute. Default ndi_config/ndi_bridge_config.example.json.

Request Body schema: application/json
required
required
Array of objects (LayoutOutput)
property name*
additional property
any

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "outputs": [
    ]
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the state of the NDI bridge process

Process-only: the bridge has no IPC channel back to the app, so this means "the process is alive", never frames sent or receivers connected.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Start the NDI bridge process

No body: it always uses what GET /ndi/settings has. Broadcasts ndi.started.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Stop the NDI bridge process

Abrupt: a kill(), not an orderly shutdown (the windowless process ignores terminate()). Broadcasts ndi.stopped.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Get the NDI bridge launch settings

Not the layout file's content: that is /ndi/config.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Change the NDI bridge launch settings

Persists across restarts and never starts or stops the bridge by itself: call POST /ndi/start after. An empty patch is 422 EMPTY_PATCH. Broadcasts ndi.updated (at most once per 150 ms).

Authorizations:
bearerAuthapiKeyAuth
Request Body schema: application/json
required
autoStart
boolean

Launch the bridge when the application starts.

bridgeExecutablePath
string

For a nonstandard install. Empty = auto-detect.

singleWindowMode
boolean

false = the next start follows the layout file; true = one uncropped source for the whole window.

windowTitle
string

singleWindowMode only. Empty = the bridge's default.

sourceName
string

singleWindowMode only. Empty = the bridge's default.

fps
integer

singleWindowMode only. 0 = the bridge's default (60).

scale
number [ 0.1 .. 1 ]

singleWindowMode only.

width
integer [ 16 .. 16384 ]

singleWindowMode only; set together with height. 0 = follow the window.

height
integer [ 16 .. 16384 ]

singleWindowMode only; set together with width.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "singleWindowMode": true,
  • "sourceName": "Main",
  • "scale": 0.5
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

List the saved NDI layout files

Base names (no extension) of the .json files under ndi_config/, to build a ?path= picker. Empty, not an error, before the folder has anything in it.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Realtime

Long-poll config change subscription.

Long-poll for the next config change

Held open until the next config change; the server then writes a single event and the connection closes (client must re-subscribe). NOT wrapped in the standard ok/data envelope on success -- see SubscribeEvent. DMX-related changes are not delivered here; connect the WebSocket (ws://localhost:<httpPort+1>) for those.

Authorizations:
bearerAuthapiKeyAuth

Responses

Response Schema: application/json
type
required
string
Value: "event"
eventType
required
string
Value: "config.changed"
resource
required
string
Value: "config"
action
required
string
Value: "updated"
required
object
requestId
required
string
timestamp
required
string <date-time>

Response samples

Content type
application/json
{
  • "type": "event",
  • "eventType": "config.changed",
  • "resource": "config",
  • "action": "updated",
  • "data": { },
  • "requestId": "string",
  • "timestamp": "2019-08-24T14:15:22Z"
}

Pairing

Mobile app pairing by QR code (docs_tech/docs_mobile/PLAN_MOBILE_QR_PAIRING.md). The phone has no license of its own: it claims a one-use code shown on the desktop, gets a deviceToken and inherits the desktop license. Management routes (QR, confirmation, device list) need the API key when there is one; without an API key they are only accepted from the computer itself (loopback). A deviceToken never manages pairing (403 FORBIDDEN).

Pair a phone with the code of the QR

Public: the one-use code authenticates it. The code expires after 3 minutes and is locked after 5 wrong attempts; at most 10 claims per minute per address. If the desktop asks for confirmation (the default), the response waits up to 30 s for the user to accept.

Request Body schema: application/json
required
code
string

26-character base32 Crockford code from the QR (c=).

shortCode
string

XXXX-XXXX code shown under the QR.

deviceId
required
string <= 64 characters ^[A-Za-z0-9_.{}-]+$

Stable id of the phone install.

deviceName
string
platform
string
appVersion
string
protocol
required
integer
Value: 1

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object (PairingClaimData)

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Request samples

Content type
application/json
{
  • "code": "string",
  • "shortCode": "7K3M-Q9TZ",
  • "deviceId": "string",
  • "deviceName": "Pixel 8",
  • "platform": "android",
  • "appVersion": "string",
  • "protocol": 1
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Identify the desktop

Public. Lets a paired phone recognise its desktop after an IP change, without revealing anything the QR does not already say.

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Create a pairing QR code

Replaces the previous code, if any. The body is optional.

Authorizations:
bearerAuthapiKeyAuthNone
Request Body schema: application/json
optional
requireConfirmation
boolean

Default: the desktop setting (Settings > Mobile app).

Responses

Request samples

Content type
application/json
{
  • "requireConfirmation": true
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

The current pairing code

Authorizations:
bearerAuthapiKeyAuthNone

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Cancel the current pairing code

A phone waiting for confirmation gets 410 PAIRING_CODE_EXPIRED.

Authorizations:
bearerAuthapiKeyAuthNone

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

A phone waiting for confirmation

Authorizations:
bearerAuthapiKeyAuthNone

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Approve or reject the waiting phone

Authorizations:
bearerAuthapiKeyAuthNone
path Parameters
action
required
string
Enum: "approve" "reject"

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

List the paired phones

Authorizations:
bearerAuthapiKeyAuthNone

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}

Unpair a phone

Its token stops working (401 DEVICE_REVOKED) and its WebSocket is closed.

Authorizations:
bearerAuthapiKeyAuthNone
path Parameters
deviceId
required
string

Responses

Response Schema: application/json
ok
required
boolean
Value: true
required
object

Unconstrained here; each operation's response narrows this via allOf.

error
required
object or null

Always null on success.

required
object (Meta)

Response samples

Content type
application/json
{
  • "ok": true,
  • "data": {
    },
  • "error": { },
  • "meta": {
    }
}