media server logo
Toggle documentation navigation
Callaba home

SRT servers

Use SRT servers to give remote encoders or partner systems secure, low-latency contribution through managed SRT ingest endpoints. Control publisher and receiver access, monitor transport health, and switch between primary and backup sources.

What it doesReceive a reliable SRT contribution feed

Choose this whenYou need managed SRT ingest with access rules, transport telemetry, and primary/backup failover.

Use another module whenUse SRT Routes for unchanged forwarding; use Restreams for transcoding, overlays, or another output protocol.

1SRT source2Monitor and recover3Route or record
POST /api/srt-servers/create
12 endpoints

Before you start

All management methods require a valid x-access-token. Reserve reachable SRT ports, coordinate latency and passphrase settings with the sender, and define publisher and receiver access before sharing connection details.

What you can do

  • create and update configure ports, latency, bandwidth, receive buffer, passphrase, access, callbacks, and routing hosts.
  • getAll, getCount, and getById inspect servers.
  • start and stop control the listener.
  • getActiveStreams reports current stream identities and available connection details.
  • getEventLogBySRTPort returns connection events for a server port.
  • getStatisticHistory returns the available recent transport history for a server port.
  • switchTo selects a configured route for supported PULL failover workflows.
  • remove deletes the server.

Example workflow

  1. Create a listener with the required port, latency, passphrase, and access rules.
  2. Add primary and backup routing hosts when failover is required.
  3. Start the server and connect the publisher.
  4. Watch bitrate, estimated bandwidth, round-trip time, active streams, and connection events.
  5. Allow automatic failover, or use switchTo for a manual change to an exact configured URL on a supported PULL server.

Common use cases

  • Receive encrypted contribution from a remote camera or venue encoder.
  • Operate primary and backup SRT feeds with automatic and manual switching.
  • Control publisher and receiver access for partners or guest connections.
  • Monitor contribution health and connection origin during a live event.

Limits and troubleshooting

The sender and listener must agree on mode, port, latency, stream identity, and passphrase. switchTo applies only to a supported PULL server and an exact SRT URL already configured in its routing hosts. Live statistics are operational signals; export them when longer retention is required.

Next steps

Verify the live feed, then connect the server to SRT routes, Restreams, Recordings, Multiview, or Web players.

REST solution recipe

Build an SRT server gateway for contribution

Create a secure SRT ingest boundary for a remote production feed, start it, and confirm source state and recent transport history before routing the signal downstream.

  1. Create the SRT gatewaySet ports, latency, passphrase, publisher and receiver access, and routing.POST /api/srt-servers/create
  2. Start contribution ingestStart the listener before sharing connection details with the source.POST /api/srt-servers/start
  3. Check transport historyReview the available per-stream samples for the selected SRT port.GET /api/srt-servers/:serverPort/getStatisticHistory

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

See the SRT Server product
REST solution recipe

Switch a primary/backup SRT contribution source by REST API

Configure approved contribution sources on one PULL server, monitor source state and transport history, then switch the active route manually or from your own control policy.

  1. Configure the source setCreate a PULL server with the primary and backup URLs in routing_hosts.POST /api/srt-servers/create
  2. Check current activityRead the active stream identities before making a routing decision.POST /api/srt-servers/getActiveStreams
  3. Inspect connection eventsUse connect and close events for the selected listen port as one health signal.POST /api/srt-servers/getEventLogBySRTPort
  4. Review recent transport historyCompare the available per-stream history with your own failover thresholds.GET /api/srt-servers/:serverPort/getStatisticHistory
  5. Switch to the approved backupSend the server id and the exact configured backup srt_url, then repeat the activity and event checks.POST /api/srt-servers/switchTo

This is route failover between configured sources, not packet-level hitless path redundancy. The server must use PULL routing and the exact SRT URL must already exist in routing_hosts.

See the live video failover product
POST
/api/srt-servers/create
API token required

Create an SRT listener with its ports, latency, buffering, encryption, routing, monitoring, and access-control settings. Send the dashboard-issued JWT in the x-access-token header.

Choose routing_type for a standalone, push, or pull listener. Do not send a separate server_fc field; Callaba calculates flow control from server_rcvbuf.

