WATCHOUT HTTP API

For complete API reference with schemas and interactive testing, visit:

http://localhost:3019/test

This document provides quick-reference examples for common integration tasks. Examples use curl syntax but work with any HTTP client. Many endpoints use timeline and cue IDs.

System

  • Get Software version
    curl http://localhost:3019/info
    

Playback

  • Get Current Playback State
    curl http://localhost:3019/v0/state
    
  • Play All Timelines
    curl -X POST http://localhost:3019/v0/play
    
  • Play Timeline by ID
    curl -X POST http://localhost:3019/v0/play/0
    
  • Pause Timeline by ID
    curl -X POST http://localhost:3019/v0/pause/0
    
  • Stop Timeline by ID
    curl -X POST http://localhost:3019/v0/stop/0
    
  • Jump to Time (milliseconds)
    curl -X POST "http://localhost:3019/v0/jump-to-time/0?time=6000&state=pause"
    
  • Jump to Cue
    curl -X POST "http://localhost:3019/v0/jump-to-cue/0/0?state=pause"
    
  • Get Timelines
    curl http://localhost:3019/v0/timelines
    
  • Get Timeline Cues
    curl http://localhost:3019/v0/cues/0
    
  • Send MSC (MIDI Show Control)
    curl -X POST -H "Content-Type: application/json" http://localhost:3019/v0/msc --data '[{"command": {"go": {}}}]'
    

Inputs

  • Get All Inputs
    curl http://localhost:3019/v0/inputs
    
  • Set Multiple Inputs
    curl -X POST -H "Content-Type: application/json" http://localhost:3019/v0/inputs --data '[{"key": "MyInput", "value": 0.5}]'
    
  • Set Input with Interpolation Duration (milliseconds)
    curl -X POST -H "Content-Type: application/json" http://localhost:3019/v0/inputs --data '[{"key": "MyInput", "value": 0.5, "duration": 1000}]'
    
  • Set Single Input by Name
    curl -X POST "http://localhost:3019/v0/input/MyInput?value=0.5"
    

Show

  • Get Current Show
    curl http://localhost:3019/v0/show
    
  • Load Show from JSON
    curl -X POST -H "Content-Type: application/json" http://localhost:3019/v0/show --data @show.json
    
  • Load Show from .watch File
    curl -X POST -H "Content-Type: application/octet-stream" http://localhost:3019/v0/showfile --data-binary @show.watch
    
  • Load Show with Name
    curl -X POST "http://localhost:3019/v0/showfile?showName=MyShow" -H "Content-Type: application/octet-stream" --data-binary @show.watch
    
  • Hit Test (check if coordinates hit cues)
    curl -X POST -H "Content-Type: application/json" http://localhost:3019/v0/hittest --data '{"cues": ["1/42"], "x": 960.0, "y": 540.0}'
    
    Returns {"hit_cues": ["1/42"]} for cues hit at the given stage coordinates. Only visual media cues without conditional rendering are supported.

Cue Sets

  • Get States by ID
    curl http://localhost:3019/v0/cue-group-state/by-id
    
  • Get States by Name
    curl http://localhost:3019/v0/cue-group-state/by-name
    
  • Switch Single Variant by ID
    curl -X POST http://localhost:3019/v0/cue-group-state/by-id/<groupId>/<variantId>
    
  • Switch Single Variant by Name
    curl -X POST http://localhost:3019/v0/cue-group-state/by-name/<groupName>/<variantName>
    
  • Switch Multiple Variants by ID
    curl -X POST -H "Content-Type: application/json" http://localhost:3019/v0/cue-group-state/by-id --data '{"groupId1": "variantId1", "groupId2": "variantId2"}'
    
  • Switch Multiple Variants by Name
    curl -X POST -H "Content-Type: application/json" http://localhost:3019/v0/cue-group-state/by-name --data '{"groupName1": "variantName1", "groupName2": "variantName2"}'
    
  • Reset All to Default (empty object)
    curl -X POST -H "Content-Type: application/json" http://localhost:3019/v0/cue-group-state/by-name --data '{}'
    

Event Streams

Three SSE versions are available, plus NDJSON alternatives:

SSE (Server-Sent Events)

EndpointEventsDescription
/v0/ssePlaybackState, CueVisibilityLegacy, basic events
/v1/ssePlaybackState, Inputs, ShowRevision, CueVisibilityFull state on each update
/v2/ssePlaybackState (diff), TimelineCountdowns, Inputs, ShowRevision, CueVisibilityOptimized with diffs and countdowns
curl http://localhost:3019/v2/sse

The TimelineCountdowns event provides countdown/countup timing to cues with status: Pre, Last10, Last5, Reached.

NDJSON (Newline-Delimited JSON)

Same event data as SSE, but as newline-delimited JSON stream:

curl http://localhost:3019/v2/ndjson

Node Management

These commands are sent directly to individual nodes (Runners), not to the Director. Replace the IP address with the target node's address.

  • Shutdown Node
    curl -X POST http://192.168.1.2:3017/v0/shutdown
    
  • Reboot Node
    curl -X POST http://192.168.1.2:3017/v0/reboot
    
  • Restart Node Services
    curl -X POST http://192.168.1.2:3017/v0/services/restart
    

Appendix

Timeline and Cue IDs

Many API endpoints require a timeline ID or cue ID. These are numeric identifiers that remain stable even if you rename the timeline or cue in Producer.

To get the IDs, use Copy ID from the context menu in the Timeline window. Right-clicking a cue copies both the timeline ID and cue ID.

For example, jump-to-cue/0/5 uses timeline ID 0 and cue ID 5.

curl

curl is a command-line tool for making HTTP requests. The examples in this document use curl syntax, but any HTTP client (Postman, Python requests, etc.) can be used.

Windows Notes

Windows 10/11 includes curl, but PowerShell has a built-in alias curl that points to Invoke-WebRequest. To use the real curl:

  • Use curl.exe instead of curl
  • Or remove the alias: Remove-Item Alias:curl

Single quotes in JSON don't work in PowerShell. Use escaped double quotes:

curl.exe -X POST -H "Content-Type: application/json" http://localhost:3019/v0/inputs --data "[{\"key\": \"MyInput\", \"value\": 0.5}]"

Or use a here-string:

$body = @'
[{"key": "MyInput", "value": 0.5}]
'@
curl.exe -X POST -H "Content-Type: application/json" http://localhost:3019/v0/inputs --data $body