media server logo
Toggle documentation navigation
Callaba home

Restreams

Use Restreams to simulcast or deliver a live input to streaming platforms and private endpoints. Remux when formats match, or transcode, resize, adjust audio, and add overlays when they do not.

What it doesSend one source to another destination

Choose this whenA live source must reach another platform or protocol, optionally with transcoding, resizing, audio changes, or overlays.

Use another module whenUse SRT Routes for unchanged SRT or UDP forwarding; use Web Players for viewer playback.

1Select the live input2Set an output destination3Start and monitor
POST /api/restream/create
9 endpoints

Before you start

All methods require a valid x-access-token. Create any referenced input module first and confirm that the output destination accepts the selected protocol, codec, resolution, bitrate, and credentials.

What you can do

  • create and update configure the input, output, transcoding, media modification, and overlay settings.
  • getAll, getCount, and getById inspect jobs.
  • start and stop control the live pipeline.
  • getStat reports available bitrate, cadence, and process status.
  • remove deletes a job.

Example workflow

  1. Select a managed input or a supported URL source.
  2. Set an RTMP, SRT, RIST, or other supported destination.
  3. Enable transcoding or media changes only when the output requires them.
  4. Start the job and use getStat to confirm media is moving.
  5. Stop the job before changing credentials or destination settings.

Common use cases

  • Send one SRT contribution to an RTMP distribution destination.
  • Receive or deliver a RIST feed as part of a live distribution workflow.
  • Transcode, resize, adjust audio, or add an overlay before delivery.
  • Keep the input stable while changing downstream destinations between events.

Limits and troubleshooting

A saved restream can still have an offline input or a destination that rejects the connection, so check its live status after starting it. Transcoding requires substantially more CPU or GPU capacity than remuxing. For RIST delivery, use a compatible RIST URL and MPEG-TS signal, then verify the selected RIST profile and security settings at both ends.

Next steps

Validate the destination, then add monitoring or connect browser delivery through Web players when required.

REST solution recipe

Send one live input to multiple destinations

Create one restream job per destination from the same reviewed input, start the jobs, and monitor each output independently.

  1. Create each destination jobReuse the input and provide the protocol, credentials, and URL required by each destination.POST /api/restream/create
  2. Start deliveryStart each saved job after its upstream source is healthy.POST /api/restream/start
  3. Monitor every outputCompare bitrate and process state per destination instead of treating the fan-out as one status.POST /api/restream/getStat

A successful create response confirms configuration, not media health. Start the resource, then verify its runtime statistics before sending production traffic.

REST solution recipe

Transcode a live stream for its destination

Create a restream with the required codec, bitrate, resolution, or audio conversion, then confirm the worker keeps pace in runtime statistics.

  1. Define the transcodeChoose input and output presets, then set only the required transcoding and media-change fields.POST /api/restream/create
  2. Start processingStart after validating destination codecs, resolution, bitrate, and credentials.POST /api/restream/start
  3. Check worker healthWatch bitrate, frame cadence, and process state for stalls or insufficient capacity.POST /api/restream/getStat

Enable only the processing required by the destination. Transcoding uses substantially more CPU or GPU than remuxing.

REST solution recipe

Run continuous file playout to a live destination

Register or upload the media asset, use it as an infinite file input for a restream job, and monitor the always-on output.

  1. Prepare the media fileUpload the source and keep the returned file id for the playout input.POST /api/files/uploadFile
  2. Create looping playoutUse the infinite file input and configure the live destination plus any required processing.POST /api/restream/create
  3. Monitor the channelCheck the running process and destination bitrate as part of the always-on health loop.POST /api/restream/getStat

The verified looping input type is INPUT_TYPE_FILE_VIDEO_INFINITY and input_module_id must identify an existing managed file.

POST
/api/restream/create
API token required

Create a managed media pipeline with a source, destination, optional transcoding, audio or video changes, overlays, and an initial active state. Send the dashboard-issued JWT in the x-access-token header.

For RIST URLs, use INPUT_TYPE_RIST_URL for input.input_type or OUTPUT_TYPE_RIST_URL for output.output_type. A RIST output sends MPEG-TS to output_stream_url.