Units are significant: server_latency is milliseconds, server_timeout is seconds, server_maxbw is bytes per second, and server_rcvbuf is bytes.

Request examples

Choose a preset for no routing, public-IP routing, Callaba routing, or security and monitoring. A vMix Script example is available for operator-driven provisioning.

Common use cases

  • Provide OBS, a field encoder, or a partner feed with a stable contribution endpoint.
  • Configure push or pull routing for a backup source or a managed handoff.
  • Apply a passphrase, access rules, and event/statistics callbacks to an ingest boundary that operations must monitor.
No routing

These examples keep routing disabled and rely on the server itself as the stable ingest boundary.

Standalone SRT server

Use this shape when the server should act as a plain local SRT ingest endpoint without any routing layer. It is the simplest contract and the closest to the basic dashboard form.

Standalone SRT server
Copy code
curl --request POST \
--url http://localhost/api/srt-servers/create \
--header 'x-access-token: <your_api_token>' \
--header 'Content-Type: application/json' \
--data '{
"server_name": "Awesome SRT server",
"server_type": "SERVER_TYPE_SRT",
"server_port": 1935,
"server_receiver_port": 1936,
"server_latency": 200,
"server_maxbw": -1,
"server_timeout": 60,
"server_rcvbuf": 48234496,
"server_active": true,
"routing": "DISABLED",
"routing_hosts": []
}'
PUBLIC_IP routing

The PUBLIC_IP mode is for direct routing to public network addresses. Use PUSH when this server should actively send toward the remote endpoint. Use PULL when the remote side should be treated as the upstream that this server reaches out to.

PUBLIC_IP routing with PUSH

Use this shape when the server should actively push toward a public-IP routing target. Each routing host needs a host and port, while routing_server_name stays optional in this mode.

PUBLIC_IP routing with PUSH
Copy code
curl --request POST \
--url http://localhost/api/srt-servers/create \
--header 'x-access-token: <your_api_token>' \
--header 'Content-Type: application/json' \
--data '{
"server_name": "Awesome SRT server",
"server_type": "SERVER_TYPE_SRT",
"server_port": 1935,
"server_receiver_port": 1936,
"server_latency": 200,
"server_maxbw": -1,
"server_timeout": 60,
"server_rcvbuf": 48234496,
"server_active": true,
"routing": "PUBLIC_IP",
"routing_type": "PUSH",
"routing_hosts": [
{
"routing_host": "203.0.113.50",
"routing_port": 1935
}
]
}'
PUBLIC_IP routing with PULL

Use this shape when the routed side should be pulled instead of pushed. In practice this is the public-IP sibling of the push example, but with a pull lifecycle.

PUBLIC_IP routing with PULL
Copy code
curl --request POST \
--url http://localhost/api/srt-servers/create \
--header 'x-access-token: <your_api_token>' \
--header 'Content-Type: application/json' \
--data '{
"server_name": "Awesome SRT server",
"server_type": "SERVER_TYPE_SRT",
"server_port": 1935,
"server_receiver_port": 1936,
"server_latency": 200,
"server_maxbw": -1,
"server_timeout": 60,
"server_rcvbuf": 48234496,
"server_active": true,
"routing": "PUBLIC_IP",
"routing_type": "PULL",
"routing_hosts": [
{
"routing_host": "198.51.100.22",
"routing_port": 1935,
"routing_server_name": "primary-edge-srt"
},
{
"routing_host": "203.0.113.50",
"routing_port": 1935,
"routing_server_name": "backup-edge-srt"
}
]
}'
CALLABA routing

The CALLABA routing mode uses named routing hosts and is the stricter variant: host, port, and server name are all required. Use PUSH when this server should send into the Callaba-side route, and PULL when the Callaba-side route should behave as the upstream relationship you attach to.

CALLABA routing with PUSH

Use this shape when the server should route toward the Callaba cloud path in push mode. In this routing mode each host item must also carry routing_server_name.

