Remote Control: NDI Input Slots
How to route NDI sources to a server's input slots from outside Backstage, and read back what is currently routed.
An input slot is a named receiving point on the server. A slot is either unrouted or carries one NDI source from the network, and remote control is how you change which.
Before you start
- Input slots are configured in the project, each with the name you intend to address
- The NDI sources you want to route are visible on the same network as the server
- Settings > Remote Control > Enable Show-Control Protocol is on (off by default)
Show-control protocol — domain input
Send newline-delimited JSON to TCP 7400 (or UDP 7401 if enabled), with target set to the slot's exact name, case-sensitive.
The domain is called input, not ndi. Looking for an ndi domain is the usual reason people conclude this is not available over the protocol.
Actions
|
Action |
Args |
Effect |
|---|---|---|
|
|
— |
Every input slot, each as a status object. Also the fastest way to see which NDI sources are on the network |
|
|
— |
The status object for one slot |
|
|
|
Route that source to the slot. An empty |
source and setsource are accepted as aliases of route, so a controller written against either spelling works.
{"domain":"input","action":"list"}
{"domain":"input","action":"route","target":"Slot 1","args":{"source":"BIRDDOG (CAM)"}}
{"domain":"input","action":"route","target":"Slot 1","args":{"source":""}}
Status
|
Field |
Meaning |
|---|---|
|
|
The slot's name — the sole identifier, and what |
|
|
The NDI source currently routed to the slot; |
|
|
The NDI source names visible on the network. This is the same list for every slot, so one |
Because sources rides along with the status, there is no separate discovery call to make. Read one slot and you know both what it is carrying and what else it could carry.
Live status
{"domain":"sys","action":"subscribe","args":{"domains":["input"]}}
Backstage then pushes an immediate snapshot, an event whenever a routing changes, and a heartbeat roughly every 3 seconds. This matters more here than for most elements: NDI sources appear and disappear as machines come and go, so sources is a moving target and a subscription keeps a controller's picker honest without polling.
Controllers that cannot open a socket
The protocol needs a socket. Where a controller can only issue an HTTP GET — some AMX and Crestron configurations — slots are also reachable at /api/inputs/get and /api/inputs/route on port 8080, taking id and source as query parameters. Anything that can open a socket should use the protocol above instead.
Web Console
There is no input-slot block in the Web Console palette. Steppers, sequencers, broadcast schedulers, calibrators and audio mixers all have one; NDI routing does not. To give an operator slot control in a browser, drive it through a labelled node instead — see Remote Control: Node Endpoints.
Common Mistakes
-
Looking for an
ndidomain — it isinput. Nothing else in the protocol is named after NDI. -
404 input slot not found —
targetis the slot name and must match exactly, including case. Runinput.listto read back the real names. -
Routing a source that is not there — a source only routes if it is visible on the network. Check it appears in
sourcesfirst; a name that was valid yesterday may be gone. -
Trying to unroute with a missing argument — send
sourceas an empty string. Omitting the argument entirely is not the same intent expressed clearly.
Related
Remote Control — the routes, and every other controllable element
Enable and Configure the Show-Control Protocol — the protocol in full: transports, auth, allowlist, the reference client
Receive an NDI Stream — receiving an NDI stream in the first place
