TeleTool exposes a small JSON API from the same FastAPI service as the web UI. It controls NDI® output and related Tvheadend and local-audio functions.
Base URL:
http://<teletool-host>:8000
FastAPI also publishes generated docs at /docs and the OpenAPI schema at /openapi.json.
{"detail": "message"}.channel_uuid values from GET /api/channels when starting NDI.| Method | Endpoint | Purpose |
|---|---|---|
GET |
/api/channels?force_refresh=0 |
List Tvheadend channels. |
GET |
/api/status?lite=1&stats=1&logs=0&rf=0 |
Current NDI, audio, and supervisor status. Set rf=1 to include RF status in the same response. |
GET |
/api/rf |
Current cached/live Tvheadend RF status. Calibrated carrier-to-noise is returned as cnr_db and cnr_label; the web UI polls this separately from pipeline status. |
GET |
/api/ndi/runtime |
NDI SDK runtime readiness, paths, SDK URL, and upload availability. |
POST |
/api/ndi/runtime/upload |
Upload, validate, and install an ARM64 libndi.so.6 request body. |
POST |
/api/start |
Start or restart the NDI stream. |
POST |
/api/stop |
Stop NDI and local audio output. |
POST |
/api/test-card/start |
Start the card using the configured NDI delay and the same shared output timing as TV. |
POST |
/api/test-card/stop |
Stop the card and its separate audio output. |
With stats=1, status includes timing: readiness, the negotiated shared base
latency, effective NDI delay, queue occupancy/limits, and bounded audio-handoff
counters. These describe sender-side scheduling, not measured receiver latency.
The handoff discard count includes buffers skipped when attaching a new audio
pipeline as well as overflow/late buffers.
Start NDI:
{
"channel_uuid": "17bd44180657823bdb1cdc7e27b71610",
"ndi_name": "TeleTool",
"ndi_groups": "Public",
"profile": "pass",
"deinterlace": false,
"buffer_extra_ms": 0,
"ndi_qos": false,
"ndi_multicast_enabled": false,
"ndi_multicast_netprefix": "239.255.0.0",
"ndi_multicast_netmask": "255.255.0.0",
"ndi_multicast_ttl": 1
}
The multicast prefix must be the first address in a contiguous IPv4 multicast range. Changing NDI groups, Discovery Server, or multicast settings causes a controlled program restart; the requested stream starts automatically after the NDI runtime reloads its configuration.
Minimal curl example:
curl http://teletool.local:8000/api/channels
curl -X POST http://teletool.local:8000/api/start \
-H "Content-Type: application/json" \
-d '{"channel_uuid":"<uuid>","ndi_name":"TeleTool","profile":"pass"}'
The runtime status response includes capabilities.sender_advertiser, which is
true only when the installed runtime exposes the NDI sender-advertiser API used
by the Discovery app’s advertising-sender view. The runtime upload endpoint
accepts the library itself as an application/octet-stream request body. It is
intended for the /ndi-setup holding page and rejects non-ELF, non-64-bit,
non-AArch64, oversized, or non-NDI files.
| Method | Endpoint | Purpose |
|---|---|---|
GET |
/api/audio/devices |
List suitable local outputs and a separately installed Inferno ALSA network output, including readiness. |
GET |
/api/audio/defaults |
Current default audio device and volume. |
GET |
/api/audio/status?logs=1 |
Local audio output status. |
POST |
/api/audio/start |
Start an isolated output from the active TV/card decoded audio timeline. |
POST |
/api/audio/stop |
Stop line output. |
Inferno device entries include ptp_state and set ready to false while no
PTP grandmaster or primary leader is available. In that state, details
contains a short operator-facing explanation and audio start returns HTTP 409.
Start audio:
{
"device_id": "alsa:hw:CARD=AVIO,DEV=0",
"volume": 0.8
}
NDI must already be running before audio can start.
TV setup rebuilds Tvheadend tuner/channel data and should not be run while on air.
| Method | Endpoint | Purpose |
|---|---|---|
GET |
/api/tv/setup/regions |
List DVB-T/T2 scan regions and the selected default. |
POST |
/api/tv/setup/run |
Start a destructive Tvheadend scan and service map. |
GET |
/api/tv/setup/status |
Poll setup progress, logs, and result. |
GET |
/api/tv/setup/report |
Download the most recent TV scan report as a PDF. |
Setup status includes muxes_scanned, muxes_total, services_found,
report_available, report_url, and report_error.
These counters are updated by the existing scan poll and remain available in
complete, partial, and failed results. Starting a new scan removes the previous
report. The replacement PDF records the unit identity, scan result, mux/service
counts, and calibrated average dBm and C/N readings for each mux.
Run TV setup with the default region:
{}
Run TV setup with the TeleTool UK auto scan:
{
"scanfile": "teletool/uk-auto-dvbt-dvbt2"
}
| Method | Endpoint | Purpose |
|---|---|---|
GET |
/api/config/ui |
Read editable UI/runtime config. |
POST |
/api/config/ui |
Patch editable config values. |
Common keys include:
{
"tvh_stream_profile": "pass",
"tvh_dvbt_scanfile": "",
"ndi_default_name": "TeleTool",
"ndi_groups": "Public",
"ndi_discovery_server": "192.168.1.20",
"ndi_delay_ms": 500,
"ndi_deinterlace": false,
"ndi_stall_timeout_s": 15.0,
"lineout_volume": 0.8
}
New installations and an empty tvh_dvbt_scanfile select TeleTool’s Generic
Auto Default UK profile, which scans UHF channels 21-48 using both DVB-T and
DVB-T2. DVB-T2 is checked at the nominal centre frequency and the UK
+/-167 kHz offsets so HD multiplexes are not dependent on tuner AFC behavior.
Existing installations using the legacy Tvheadend Generic profile are migrated
to this default when the tuning page is loaded. The legacy profile is DVB-T
only. A scan that finds standard-definition services but does not lock a DVB-T2
multiplex is reported as partial because HD services may be missing.
After TV setup completes, TeleTool stores the exact scanfile key returned by the
installed Tvheadend version.
ndi_groups and ndi_discovery_server accept comma-separated values; discovery
server entries must be IP addresses, with optional :port.
NDI group and Discovery Server changes are SDK startup settings. If a config
change returns restart_required: true, TeleTool will restart before those
settings become active. A /api/start request that changes the group may return
restart_required: true; the requested stream is saved and started
automatically after the restart.
| Method | Endpoint | Purpose |
|---|---|---|
GET |
/api/release |
App version, release branch, and Inferno package state. |
GET |
/api/system/hostname |
Current hostname. |
POST |
/api/system/hostname |
Set hostname. |
GET |
/api/system/network_info |
Current network interfaces and warnings. |
POST |
/api/system/network |
Set eth0 DHCP or manual IPv4 config. |
POST |
/api/system/restart_program |
Restart the TeleTool process. |
POST |
/api/system/reboot |
Reboot the Pi, if permitted. |
GET |
/api/system/update_status |
Poll software update state. |
POST |
/api/system/update_from_server |
Switch a package-managed unit to the signed Main/Dev APT channel selected by branch, with inferno_action set to keep, install, or remove. |
Manual network example:
{
"mode": "manual",
"ip_address": "192.168.1.50",
"subnet_mask": "255.255.255.0",
"gateway": "192.168.1.1",
"dns": "1.1.1.1 8.8.8.8"
}
DHCP example:
{
"mode": "dhcp"
}
Update example:
{
"confirm": true,
"branch": "dev",
"inferno_action": "install"
}
| Method | Endpoint | Purpose |
|---|---|---|
GET |
/api/manager/status |
Combined status for the primary and managed units. |
GET |
/api/manager/units |
List managed units. |
GET |
/api/manager/discovery |
Return this unit’s read-only discovery identity and adoption/primary state. |
POST |
/api/manager/discovery/scan |
Discover and classify TeleTools on the local network without adopting them. |
POST |
/api/manager/units |
Add one or more units by host/IP. |
DELETE |
/api/manager/units/{unit_id} |
Remove a managed unit. |
POST |
/api/manager/units/{unit_id}/start |
Start NDI on a managed unit using its last/default request. |
POST |
/api/manager/units/{unit_id}/stop |
Stop NDI on a managed unit. |
GET |
/api/manager/adoption |
Show whether this unit is adopted by a manager. |
POST |
/api/manager/adoption/heartbeat |
Manager adoption lease heartbeat. |
POST |
/api/manager/adoption/release |
Release manager adoption lease. |
POST |
/api/manager/snapshot |
Return status, release, hostname, config, and adoption state in one Fleet Manager request. |
Network discovery uses the _teletool._tcp mDNS service and a bounded local
IPv4 scan for compatibility with older units. Results indicate whether each
unit is available, already listed, adopted by another primary, or is itself a
primary managing other units. Adoption happens only after a user selects a
result and posts it to /api/manager/units.
Add units:
{
"host": "192.168.1.21, teletool-stage.local"
}