CALLABA routing with PUSH
Copy code
curl --request POST \
--url http://localhost/api/srt-servers/create \
--header 'x-access-token: <your_api_token>' \
--header 'Content-Type: application/json' \
--data '{
"server_name": "Awesome SRT server",
"server_type": "SERVER_TYPE_SRT",
"server_port": 1935,
"server_receiver_port": 1936,
"server_latency": 200,
"server_maxbw": -1,
"server_timeout": 60,
"server_rcvbuf": 48234496,
"server_active": true,
"routing": "CALLABA",
"routing_type": "PUSH",
"routing_hosts": [
{
"routing_host": "ingest.callaba.cloud",
"routing_port": 1935,
"routing_server_name": "callaba-route-primary"
}
]
}'
CALLABA routing with PULL

Use this shape when the routed Callaba side should be pulled instead of pushed. It keeps the same named routing host contract while switching the routing type.

CALLABA routing with PULL
Copy code
curl --request POST \
--url http://localhost/api/srt-servers/create \
--header 'x-access-token: <your_api_token>' \
--header 'Content-Type: application/json' \
--data '{
"server_name": "Awesome SRT server",
"server_type": "SERVER_TYPE_SRT",
"server_port": 1935,
"server_receiver_port": 1936,
"server_latency": 200,
"server_maxbw": -1,
"server_timeout": 60,
"server_rcvbuf": 48234496,
"server_active": true,
"routing": "CALLABA",
"routing_type": "PULL",
"routing_hosts": [
{
"routing_host": "ingest.callaba.cloud",
"routing_port": 1935,
"routing_server_name": "callaba-route-backup"
}
]
}'
Security and monitoring

These examples keep the basic ingest shape but turn on one advanced capability at a time so it is easier to copy the exact fields you need.

Passphrase-protected SRT server

Use this shape when the ingest endpoint should require SRT encryption. The example uses a 16-character passphrase, which matches the product guidance for AES-128 sized protection.

Best fit: shared ingest points, partner contribution, or any case where the listener should not accept cleartext SRT sessions by default.

Passphrase-protected SRT server
Copy code
curl --request POST \
--url http://localhost/api/srt-servers/create \
--header 'x-access-token: <your_api_token>' \
--header 'Content-Type: application/json' \
--data '{
"server_name": "Awesome SRT server",
"server_type": "SERVER_TYPE_SRT",
"server_port": 1935,
"server_receiver_port": 1936,
"server_latency": 200,
"server_maxbw": -1,
"server_timeout": 60,
"server_rcvbuf": 48234496,
"server_active": true,
"routing": "DISABLED",
"routing_hosts": [],
"passphrase": "0123456789abcdef"
}'
SRT server with statistics callback

Use this shape when the server should post SRT statistics to an external monitoring endpoint. The backend validates the callback URL and interval together.

Best fit: managed events, support workflows, and long-running ingest points where you want external telemetry without polling the full server object.

SRT server with statistics callback
Copy code
curl --request POST \
--url http://localhost/api/srt-servers/create \
--header 'x-access-token: <your_api_token>' \
--header 'Content-Type: application/json' \
--data '{
"server_name": "Awesome SRT server",
"server_type": "SERVER_TYPE_SRT",
"server_port": 1935,
"server_receiver_port": 1936,
"server_latency": 200,
"server_maxbw": -1,
"server_timeout": 60,
"server_rcvbuf": 48234496,
"server_active": true,
"routing": "DISABLED",
"routing_hosts": [],
"stats_host": "https://monitoring.example.com/api/srt-stats",
"stats_interval": 2
}'
SRT server with IP-based access control

Use this shape when only specific publisher or receiver hosts should be allowed. Each entry requires host and role_name when stream_control_type is CONTROL_ACCESS_IP_ADDRESS.

Best fit: controlled ingest from known sites or fixed peer addresses. If peers change often, this mode is stricter to operate than a simple open listener.

SRT server with IP-based access control
Copy code
curl --request POST \
--url http://localhost/api/srt-servers/create \
--header 'x-access-token: <your_api_token>' \
--header 'Content-Type: application/json' \
--data '{
"server_name": "Awesome SRT server",
"server_type": "SERVER_TYPE_SRT",
"server_port": 1935,
"server_receiver_port": 1936,
"server_latency": 200,
"server_maxbw": -1,
"server_timeout": 60,
"server_rcvbuf": 48234496,
"server_active": true,
"routing": "DISABLED",
"routing_hosts": [],
"stream_control_type": "CONTROL_ACCESS_IP_ADDRESS",
"access_settings": [
{
"host": "203.0.113.44",
"role_name": "publisher"
},
{
"host": "203.0.113.45",
"role_name": "receiver"
}
]
}'
Request body parameters
Basic settings
server_name
string
Copy direct link

