Caspar: not required.
| Method | Path | Description |
|---|---|---|
| GET | /api/settings |
Full settings JSON |
| POST | /api/settings |
Persist settings |
| POST | /api/settings/apply-os |
Apply OS-related settings (GPU, etc.) |
curl -s http://127.0.0.1:4200/api/settings | jq .caspar.host
| Method | Path |
|---|---|
| POST | /api/config/apply |
| POST | /api/config/reset |
| Method | Path |
|---|---|
| GET | /api/caspar-config/generate |
| GET | /api/caspar-config/mode-choices |
| GET | /api/caspar-config/override |
| POST | /api/caspar-config/apply |
| POST | /api/caspar-config/override |
| Method | Path | Description |
|---|---|---|
| GET | /api/hardware/displays |
Display names (xrandr) |
| GET | /api/hardware/modeline-preview |
Modeline preview |
| GET | /api/system/gpu-nvidia |
NVIDIA probe |
| GET | /api/system/gpu-layout |
GPU port layout |
| GET | /api/system/decklink |
Decklink status |
| GET | /api/system/v4l2-devices |
V4L2 capture devices (?refresh=1) |
| GET | /api/v4l2-inputs |
USB video input config + bridge status |
| POST | /api/v4l2-inputs/config |
Persist V4L2 slot settings |
| POST | /api/v4l2-inputs/apply |
Start bridges + PLAY on host channels |
| GET | /api/virtual-camera |
Virtual cam config + runtime status |
| GET | /api/virtual-camera/status |
Alias |
| POST | /api/virtual-camera/config |
Persist virtual cam settings |
| POST | /api/virtual-camera/start |
Start v4l2loopback bridge (+ optional ALSA mic) |
| POST | /api/virtual-camera/stop |
Stop bridge |
| POST | /api/system/gpu-nvidia/apply |
Apply NVIDIA layout |
| POST | /api/system/gpu-ports-reset |
Reset port mapping |
| POST | /api/system/gui-launch |
Launch GUI helper |
| Method | Path |
|---|---|
| GET | /api/device-view |
| GET | /api/device-view/gpu-map-debug |
| POST | /api/device-view |
| GET | /api/device-snapshot/schema |
| GET | /api/device-snapshot/build |
| POST | /api/device-snapshot/apply |
| Method | Path | Notes |
|---|---|---|
| GET | /api/system/setup |
Setup wizard state (includes compact tailscale block) |
| POST | /api/system/setup/restart-window-manager |
nodm restart (password) |
| POST | /api/system/setup/restart-app |
Restart HighAsCG Node process |
| POST | /api/system/setup/reboot |
Reboot host (password) |
| POST | /api/system/setup/shutdown |
Power off host (password) — WO-460 |
| POST | /api/system/setup/install |
Launch Calamares installer — see Calamares install guide |
| GET | /api/system/caspar-arm |
Staged Caspar armed? |
| POST | /api/system/caspar-arm |
Arm Caspar start |
| DELETE | /api/system/caspar-arm |
Disarm |
| Method | Path | |
|---|---|---|
| GET | /api/system/exfat-sync |
|
| POST | /api/system/exfat-sync/run |
|
| GET | /api/logs |
|
| POST | /api/logs/clear |
|
| GET | /api/support/bundle |
Download diagnostics ZIP (configs, logs, GPU/xrandr, network) |
| POST | /api/support/bundle |
Same; optional JSON { "operatorNote": "…" } |
| GET | /api/host-stats |
Caspar: not required.
GET /api/system/exfat-sync)Returns the installed sync map (/etc/highascg/exfat-sync.json or repo config/exfat-sync.json) with per-pair mount status, paths, and existence flags. Useful before/after inserting the operator USB stick or bridge disk.
curl -s http://127.0.0.1:4200/api/system/exfat-sync | jq '.volumes, .pairs[] | select(.id | test("project"))'
Key pairs (see BRIDGE_DISK_AND_USB_EXFAT.md):
| Pair id | Volume | Direction | Role |
|---|---|---|---|
bridge-modular-config |
bridge | both | configs/ ↔ ~/highascg/config/ |
usb-modular-config |
usb | to_project | Stick configs → host at boot |
usb-media-ingest |
usb | to_project | media/ → ~/highascg/media/bridge (one-way) |
bridge-projects |
bridge | both | projects/ ↔ ~/highascg/projects/ (mtime sync) |
usb-projects |
usb | to_project | Stick projects/ → working dir at boot only |
Project saves use a separate code path (project-volume-sync.js): each POST /api/project/save pushes only the saved slug to mounted USB/bridge volumes. The usb-projects pair does not use pushOnSave — stick catalog updates happen on explicit project save, not on Settings save.
POST /api/system/exfat-sync/run)Preview (no writes):
curl -s -X POST http://127.0.0.1:4200/api/system/exfat-sync/run \
-H 'Content-Type: application/json' \
-d '{"dryRun": true}' | jq .
Commit mtime sync (overwrites older side per pair direction):
curl -s -X POST http://127.0.0.1:4200/api/system/exfat-sync/run \
-H 'Content-Type: application/json' \
-d '{"dryRun": false, "confirm": "EXFAT_SYNC"}' | jq .
400 without dryRun: true or confirm: "EXFAT_SYNC".
Implementation: src/api/routes-exfat-sync.js · src/system/exfat-sync.js
GET /api/logs)HighAsCG in-memory log buffer (also streamed live on WebSocket log_line). Filter by category and level:
curl -s 'http://127.0.0.1:4200/api/logs?lines=200&categories=artnet,os-display&levels=warn,error&caspar=0'
Categories include system, config, os-display, amcp, playback, streaming, audio, network, artnet, replication, websocket, device, sync, debug. Open the connection eye in the Web UI for a live view with category dropdown and level checkboxes.
GET /api/support/bundle)One ZIP for post-mortems and bug reports — redacted settings, Caspar XML, project summary, system inventory, network, GPU/xrandr layout, log tails, host stats. Filename pattern: highascg-support_<hostname>_<ISO-timestamp>.zip. Max size defaults to 25 MB (HIGHASCG_SUPPORT_BUNDLE_MAX_BYTES). Sensitive config keys (token, password, secret, …) are replaced with [REDACTED]; see manifest.json → redactedKeyPatterns.
curl -s -o support.zip 'http://127.0.0.1:4200/api/support/bundle?logLines=2000&casparLines=500'
unzip -l support.zip
Same bundle as the Support bundle button in the connection-eye logs modal, or Settings → Diagnostics. Use after a failure or before contacting support.
Caspar: required.
| Method | Path | Description |
|---|---|---|
| GET | /api/host-live/operator-fullscreen |
Operator fullscreen video route state |
| POST | /api/host-live/operator-fullscreen |
Toggle fullscreen route ({ sourceId, action }) |
| GET | /api/host-live/migration |
Preview legacy NDI/browser migration |
| POST | /api/host-live/migration |
Apply migration ({ migrateHostLiveSources: true }) |
WO-257 removed the CEF interactive bridge (/api/cef-interactive/*, /api/cef/arm-input,
/api/cef/release-input) and its keyboard/mouse/eval forwarding into embedded CEF HTML. Operator
fullscreen still routes a webpage host source onto the operator display (multiview or an
interactive-enabled screen consumer) — it just doesn’t forward input into it anymore. Templates
that expected input (e.g. template/mario) still play; they no longer receive clicks/keys.
Caspar: not required.
| Method | Path | Description |
|---|---|---|
| GET | /api/network/tailscale/status |
Status + config/tailscale.json |
| POST | /api/network/tailscale/enable |
{ enabled: boolean } |
| POST | /api/network/tailscale/login |
Start interactive login |
| POST | /api/network/tailscale/login-operator-ui |
Login + Firefox on operator :0 |
| POST | /api/network/tailscale/prefs |
Save tailscale preferences |
| POST | /api/network/tailscale/logout |
Log out of tailnet |
Full request/response examples: network-tailscale.md.
curl -s 'http://127.0.0.1:4200/api/logs?lines=100&source=highascg' | jq .