curl --request POST \
--url https://api.orbit.devotel.io/api/v1/video/room-templates \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"config": {
"max_participants": 151,
"max_duration_minutes": 722,
"recording_enabled": true,
"recording_output": {
"width": 2000,
"height": 1140,
"framerate": 30,
"video_bitrate_kbps": 10050
},
"simulcast": true,
"spatial_layers": 2,
"max_bitrate_kbps": 4050,
"e2ee": true,
"audio_only": true,
"captions_required": true,
"waiting_room": true,
"waiting_room_auto_promote": true
},
"description": "<string>"
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/video/room-templates"
payload = {
"name": "<string>",
"config": {
"max_participants": 151,
"max_duration_minutes": 722,
"recording_enabled": True,
"recording_output": {
"width": 2000,
"height": 1140,
"framerate": 30,
"video_bitrate_kbps": 10050
},
"simulcast": True,
"spatial_layers": 2,
"max_bitrate_kbps": 4050,
"e2ee": True,
"audio_only": True,
"captions_required": True,
"waiting_room": True,
"waiting_room_auto_promote": True
},
"description": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
config: {
max_participants: 151,
max_duration_minutes: 722,
recording_enabled: true,
recording_output: {width: 2000, height: 1140, framerate: 30, video_bitrate_kbps: 10050},
simulcast: true,
spatial_layers: 2,
max_bitrate_kbps: 4050,
e2ee: true,
audio_only: true,
captions_required: true,
waiting_room: true,
waiting_room_auto_promote: true
},
description: '<string>'
})
};
fetch('https://api.orbit.devotel.io/api/v1/video/room-templates', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.orbit.devotel.io/api/v1/video/room-templates",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'config' => [
'max_participants' => 151,
'max_duration_minutes' => 722,
'recording_enabled' => true,
'recording_output' => [
'width' => 2000,
'height' => 1140,
'framerate' => 30,
'video_bitrate_kbps' => 10050
],
'simulcast' => true,
'spatial_layers' => 2,
'max_bitrate_kbps' => 4050,
'e2ee' => true,
'audio_only' => true,
'captions_required' => true,
'waiting_room' => true,
'waiting_room_auto_promote' => true
],
'description' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.orbit.devotel.io/api/v1/video/room-templates"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"config\": {\n \"max_participants\": 151,\n \"max_duration_minutes\": 722,\n \"recording_enabled\": true,\n \"recording_output\": {\n \"width\": 2000,\n \"height\": 1140,\n \"framerate\": 30,\n \"video_bitrate_kbps\": 10050\n },\n \"simulcast\": true,\n \"spatial_layers\": 2,\n \"max_bitrate_kbps\": 4050,\n \"e2ee\": true,\n \"audio_only\": true,\n \"captions_required\": true,\n \"waiting_room\": true,\n \"waiting_room_auto_promote\": true\n },\n \"description\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.orbit.devotel.io/api/v1/video/room-templates")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"config\": {\n \"max_participants\": 151,\n \"max_duration_minutes\": 722,\n \"recording_enabled\": true,\n \"recording_output\": {\n \"width\": 2000,\n \"height\": 1140,\n \"framerate\": 30,\n \"video_bitrate_kbps\": 10050\n },\n \"simulcast\": true,\n \"spatial_layers\": 2,\n \"max_bitrate_kbps\": 4050,\n \"e2ee\": true,\n \"audio_only\": true,\n \"captions_required\": true,\n \"waiting_room\": true,\n \"waiting_room_auto_promote\": true\n },\n \"description\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/video/room-templates")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"config\": {\n \"max_participants\": 151,\n \"max_duration_minutes\": 722,\n \"recording_enabled\": true,\n \"recording_output\": {\n \"width\": 2000,\n \"height\": 1140,\n \"framerate\": 30,\n \"video_bitrate_kbps\": 10050\n },\n \"simulcast\": true,\n \"spatial_layers\": 2,\n \"max_bitrate_kbps\": 4050,\n \"e2ee\": true,\n \"audio_only\": true,\n \"captions_required\": true,\n \"waiting_room\": true,\n \"waiting_room_auto_promote\": true\n },\n \"description\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"template": {
"id": "<string>",
"name": "<string>",
"description": "<string>",
"config": {
"max_participants": 151,
"max_duration_minutes": 722,
"recording_enabled": true,
"recording_output": {
"width": 2000,
"height": 1140,
"framerate": 30,
"video_bitrate_kbps": 10050
},
"simulcast": true,
"spatial_layers": 2,
"max_bitrate_kbps": 4050,
"e2ee": true,
"audio_only": true,
"captions_required": true,
"waiting_room": true,
"waiting_room_auto_promote": true
},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"created_by": "<string>"
}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}Create a room-config template
Save a new reusable room-config template for the calling tenant. Owner/admin/developer only; scoped on video:write. Template names must be unique within the tenant (case-insensitive) and the library is capped at 100 templates per tenant. The config preset carries only non-secret room knobs — recording-storage credentials and consent receipts are never persisted on a template.
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/video/room-templates \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"config": {
"max_participants": 151,
"max_duration_minutes": 722,
"recording_enabled": true,
"recording_output": {
"width": 2000,
"height": 1140,
"framerate": 30,
"video_bitrate_kbps": 10050
},
"simulcast": true,
"spatial_layers": 2,
"max_bitrate_kbps": 4050,
"e2ee": true,
"audio_only": true,
"captions_required": true,
"waiting_room": true,
"waiting_room_auto_promote": true
},
"description": "<string>"
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/video/room-templates"
payload = {
"name": "<string>",
"config": {
"max_participants": 151,
"max_duration_minutes": 722,
"recording_enabled": True,
"recording_output": {
"width": 2000,
"height": 1140,
"framerate": 30,
"video_bitrate_kbps": 10050
},
"simulcast": True,
"spatial_layers": 2,
"max_bitrate_kbps": 4050,
"e2ee": True,
"audio_only": True,
"captions_required": True,
"waiting_room": True,
"waiting_room_auto_promote": True
},
"description": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
config: {
max_participants: 151,
max_duration_minutes: 722,
recording_enabled: true,
recording_output: {width: 2000, height: 1140, framerate: 30, video_bitrate_kbps: 10050},
simulcast: true,
spatial_layers: 2,
max_bitrate_kbps: 4050,
e2ee: true,
audio_only: true,
captions_required: true,
waiting_room: true,
waiting_room_auto_promote: true
},
description: '<string>'
})
};
fetch('https://api.orbit.devotel.io/api/v1/video/room-templates', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.orbit.devotel.io/api/v1/video/room-templates",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'config' => [
'max_participants' => 151,
'max_duration_minutes' => 722,
'recording_enabled' => true,
'recording_output' => [
'width' => 2000,
'height' => 1140,
'framerate' => 30,
'video_bitrate_kbps' => 10050
],
'simulcast' => true,
'spatial_layers' => 2,
'max_bitrate_kbps' => 4050,
'e2ee' => true,
'audio_only' => true,
'captions_required' => true,
'waiting_room' => true,
'waiting_room_auto_promote' => true
],
'description' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.orbit.devotel.io/api/v1/video/room-templates"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"config\": {\n \"max_participants\": 151,\n \"max_duration_minutes\": 722,\n \"recording_enabled\": true,\n \"recording_output\": {\n \"width\": 2000,\n \"height\": 1140,\n \"framerate\": 30,\n \"video_bitrate_kbps\": 10050\n },\n \"simulcast\": true,\n \"spatial_layers\": 2,\n \"max_bitrate_kbps\": 4050,\n \"e2ee\": true,\n \"audio_only\": true,\n \"captions_required\": true,\n \"waiting_room\": true,\n \"waiting_room_auto_promote\": true\n },\n \"description\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.orbit.devotel.io/api/v1/video/room-templates")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"config\": {\n \"max_participants\": 151,\n \"max_duration_minutes\": 722,\n \"recording_enabled\": true,\n \"recording_output\": {\n \"width\": 2000,\n \"height\": 1140,\n \"framerate\": 30,\n \"video_bitrate_kbps\": 10050\n },\n \"simulcast\": true,\n \"spatial_layers\": 2,\n \"max_bitrate_kbps\": 4050,\n \"e2ee\": true,\n \"audio_only\": true,\n \"captions_required\": true,\n \"waiting_room\": true,\n \"waiting_room_auto_promote\": true\n },\n \"description\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/video/room-templates")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"config\": {\n \"max_participants\": 151,\n \"max_duration_minutes\": 722,\n \"recording_enabled\": true,\n \"recording_output\": {\n \"width\": 2000,\n \"height\": 1140,\n \"framerate\": 30,\n \"video_bitrate_kbps\": 10050\n },\n \"simulcast\": true,\n \"spatial_layers\": 2,\n \"max_bitrate_kbps\": 4050,\n \"e2ee\": true,\n \"audio_only\": true,\n \"captions_required\": true,\n \"waiting_room\": true,\n \"waiting_room_auto_promote\": true\n },\n \"description\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"template": {
"id": "<string>",
"name": "<string>",
"description": "<string>",
"config": {
"max_participants": 151,
"max_duration_minutes": 722,
"recording_enabled": true,
"recording_output": {
"width": 2000,
"height": 1140,
"framerate": 30,
"video_bitrate_kbps": 10050
},
"simulcast": true,
"spatial_layers": 2,
"max_bitrate_kbps": 4050,
"e2ee": true,
"audio_only": true,
"captions_required": true,
"waiting_room": true,
"waiting_room_auto_promote": true
},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"created_by": "<string>"
}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}Authorizations
Dashboard JWT token from Clerk
Body
Tenant-supplied label rendered in the template picker. Unique within the tenant (case-insensitive).
1 - 120The reusable, NON-SECRET room-config preset stored on a video room-config template. Every field is optional and maps 1:1 to the identically-named POST /video/rooms-scheduled room-create knob; an empty object is a valid 'all defaults' preset. Unknown keys are rejected, and secret-bearing fields (BYO recording-storage credentials, consent receipts) are intentionally never part of a template.
Show child attributes
Show child attributes
Optional operator description.
500