Dashboard label: Name.

Set such a name for the created item to avoid confusion in the future. The validation layer accepts from 1 to 60 characters.

server_type
string
Copy direct link

Current validated API contract accepts SERVER_TYPE_SRT.

The model still defines SERVER_TYPE_WEBRTC, but the live create/update validation currently allows only the SRT server type.

server_active
boolean
Copy direct link

Dashboard label: Enable once created.

Enabled is a server state. Disconnecting the server turns off connections and data transfers for all publishers and recipients connected to this SRT server.

Ports and latency
server_port
integer
Copy direct link

Dashboard label: Port.

Port used for listening to the SRT server. The live validation accepts values from 1024 to 65535.

server_receiver_port
integer
Copy direct link

Dashboard label: Receiver port.

Port used for receiving SRT streams. The current validated API also expects a value from 1024 to 65535.

The runtime has a fallback path when this port is missing, but the public create/update contract still requires it explicitly.

server_latency
integer
Copy direct link

Dashboard label: Latency.

Latency is configured in milliseconds. The product guidance recommends using roughly ping × 4, with an absolute practical floor of about 120 ms for stable SRT contribution.

For practical setup guidance, see Find the perfect latency for your SRT setup.

server_maxbw
integer
Copy direct link

Dashboard label: Max network bandwidth.

Network bandwidth or bitrate in Byte/s. Use -1 for unlimited. The validation layer currently accepts values up to 3125000000.

server_timeout
integer
Copy direct link

Dashboard label: Stream inactivity timeout.

Configured in seconds. When the timeout is reached, the server disconnects the client. -1 means unlimited timeout.

server_rcvbuf
integer
Copy direct link

Dashboard label: Receiver buffer size.

This field is expressed in bytes. The REST API accepts 12058624 to 200000000.

The dashboard starts at 12058624 and recommends 48234496 for production. Flow control is derived from this receive buffer, so you do not send a separate server_fc field.

Security and identity
passphrase
string
Copy direct link

Dashboard label: Passphrase.

Optional SRT encryption secret for the ingest endpoint. The dashboard guidance recommends a length of 16, 24, or 32 characters for AES-128, AES-192, and AES-256 sized passphrases.

Routing and backup
routing
string
Copy direct link

Dashboard section: Routing settings.

Controls whether the SRT server runs as a local standalone ingress or as a routed endpoint. The validated values are DISABLED, PUBLIC_IP, and CALLABA.

This choice affects which runtime config template is selected: standalone, push, or pull routing mode.

routing_type
string
Copy direct link

Routing strategy used when routing is enabled. The server model defines PUSH and PULL.

routing_hosts
array
Copy direct link

List of routing targets.

For CALLABA routing, each item must contain routing_host, routing_port, and routing_server_name. For PUBLIC_IP, the host and port are required while the server name stays optional.

The product also links this mode to backup-stream workflows. See how to set up an SRT backup stream in case of a main stream interruption.

Statistics callbacks
stats_host
string
Copy direct link

Optional callback URL for SRT statistics delivery. When set, the value must be a valid http or https URI.

stats_interval
integer
Copy direct link

Statistics posting interval in seconds.

Create/update validation accepts values from 1 to 10. If statistics are enabled and no interval is provided, the service falls back to 1 second.

Access control
stream_control_type
string
Copy direct link

Control mode for per-stream access validation. When the value is set to IP-address based access control, the backend validates the related access_settings entries as host and role objects.

access_settings
array
Copy direct link

Optional list of access rules or stream identities created together with the server.

In responses, these appear as related access records rather than as the original request payload.

Create SRT server
Copy code
curl --request POST \
--url http://localhost/api/srt-servers/create \
--header 'x-access-token: <your_api_token>' \
--header 'Content-Type: application/json' \
--data '{
"server_name": "Awesome SRT server",
"server_type": "SERVER_TYPE_SRT",
"server_port": 1935,
"server_receiver_port": 1936,
"server_latency": 200,
"server_maxbw": -1,
"server_timeout": 60,
"server_rcvbuf": 48234496,
"server_active": true
}'
Response
Identity and ports
_id
string
Copy direct link

