HTTP REST API

WATCHOUT exposes an HTTP API for programmatic show control, monitoring, and integration with third-party systems. This page is organized as a practical reference with one complete endpoint table and focused examples.

Base URLs and Ports

  • Operative API (main external control API): http://{host}:3019
  • Node Management API (per Runner node): http://{node_host}:3017
  • Asset Manager event stream (internal tooling/UI): http://{asset_manager_host}:3023

Replace {host} with the IP address or hostname of the machine running the relevant service. For local testing, use localhost or 127.0.0.1.

Enable/Disable

The HTTP API is controlled from the Network window. Use the WATCHOUT 7 Protocol and Web UI toggles to expose or hide HTTP-facing features.

Interactive API Docs

  • Interactive docs (RapiDoc): http://{host}:3019/test
  • OpenAPI spec: http://{host}:3019/api-docs/openapi.json

Complete Endpoint Table

The table below lists all documented HTTP endpoints in WATCHOUT.

ScopePortMethodEndpointPurposeNotes
System3019GET/infoGet build/version infoOperative
Docs3019GET/testInteractive API documentation UIOperative
Docs3019GET/api-docs/openapi.jsonOpenAPI schemaOperative
Playback3019GET/v0/stateGet playback state for all timelinesOperative
Playback3019POST/v0/playPlay all timelinesLegacy-compatible endpoint
Playback3019POST/v0/play/{timeline_id}Play one timelinetimeline_id is numeric
Playback3019POST/v0/pause/{timeline_id}Pause one timelinetimeline_id is numeric
Playback3019POST/v0/stop/{timeline_id}Stop one timeline and reset to starttimeline_id is numeric
Playback3019POST/v0/jump-to-time/{timeline_id}Jump timeline to timeQuery: time (ms), optional state (play or pause, default pause)
Playback3019POST/v0/jump-to-cue/{timeline_id}/{cue_id}Jump timeline to cue startQuery: optional state (play or pause, default pause)
Show3019GET/v0/showGet full current show JSONOperative
Show3019POST/v0/showLoad/replace show from JSONBody: show JSON
Show3019POST/v0/showfileLoad/replace show from binary .watch dataBody: binary
Show3019POST/v0/showfile?showName={name}Load .watch and set show nameOptional query variant
Show3019GET/v0/timelinesList timelinesIncludes IDs and names
Show3019GET/v0/cues/{timeline_id}List cues for timelineIncludes IDs and names
Inputs3019GET/v0/inputsGet all input variable specsIncludes keys and ranges
Inputs3019POST/v0/inputsSet multiple inputs (batch)Body: JSON array of input updates
Inputs3019POST/v0/input/{key}Set one inputQuery: value, optional duration (ms)
Cue Sets3019GET/v0/cue-group-state/by-idGet cue set states by IDsOperative
Cue Sets3019POST/v0/cue-group-state/by-idSet multiple cue set states by IDsBody: JSON map (groupId -> variantId)
Cue Sets3019POST/v0/cue-group-state/by-id/{group_id}/{variant_id}Set one cue set by IDsPath params
Cue Sets3019GET/v0/cue-group-state/by-nameGet cue set states by namesOperative
Cue Sets3019POST/v0/cue-group-state/by-nameSet multiple cue set states by namesBody: JSON map (groupName -> variantName)
Cue Sets3019POST/v0/cue-group-state/by-name/{group_name}/{variant_name}Set one cue set by namesPath params
Interaction3019POST/v0/hittestHit-test stage coordinates against cuesBody includes cues, x, y
MSC3019POST/v0/mscSend MIDI Show Control command(s)Body: JSON array
Stream (SSE)3019GET/v0/sseLegacy SSE streamReal-time updates
Stream (SSE)3019GET/v1/sseSSE stream with initial stateReal-time updates
Stream (SSE)3019GET/v2/sseOptimized SSE stream (diff-based playback updates)Real-time updates
Stream (NDJSON)3019GET/v0/ndjsonLegacy NDJSON streamSame event model as /v0/sse
Stream (NDJSON)3019GET/v1/ndjsonNDJSON stream with initial stateSame event model as /v1/sse
Stream (NDJSON)3019GET/v2/ndjsonOptimized NDJSON streamSame event model as /v2/sse
Node Mgmt3017POST/v0/shutdownShut down target node OSSent to a specific node
Node Mgmt3017POST/v0/rebootReboot target node OSSent to a specific node
Node Mgmt3017POST/v0/services/restartRestart WATCHOUT services on target nodeSent to a specific node
Asset Manager3023GET/sseAsset-state event stream used by tooling/UINot part of main Operative control API