Request examples

Choose the operational preset that matches the source and destination, then add only the processing fields required by that pipeline.

Common use cases

  • Republish one contribution feed to a social or CDN destination.
  • Bridge SRT, RTMP, RIST, HLS, or another supported transport.
  • Transcode, overlay, or fan out one source to destination-specific outputs.
Live republishing

Use this preset when one incoming SRT contribution should be forwarded to an RTMP destination such as a social platform or another managed RTMP target.

SRT URL to RTMP output

This is the most recognizable restream workflow: ingest on SRT, keep transcoding disabled or minimal, and push the result to an RTMP output.

SRT URL to RTMP output
Copy code
curl --request POST \
--url http://localhost/api/restream/create \
--header 'x-access-token: <your_api_token>' \
--header 'Content-Type: application/json' \
--data '{
"restream_name": "SRT to RTMP social output",
"input": {
"input_type": "INPUT_TYPE_SRT_URL",
"application": "IO_APPLICATION_FFMPEG",
"input_stream_url": "srt://127.0.0.1:1935",
"input_stream_listen_port": {},
"input_settings": {},
"input_module_id": "",
"input_stream_id": "",
"entity_name": "SRT to RTMP social output",
"module_name": "MODULE_RESTREAM"
},
"transcoding": {
"video_transcoding": "Disabled",
"output_video_bitrate": 6000,
"preset": "ultrafast",
"tune": "Disabled",
"crf": "Disabled",
"pix_fmt": "Disabled",
"encoding_rate": "",
"filter_fps": "",
"gop": "Disabled",
"force_key_frames": 2,
"frame_width": "",
"frame_height": "",
"slices": "",
"cores": "",
"xlnx_hwdev": "0",
"audio_transcoding": "Disabled",
"output_audio_bitrate": 128,
"sample_rate": 44100
},
"output": {
"output_type": "OUTPUT_TYPE_OTHER_RTMP_URL",
"application": "IO_APPLICATION_FFMPEG",
"output_stream_url": "rtmp://a.rtmp.youtube.com/live2/example-stream-key",
"output_stream_listen_port": {},
"output_settings": {},
"output_stream_key": "",
"entity_name": "SRT to RTMP social output",
"module_name": "MODULE_RESTREAM"
},
"modify_audio": {
"type": "DISABLED",
"channel": "1,2",
"track": "0"
},
"modify_video": {
"type": "DISABLED"
},
"overlay": {
"type": "DISABLED",
"position": {
"x": 1,
"y": 1
}
},
"active": true
}'
Transport bridge

Use this preset when the job should bridge one SRT source into another SRT destination while preserving the pipeline as a managed process object.

SRT URL to SRT output

This is useful when the ingest side and the delivery side should remain decoupled but still live inside one active restream job.

SRT URL to SRT output
Copy code
curl --request POST \
--url http://localhost/api/restream/create \
--header 'x-access-token: <your_api_token>' \
--header 'Content-Type: application/json' \
--data '{
"restream_name": "SRT bridge to another SRT destination",
"input": {
"input_type": "INPUT_TYPE_SRT_URL",
"application": "IO_APPLICATION_FFMPEG",
"input_stream_url": "srt://127.0.0.1:1936",
"input_stream_listen_port": {},
"input_settings": {},
"input_module_id": "",
"input_stream_id": "",
"entity_name": "SRT bridge to another SRT destination",
"module_name": "MODULE_RESTREAM"
},
"transcoding": {
"video_transcoding": "Disabled",
"output_video_bitrate": 6000,
"preset": "ultrafast",
"tune": "Disabled",
"crf": "Disabled",
"pix_fmt": "Disabled",
"encoding_rate": "",
"filter_fps": "",
"gop": "Disabled",
"force_key_frames": 2,
"frame_width": "",
"frame_height": "",
"slices": "",
"cores": "",
"xlnx_hwdev": "0",
"audio_transcoding": "Disabled",
"output_audio_bitrate": 128,
"sample_rate": 44100
},
"output": {
"output_type": "OUTPUT_TYPE_SRT_URL",
"application": "IO_APPLICATION_FFMPEG",
"output_stream_url": "srt://127.0.0.1:2035",
"output_stream_listen_port": {},
"output_settings": {},
"output_stream_key": "",
"entity_name": "SRT bridge to another SRT destination",
"module_name": "MODULE_RESTREAM"
},
"modify_audio": {
"type": "DISABLED",
"channel": "1,2",
"track": "0"
},
"modify_video": {
"type": "DISABLED"
},
"overlay": {
"type": "DISABLED",
"position": {
"x": 1,
"y": 1
}
},
"active": true
}'
Playback probe