Resource id returned when you create or list the SRT server.

id
string
Copy direct link

Convenience alias for the server identifier. In the live response, id matches _id.

server_name
string
Copy direct link

Name stored for the created SRT server.

server_name_code
string
Copy direct link

Slug-style code generated from server_name. The backend derives it with friendly URL normalization.

server_type
string
Copy direct link

Type of the created server, for example SERVER_TYPE_SRT.

server_port
string
Copy direct link

Listening port returned by the product for the created SRT server.

server_receiver_port
string
Copy direct link

Receiver port returned by the product for the created SRT server.

server_port_id
string
Copy direct link

Assigned UDP port document for the publisher side of the server.

server_receiver_port_id
string
Copy direct link

Assigned UDP port document for the receiver side of the server.

Runtime profile
server_latency
integer
Copy direct link

Configured latency value in milliseconds.

server_maxbw
integer
Copy direct link

Configured maximum bandwidth in Byte/s.

server_timeout
string
Copy direct link

Configured inactivity timeout in seconds. The live document currently serializes it as a string.

server_rcvbuf
integer
Copy direct link

Receive buffer size in bytes. Flow control is derived from this value.

server_active
boolean
Copy direct link

Whether the created server is enabled immediately after creation.

Security, routing, and monitoring
passphrase
string
Copy direct link

Stored encryption field for the server. If passphrase protection is enabled, the backend stores an encoded value rather than a plaintext secret.

server_publisher
string
Copy direct link

Publisher-side stream-id or URL prefix stored with the server.

server_player
string
Copy direct link

Receiver-side stream-id or URL prefix stored with the server.

routing_hosts
array
Copy direct link

Routing targets saved with the server. In the minimal default create flow this is an empty array.

stats_interval
integer
Copy direct link

Resolved statistics interval. The live create flow defaults to 1.

Access and metadata
access
array
Copy direct link

Related access stream records for this SRT server. getById populates these more deeply than create/update.

server_user_id
string
Copy direct link

Owner user identifier attached by the backend.

server_created
string
Copy direct link

Creation timestamp returned by the live product.

server_modified
string
Copy direct link

Last modification timestamp returned by the live product.

__v
integer
Copy direct link

Document version field returned by the model serialization.

success
boolean
Copy direct link

The live product returns a boolean success flag together with the created SRT server object. On successful creation it is true.

Response: Create SRT server
JSON
Copy code
{
"_id": "69c1d2af28c95839e0dfea90",
"__v": 0,
"access": [],
"id": "69c1d2af28c95839e0dfea90",
"passphrase": "",
"routing_hosts": [],
"server_active": true,
"server_created": "2026-03-23T23:54:23.979Z",
"server_latency": 200,
"server_maxbw": -1,
"server_modified": "2026-03-23T23:54:23.983Z",
"server_name": "Awesome SRT server",
"server_name_code": "awesome-srt-server",
"server_player": "receiver",
"server_port": "1935",
"server_port_id": "69c1d2af28c95839e0dfeaa0",
"server_publisher": "publisher",
"server_rcvbuf": 48234496,
"server_receiver_port": "1936",
"server_receiver_port_id": "69c1d2af28c95839e0dfeaa1",
"server_timeout": "60",
"server_type": "SERVER_TYPE_SRT",
"server_user_id": "69360341db559495f643de6a",
"stats_interval": 1,
"success": true
}
POST
/api/srt-servers/getCount
API token required
POST
/api/srt-servers/getAll
API token required
POST
/api/srt-servers/getById
API token required
POST
/api/srt-servers/start
API token required
POST
/api/srt-servers/stop
API token required
POST
/api/srt-servers/switchTo
API token required
POST
/api/srt-servers/getActiveStreams
API token required
POST
/api/srt-servers/getEventLogBySRTPort
API token required
GET
/api/srt-servers/:serverPort/getStatisticHistory
API token required
POST
/api/srt-servers/update
API token required
DELETE
/api/srt-servers/remove
API token required