Request Body Formats

Batch input update (POST /v0/inputs)

[
  {"key": "brightness", "value": 100.0, "duration": 2000},
  {"key": "volume", "value": 0.5}
]
  • key (string, required): external key mapped to a WATCHOUT variable
  • value (number, required): numeric value to apply
  • duration (number, optional): interpolation duration in milliseconds

Single input update (POST /v0/input/{key})

Use query parameters instead of JSON body:

/v0/input/brightness?value=100&duration=2000

Cue set batch update by name (POST /v0/cue-group-state/by-name)

{
  "Language": "English",
  "Sponsor": "BrandB"
}

Send {} to reset all cue sets to default variants.

Hit test (POST /v0/hittest)

{
  "cues": ["1/42", "1/43"],
  "x": 960.0,
  "y": 540.0
}

Response includes hit_cues with IDs that contain the given point.

Hit testing only works with visual media cues that do not use conditional rendering. Cues with conditional rendering applied are excluded from hit test results.

{
  "hit_cues": ["1/42"]
}

MIDI Show Control (POST /v0/msc)

[
  {"command": {"go": {}}}
]

Event Streams

WATCHOUT provides SSE and NDJSON endpoints for real-time updates.

StreamEndpointTypical events
SSE v0/v0/ssePlaybackState, CueVisibility
SSE v1/v1/ssePlaybackState, Inputs, ShowRevision, CueVisibility
SSE v2/v2/ssePlaybackState (diff), TimelineCountdowns, Inputs, ShowRevision, CueVisibility

The TimelineCountdowns event (v2 streams only) reports countdown status for each timeline with the following status values:

StatusMeaning
PreTimeline has not yet reached the countdown zone
Last10Within 10 seconds of the target time
Last5Within 5 seconds of the target time
ReachedThe target time has been reached
NDJSON v0/v0/ndjsonSame as SSE v0
NDJSON v1/v1/ndjsonSame as SSE v1
NDJSON v2/v2/ndjsonSame as SSE v2

Timeline and Cue IDs

Many endpoints require numeric timeline_id and cue_id values. Use Copy ID from timeline/cue context menus in Producer to retrieve stable IDs.

curl Examples

Get system info

curl http://localhost:3019/info

Play a timeline

curl -X POST http://localhost:3019/v0/play/0

Jump timeline and continue playing

curl -X POST "http://localhost:3019/v0/jump-to-time/0?time=6000&state=play"

Set one input

curl -X POST "http://localhost:3019/v0/input/Brightness?value=0.8&duration=500"

Set multiple inputs

curl -X POST -H "Content-Type: application/json" http://localhost:3019/v0/inputs --data '[{"key":"Brightness","value":0.8},{"key":"Volume","value":0.5}]'

Read cue set states by name

curl http://localhost:3019/v0/cue-group-state/by-name

Switch one cue set by name

curl -X POST http://localhost:3019/v0/cue-group-state/by-name/Language/English

Read v2 SSE stream

curl http://localhost:3019/v2/sse

Node reboot (target node API on port 3017)

curl -X POST http://192.168.1.12:3017/v0/reboot

Security and Access

By default, the HTTP API does not require authentication. Any client that can reach the service port can call endpoints.

  • Keep control ports on a trusted network.
  • Use firewall rules to restrict access.
  • Avoid exposing ports 3019/3017 directly to untrusted networks.

Notes

  • Inbound control endpoints are documented as GET and POST.
  • PUT/DELETE are not part of the documented inbound control API.
  • HTTP Output cues can send outbound GET/POST/PUT requests to external systems, which is separate from the inbound REST API described here.