Use this preset when you want to read from HLS as an input and run the media pipeline for monitoring, testing, or measurement without forwarding the output to another delivery target.

HLS input to null output

Use this shape for controlled playback checks and probe workflows built from a restream job.

HLS input to null output
Copy code
curl --request POST \
--url http://localhost/api/restream/create \
--header 'x-access-token: <your_api_token>' \
--header 'Content-Type: application/json' \
--data '{
"restream_name": "HLS playback probe",
"input": {
"input_type": "INPUT_TYPE_HLS_URL",
"application": "IO_APPLICATION_FFMPEG",
"input_stream_url": "https://example.com/live/index.m3u8",
"input_stream_listen_port": {},
"input_settings": {},
"input_module_id": "",
"input_stream_id": "",
"entity_name": "HLS playback probe",
"module_name": "MODULE_RESTREAM"
},
"transcoding": {
"video_transcoding": "Disabled",
"output_video_bitrate": 6000,
"preset": "ultrafast",
"tune": "Disabled",
"crf": "Disabled",
"pix_fmt": "Disabled",
"encoding_rate": "",
"filter_fps": "",
"gop": "Disabled",
"force_key_frames": 2,
"frame_width": "",
"frame_height": "",
"slices": "",
"cores": "",
"xlnx_hwdev": "0",
"audio_transcoding": "Disabled",
"output_audio_bitrate": 128,
"sample_rate": 44100
},
"output": {
"output_type": "OUTPUT_TYPE_DEV_NULL",
"application": "IO_APPLICATION_FFMPEG",
"output_stream_listen_port": {},
"output_settings": {},
"output_stream_key": "",
"entity_name": "HLS playback probe",
"module_name": "MODULE_RESTREAM"
},
"modify_audio": {
"type": "DISABLED",
"channel": "1,2",
"track": "0"
},
"modify_video": {
"type": "DISABLED"
},
"overlay": {
"type": "DISABLED",
"position": {
"x": 1,
"y": 1
}
},
"active": true
}'
Request body parameters
Identity
restream_name
string
Copy direct link

Human-readable job name. The dashboard validates this as a required field.

Pipeline
input
object
Copy direct link

Input definition built by the dashboard InputSource controls. This object determines the source transport or module connection. URL-based RIST input uses INPUT_TYPE_RIST_URL with input_stream_url.

output
object
Copy direct link

Output definition built by the dashboard OutputSource controls. This object determines where the pipeline pushes or exposes the result. URL-based RIST output uses OUTPUT_TYPE_RIST_URL with output_stream_url; the Engine emits MPEG-TS on this path.

Processing
transcoding
object
Copy direct link

Optional transcoding profile used by the FFmpeg pipeline. The dashboard always submits this block, even when transcoding is disabled.

modify_audio
object
Copy direct link

Optional audio modification settings. The dashboard sends a disabled-state object when no audio modification is requested.

modify_video
object
Copy direct link

Optional video modification settings. This can remain in a disabled state for pass-through jobs.

overlay
object
Copy direct link

Optional overlay settings. The create flow can still send an explicit disabled overlay object.

Runtime
active
boolean
Copy direct link

Controls whether the job should be active after provisioning.

