HTTP API
REST endpoints for activating content, controlling outputs, and firing actions from external systems.
REST endpoints for controlling Lightpath from external systems. All paths are
relative to your install's base URL — for the examples below, replace
<your-install> with the actual host (e.g. http://192.168.1.50:3001).
Authentication
Every endpoint except /api/health and /api/login requires a bearer
token. Send it as Authorization: Bearer <token> on every request.
Get a token
POST /api/login accepts either email or username plus password. It
tries the cloud first (the default for Digital Ambiance and team accounts)
and falls back to the project's local user store on LAN-only requests
when a project is loaded — so air-gapped installs work with the same
endpoint.
Use the token
Send it as a bearer token on any authenticated endpoint:
Local fallback only runs on LAN. Requests through a Cloudflare tunnel must succeed against the cloud — the server won't try local for tunnel requests.
The server also exposes /api/auth/refresh, /api/auth/refresh-session,
/api/auth/reset-password, /api/auth/send-reset-email, and a few other
token-management endpoints used by the official Lightpath client. These
aren't part of the integration surface — third-party callers only need
/api/login and the bearer token it returns.
System integrations
For machine-to-machine integrations (Crestron control systems, lighting
boards, third-party show-control software) the simplest pattern is to
create a dedicated service user — e.g. crestron-integration — with the
operator role, then log in with that user's credentials and cache
the returned token. Re-login when the token expires (default 30 days)
or on a 401 response. Long-lived integration API keys are on the
roadmap and will use the same Authorization: Bearer header, so any
code you write against this auth model today will keep working.
Catalog
Read what's available in the loaded project. Authenticated.
| Method | Path | Description |
|---|---|---|
| GET | /sources | Available sources published by TouchDesigner |
| GET | /effects | Available effects published by TouchDesigner |
Content queries
Read content definitions. All require Authorization: Bearer <token>.
| Method | Path | Description |
|---|---|---|
| GET | /looks | All looks |
| GET | /looks/:name | A specific look |
| GET | /scenes | All scenes |
| GET | /scenes/:name | A specific scene |
| GET | /sequences | All sequences |
| GET | /sequences/:name | A specific sequence |
| GET | /playlists | All playlists |
| GET | /playlists/:name | A specific playlist |
| GET | /palettes | All palettes |
Content activation
Activate looks, scenes, and playlists. Authenticated.
| Method | Path | Description |
|---|---|---|
| POST | /looks/:name/activate | Activate a look by name |
| POST | /scenes/:name/activate | Activate a scene across all outputs |
| POST | /playlists/:name/activate | Start a playlist (per-output or global, auto-detected) |
Each look is bound to a single output at design time — the look activates on that output automatically; no body is required.
Playlist control
Add ?output=Name for per-output, omit for global. Authenticated.
| Method | Path | Description |
|---|---|---|
| POST | /playlists/pause | Pause playlist |
| POST | /playlists/resume | Resume playlist |
| POST | /playlists/stop | Stop playlist |
| POST | /playlists/next | Advance to next track (requires ?output=Name) |
| POST | /playlists/prev | Go to previous track (requires ?output=Name) |
| POST | /playlists/track | Jump to a specific track |
| POST | /playlists/loop | Toggle loop mode |
Actions
Execute actions and set toggle states. Authenticated.
| Method | Path | Description |
|---|---|---|
| GET | /actions | Get all actions |
| POST | /actions/:name/execute | Execute an action by name |
| POST | /actions/:name/state | Set a toggle action to a specific state |
Output control
Brightness and power state per output. Authenticated.
| Method | Path | Description |
|---|---|---|
| GET | /outputs | Get all outputs |
| POST | /outputs/:name/dimmer | Set output brightness (0.0 – 1.0) |
| POST | /outputs/:name/enabled | Enable or disable an output |
Playback
Global playback control and status. Authenticated.
| Method | Path | Description |
|---|---|---|
| POST | /playback/stop | Stop all playback across all outputs |
| GET | /playback/status | Get playback status for all playlists |
Health
The only public endpoint besides /api/login. Useful for liveness probes.
| Method | Path | Description |
|---|---|---|
| GET | /health | Status, uptime, version |
Errors
The API uses standard HTTP status codes.
| Status | Meaning |
|---|---|
| 200 | Success |
| 400 | Bad request — missing/invalid body or query parameters |
| 401 | Missing or expired bearer token |
| 403 | Authenticated but not authorized (e.g., wrong org for the loaded project, or local login attempted over a tunnel) |
| 404 | Resource not found (e.g., /looks/Unknown) |
| 500 | Server error |
Error responses are JSON:

