Streams is the identity and inspection layer that sits on top of live transport objects in Callaba Engine. It is where a concrete media flow gets a stable name, role, stream id, optional host binding, and saved codec or audio-layout context that operators can reuse later.
In practice this module becomes useful when a transport object such as an SRT server or RTMP server is not enough by itself. Once a team needs one stream to stay recognizable across monitoring, playback, and troubleshooting, this is the layer that keeps that identity intact.
The easiest way to read the module is to separate a few recurring production shapes: a publisher stream on top of an SRT listener, a receiver-side stream for routed pull workflows, an RTMP-origin stream, and a stream row that stores audio context for later reuse.
{
"name": "Main stage publisher",
"role_name": "publisher",
"stream_id": "publisher/main-stage/srt-main",
"entity_id": "680400000000000000000001",
"module_name": "MODULE_SRT_SERVERS",
"active": true
}
{
"name": "Remote return receiver",
"role_name": "receiver",
"stream_id": "receiver/main-stage/return-feed",
"host": "198.51.100.24",
"entity_id": "680400000000000000000001",
"module_name": "MODULE_SRT_SERVERS",
"active": true
}
{
"name": "RTMP primary publish",
"role_name": "publisher",
"stream_id": "studio/live/program",
"entity_id": "680500000000000000000001",
"module_name": "MODULE_RTMP_SERVERS",
"active": true
}
If your team triggers stream actions from an operator workflow, the create, start, and stop methods below also include vMix Script tabs alongside the usual API snippets.
Use the streams module when the transport endpoint is only one part of the story and your operators need a durable row for a specific publisher or receiver flow.
Use getStreamInfo to inspect a real upstream feed, then store the useful result in audio_settings or stream_meta_data with create, update, or setStreamInfo so the team does not have to rediscover the same details later.
Use start and getStreamInfo when a player, operator, or downstream workflow needs a concrete SRT or RTMP address rather than only a saved transport object.
Creates a new stream row in Callaba Engine.
The stream object does not replace an SRT server or RTMP server. It sits on top of one of those entities and keeps the stream-facing identity stable: name, role, stream id, optional host, and any saved audio metadata the team should not have to rediscover later.
If your team triggers provisioning from an operator workflow, the example set below also includes vMix Script tabs for the same create call.
Start with the preset that matches the transport backing the stream. Publisher and receiver rows on top of SRT listeners behave differently in practice, and RTMP-backed rows normally carry a different stream id convention again.
Use this when one managed SRT listener serves multiple named publisher flows and you want those flows to stay visible as first-class rows that operators can recognize quickly.
Use this when routed or pulled traffic should keep a stable receiver-facing identity instead of only being implied by transport state.
Use this when channel naming, layout, or per-track meaning should live with the stream object instead of being rediscovered every time.
Use this when one SRT listener hosts a named publisher stream that operators should treat as a first-class object.
curl --request POST \--url http://localhost/api/streams/create \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"name": "Main stage publisher","role_name": "publisher","stream_id": "publisher/main-stage/srt-main","entity_id": "680400000000000000000001","module_name": "MODULE_SRT_SERVERS","active": true}'
Use this when a receiver-side or returned feed should keep its own stream identity and optional host binding.
curl --request POST \--url http://localhost/api/streams/create \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"name": "Remote return receiver","role_name": "receiver","stream_id": "receiver/main-stage/return-feed","host": "198.51.100.24","entity_id": "680400000000000000000001","module_name": "MODULE_SRT_SERVERS","active": true}'
Use this when the backing transport entity is an RTMP server rather than an SRT listener.
curl --request POST \--url http://localhost/api/streams/create \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"name": "RTMP primary publish","role_name": "publisher","stream_id": "studio/live/program","entity_id": "680500000000000000000001","module_name": "MODULE_RTMP_SERVERS","active": true}'
Use this when channel layout and naming should be stored with the stream row after inspection.
curl --request POST \--url http://localhost/api/streams/create \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"name": "Commentary audio stream","role_name": "publisher","stream_id": "publisher/commentary/audio-main","entity_id": "680400000000000000000001","module_name": "MODULE_SRT_SERVERS","audio_settings": {"streams": [{"id": 0,"name": "Commentary","channel_layout": "mono","channels": [{"id": "FC","name": "Commentary"}]}]},"active": true}'
Dashboard label: Name.
Human-facing name of the saved stream row.
Dashboard label: Role.
Typical product values include publisher, receiver, pusher, and puller.
Stable stream identifier stored above the backing transport entity.
Optional host binding used when the stream identity should stay tied to a concrete remote peer.
Identifier of the backing transport-side entity, for example an SRT server or RTMP server.
Module family behind the stream row. In practice this is most often MODULE_SRT_SERVERS or MODULE_RTMP_SERVERS.
Optional saved audio layout with named tracks and channels.
Dashboard label: Enable once created.
Controls whether the stream row should be active right after provisioning.
curl --request POST \--url http://localhost/api/streams/create \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"name": "Main stage publisher","role_name": "publisher","stream_id": "publisher/main-stage/srt-main","entity_id": "680400000000000000000001","module_name": "MODULE_SRT_SERVERS","active": true}'
Identifiers and the saved stream identity fields.
Reference back to the transport object that owns or serves the stream.
Saved inspection output, codec notes, and optional channel mapping metadata.
Runtime flag and backend-managed timestamps.
Successful stream model responses expose success: true as a virtual field.
{"_id": "680600000000000000000001","id": "680600000000000000000001","name": "Main stage publisher","role_name": "publisher","host": "","stream_id": "publisher/main-stage/srt-main","entity_id": "680400000000000000000001","entityModel": "ServerModel","module_name": "MODULE_SRT_SERVERS","stream_meta_data": {"codec_name": "h264","fps": "30/1"},"audio_settings": {"streams": [{"id": 0,"name": "Track-0","channel_layout": "stereo","channels": [{"id": "FL","name": "Left"},{"id": "FR","name": "Right"}]}]},"created": "2026-03-24T08:45:00.000Z","modified": "2026-03-24T08:45:00.000Z","active": true,"success": true}
Returns the number of stream rows that match the current filter.
This is the count companion to getAll and is most useful when the team wants quick inventory numbers for stream rows without pulling the full list first.
curl --request POST \--url http://localhost/api/streams/getCount \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{}'
Total number of stream rows visible to the authenticated user.
{"count": 0}
Returns the stream rows visible to the authenticated account.
Use this when the team needs one view of the active stream identities across SRT and RTMP-backed workflows, especially when publisher and receiver roles should stay easy to scan during operations.
Optional page size for the listing query.
Optional offset for paginated listing.
Optional sort descriptor. The dashboard store defaults to { created: 1 }.
Optional filter object used for search and role/module filtering.
curl --request POST \--url http://localhost/api/streams/getAll \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"sort": {"created": 1},"filter": {},"limit": 20,"skip": 0}'
The backend returns a bare array of stream rows, not a wrapped object.
[{"_id": "680600000000000000000001","id": "680600000000000000000001","name": "Main stage publisher","role_name": "publisher","host": "","stream_id": "publisher/main-stage/srt-main","entity_id": "680400000000000000000001","entityModel": "ServerModel","module_name": "MODULE_SRT_SERVERS","stream_meta_data": {"codec_name": "h264","fps": "30/1"},"audio_settings": {"streams": [{"id": 0,"name": "Track-0","channel_layout": "stereo","channels": [{"id": "FL","name": "Left"},{"id": "FR","name": "Right"}]}]},"created": "2026-03-24T08:45:00.000Z","modified": "2026-03-24T08:45:00.000Z","active": true,"success": true}]
Loads one saved stream row by id.
Use this before editing when you need the current stream identity, associated transport entity, or stored audio settings exactly as they are persisted.
Identifier of the stream row you want to load.
curl --request POST \--url http://localhost/api/streams/getById \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"id": "680600000000000000000001"}'
The backend returns the saved stream row with its transport link and any stored metadata.
{"_id": "680600000000000000000001","id": "680600000000000000000001","name": "Main stage publisher","role_name": "publisher","host": "","stream_id": "publisher/main-stage/srt-main","entity_id": "680400000000000000000001","entityModel": "ServerModel","module_name": "MODULE_SRT_SERVERS","stream_meta_data": {"codec_name": "h264","fps": "30/1"},"audio_settings": {"streams": [{"id": 0,"name": "Track-0","channel_layout": "stereo","channels": [{"id": "FL","name": "Left"},{"id": "FR","name": "Right"}]}]},"created": "2026-03-24T08:45:00.000Z","modified": "2026-03-24T08:45:00.000Z","active": true,"success": true}
Updates a saved stream row.
In practice this is where teams rename a stream, adjust its role-facing metadata, attach or revise saved audio settings, or correct the stream id and host pairing after live inspection.
Identifier of the stream row to update.
Updated stream identity fields.
Optional replacement audio layout or saved channel naming data.
Current runtime-enabled flag after the update.
curl --request POST \--url http://localhost/api/streams/update \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"id": "680600000000000000000001","name": "Main stage publisher","role_name": "publisher","stream_id": "publisher/main-stage/srt-main","entity_id": "680400000000000000000001","module_name": "MODULE_SRT_SERVERS","audio_settings": {"streams": [{"id": 0,"name": "Program","channel_layout": "stereo","channels": [{"id": "FL","name": "Left"},{"id": "FR","name": "Right"}]}]},"active": true}'
The backend returns the updated stream row.
{"_id": "680600000000000000000001","id": "680600000000000000000001","name": "Main stage publisher","role_name": "publisher","host": "","stream_id": "publisher/main-stage/srt-main","entity_id": "680400000000000000000001","entityModel": "ServerModel","module_name": "MODULE_SRT_SERVERS","stream_meta_data": {"codec_name": "h264","fps": "30/1"},"audio_settings": {"streams": [{"id": 0,"name": "Track-0","channel_layout": "stereo","channels": [{"id": "FL","name": "Left"},{"id": "FR","name": "Right"}]}]},"created": "2026-03-24T08:45:00.000Z","modified": "2026-03-24T08:45:00.000Z","active": true,"success": true}
Stores stream information for a concrete live flow identified by stream_id, role, and port context.
Use it when the team already knows which live flow is the right one and wants its discovered details saved without manually re-entering everything through a broader edit flow.
Short stream identifier, usually the tail of the full stream id.
Full stream identifier in the product-specific role path format.
Runtime role for this stream info write, for example publisher or receiver.
Transport context used to resolve where the stream info belongs.
curl --request POST \--url http://localhost/api/streams/setStreamInfo \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"short_stream_id": "srt-main","stream_id": "publisher/main-stage/srt-main","role": "publisher","port": 1935,"receiver_port": 1936}'
The backend confirms that the stream info write finished successfully.
{"success": true}
Removes a saved stream row.
Use this when the stream identity should disappear from the operator layer and no longer be shown as an active managed stream object.
Identifier of the stream row to delete.
curl --request DELETE \--url http://localhost/api/streams/remove \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"id": "680600000000000000000001"}'
The backend confirms that the stream row was removed.
{"success": true}
Starts the underlying stream runtime for the selected stream row.
This is the operational companion to stream provisioning. It matters when a saved stream identity should immediately become an active runtime flow that another team, player, or downstream step can rely on.
If this action is triggered from an operator workflow, the example set below includes a vMix Script tab as well.
Identifier of the stream row to start.
curl --request POST \--url http://localhost/api/streams/start \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"id": "680600000000000000000001"}'
The backend returns the stream row after the start action is accepted.
{"_id": "680600000000000000000001","id": "680600000000000000000001","name": "Main stage publisher","role_name": "publisher","host": "","stream_id": "publisher/main-stage/srt-main","entity_id": "680400000000000000000001","entityModel": "ServerModel","module_name": "MODULE_SRT_SERVERS","stream_meta_data": {"codec_name": "h264","fps": "30/1"},"audio_settings": {"streams": [{"id": 0,"name": "Track-0","channel_layout": "stereo","channels": [{"id": "FL","name": "Left"},{"id": "FR","name": "Right"}]}]},"created": "2026-03-24T08:45:00.000Z","modified": "2026-03-24T08:45:00.000Z","active": true,"success": true}
Stops the runtime for the selected stream row.
Use this to take the stream offline without deleting the saved metadata and identity around it.
If this action is triggered from an operator workflow, the example set below includes a vMix Script tab as well.
Identifier of the stream row to stop.
curl --request POST \--url http://localhost/api/streams/stop \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"id": "680600000000000000000001"}'
The backend returns the stream row after the stop action is accepted.
{"_id": "680600000000000000000001","id": "680600000000000000000001","name": "Main stage publisher","role_name": "publisher","host": "","stream_id": "publisher/main-stage/srt-main","entity_id": "680400000000000000000001","entityModel": "ServerModel","module_name": "MODULE_SRT_SERVERS","stream_meta_data": {"codec_name": "h264","fps": "30/1"},"audio_settings": {"streams": [{"id": 0,"name": "Track-0","channel_layout": "stereo","channels": [{"id": "FL","name": "Left"},{"id": "FR","name": "Right"}]}]},"created": "2026-03-24T08:45:00.000Z","modified": "2026-03-24T08:45:00.000Z","active": true,"success": true}
Runs a stream inspection against a live URL and returns codec, audio, and timing details for the real upstream feed.
Use it when the team needs facts from the live signal before deciding what should be saved into the stream row or passed on to another workflow.
Live input URL that should be inspected with FFprobe.
curl --request POST \--url http://localhost/api/streams/getStreamInfo \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"stream_url": "srt://127.0.0.1:1936?streamid=publisher/main-stage/srt-main"}'
FFprobe-style stream descriptors for video, audio, or data tracks discovered on the live input.
Codec identity for each discovered track.
Representative video properties when the input includes a video track.
Representative audio properties when the input includes audio tracks.
Top-level FFprobe format object for the inspected URL.
{"streams": [{"index": 0,"codec_name": "h264","codec_type": "video","width": 1920,"height": 1080,"avg_frame_rate": "30/1","pix_fmt": "yuv420p"},{"index": 1,"codec_name": "aac","codec_type": "audio","sample_rate": "48000","channels": 2,"channel_layout": "stereo"}],"format": {"filename": "srt://127.0.0.1:1936","nb_streams": 2,"format_name": "mpegts","start_time": "0.000000","probe_score": 100}}