Remote Control: NDI Input Slots

Last updated 7 August 2026

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

list

Every input slot, each as a status object. Also the fastest way to see which NDI sources are on the network

status

The status object for one slot

route

{"source": "<NDI source name>"}

Route that source to the slot. An emptysource unroutes the slot

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

name

The slot's name — the sole identifier, and what target must match

source

The NDI source currently routed to the slot; "" when the slot is unrouted

sources

The NDI source names visible on the network. This is the same list for every slot, so one list call gives a controller everything it needs to render a picker

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 ndi domain — it is input. Nothing else in the protocol is named after NDI.

  • 404 input slot not foundtarget is the slot name and must match exactly, including case. Run input.list to 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 sources first; a name that was valid yesterday may be gone.

  • Trying to unroute with a missing argument — send source as an empty string. Omitting the argument entirely is not the same intent expressed clearly.

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