Create restream
Copy code
curl --request POST \
--url http://localhost/api/restream/create \
--header 'x-access-token: <your_api_token>' \
--header 'Content-Type: application/json' \
--data '{
"restream_name": "SRT to RTMP social output",
"input": {
"input_type": "INPUT_TYPE_SRT_URL",
"application": "IO_APPLICATION_FFMPEG",
"input_stream_url": "srt://127.0.0.1:1935",
"input_stream_listen_port": {},
"input_settings": {},
"input_module_id": "",
"input_stream_id": "",
"entity_name": "SRT to RTMP social output",
"module_name": "MODULE_RESTREAM"
},
"transcoding": {
"video_transcoding": "Disabled",
"output_video_bitrate": 6000,
"preset": "ultrafast",
"tune": "Disabled",
"crf": "Disabled",
"pix_fmt": "Disabled",
"encoding_rate": "",
"filter_fps": "",
"gop": "Disabled",
"force_key_frames": 2,
"frame_width": "",
"frame_height": "",
"slices": "",
"cores": "",
"xlnx_hwdev": "0",
"audio_transcoding": "Disabled",
"output_audio_bitrate": 128,
"sample_rate": 44100
},
"output": {
"output_type": "OUTPUT_TYPE_OTHER_RTMP_URL",
"application": "IO_APPLICATION_FFMPEG",
"output_stream_url": "rtmp://a.rtmp.youtube.com/live2/example-stream-key",
"output_stream_listen_port": {},
"output_settings": {},
"output_stream_key": "",
"entity_name": "SRT to RTMP social output",
"module_name": "MODULE_RESTREAM"
},
"modify_audio": {
"type": "DISABLED",
"channel": "1,2",
"track": "0"
},
"modify_video": {
"type": "DISABLED"
},
"overlay": {
"type": "DISABLED",
"position": {
"x": 1,
"y": 1
}
},
"active": true
}'
Response
Identity
_id
string
Copy direct link

Resource id returned when you create or list the restream job.

id
string
Copy direct link

Convenience alias for _id.

restream_name
string
Copy direct link

Name stored for the restream job.

Pipeline
input[]
array
Copy direct link

Populated linked input object or objects for the pipeline.

output[]
array
Copy direct link

Populated linked output object or objects for the pipeline.

Processing
transcoding / modify_audio / modify_video / overlay
object
Copy direct link

Processing settings stored on the job object.

Runtime
active
boolean
Copy direct link

Current enabled state of the restream job.

created / modified
string
Copy direct link

Timestamps managed by the backend.

Operation result
success
boolean
Copy direct link

The model exposes success: true as a virtual field in successful responses.

Response: Create restream
JSON
Copy code
{
"_id": "65ff4d2997300f9385d32a90",
"id": "65ff4d2997300f9385d32a90",
"restream_name": "SRT to RTMP social output",
"input": [
{
"_id": "65ff4d2997300f9385d32a91",
"id": "65ff4d2997300f9385d32a91",
"input_type": "INPUT_TYPE_SRT_URL",
"application": "IO_APPLICATION_FFMPEG",
"input_stream_url": "srt://127.0.0.1:1935",
"input_settings": {},
"module_name": "MODULE_RESTREAM"
}
],
"output": [
{
"_id": "65ff4d2997300f9385d32a92",
"id": "65ff4d2997300f9385d32a92",
"output_type": "OUTPUT_TYPE_OTHER_RTMP_URL",
"application": "IO_APPLICATION_FFMPEG",
"output_stream_url": "rtmp://a.rtmp.youtube.com/live2/example-stream-key",
"output_settings": {},
"module_name": "MODULE_RESTREAM"
}
],
"transcoding": {
"video_transcoding": "Disabled",
"audio_transcoding": "Disabled",
"output_video_bitrate": 6000,
"output_audio_bitrate": 128,
"sample_rate": 44100
},
"modify_audio": {
"type": "DISABLED",
"channel": "1,2",
"track": "0"
},
"modify_video": {
"type": "DISABLED"
},
"overlay": {
"type": "DISABLED",
"position": {
"x": 1,
"y": 1
}
},
"active": true,
"module_name": "MODULE_RESTREAM",
"created": "2026-03-24T11:30:12.000Z",
"modified": "2026-03-24T11:30:12.000Z",
"success": true
}
POST
/api/restream/getCount
API token required
POST
/api/restream/getAll
API token required
POST
/api/restream/getById
API token required
POST
/api/restream/update
API token required
POST
/api/restream/start
API token required
POST
/api/restream/stop
API token required
DELETE
/api/restream/remove
API token required
POST
/api/restream/getStat
API token required