curl --request POST \
--url https://api.revdesk.com/v1/room-token \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from_number": "<string>",
"to_number": "<string>",
"ttl_seconds": 315,
"client_name": "<string>",
"client_label": "<string>"
}
'import requests
url = "https://api.revdesk.com/v1/room-token"
payload = {
"from_number": "<string>",
"to_number": "<string>",
"ttl_seconds": 315,
"client_name": "<string>",
"client_label": "<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({
from_number: '<string>',
to_number: '<string>',
ttl_seconds: 315,
client_name: '<string>',
client_label: '<string>'
})
};
fetch('https://api.revdesk.com/v1/room-token', 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.revdesk.com/v1/room-token",
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([
'from_number' => '<string>',
'to_number' => '<string>',
'ttl_seconds' => 315,
'client_name' => '<string>',
'client_label' => '<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.revdesk.com/v1/room-token"
payload := strings.NewReader("{\n \"from_number\": \"<string>\",\n \"to_number\": \"<string>\",\n \"ttl_seconds\": 315,\n \"client_name\": \"<string>\",\n \"client_label\": \"<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.revdesk.com/v1/room-token")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from_number\": \"<string>\",\n \"to_number\": \"<string>\",\n \"ttl_seconds\": 315,\n \"client_name\": \"<string>\",\n \"client_label\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.revdesk.com/v1/room-token")
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 \"from_number\": \"<string>\",\n \"to_number\": \"<string>\",\n \"ttl_seconds\": 315,\n \"client_name\": \"<string>\",\n \"client_label\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"token": "<string>",
"room_url": "<string>",
"room_name": "<string>",
"call_id": "<string>",
"expires_in": 123,
"from_number": "<string>",
"to_number": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"resolution_hint": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"resolution_hint": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"resolution_hint": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"resolution_hint": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"resolution_hint": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"resolution_hint": "<string>",
"fields": {},
"doc_url": "<string>"
}
}Issue a room-join token for private browser calling
Issues a single-call token for browser calling where RevDesk places the call and your browser joins it. You provide a caller ID (from_number, which must be a number you own) and a destination (to_number); RevDesk dials the destination and returns a token your browser uses to join the live call and talk through the mic. Nothing about the underlying network is exposed to the browser. The connection runs entirely on RevDesk’s own infrastructure. Pass the returned token and room_url to the RevDesk browser SDK (@revdesk/webrtc) to join.
curl --request POST \
--url https://api.revdesk.com/v1/room-token \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from_number": "<string>",
"to_number": "<string>",
"ttl_seconds": 315,
"client_name": "<string>",
"client_label": "<string>"
}
'import requests
url = "https://api.revdesk.com/v1/room-token"
payload = {
"from_number": "<string>",
"to_number": "<string>",
"ttl_seconds": 315,
"client_name": "<string>",
"client_label": "<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({
from_number: '<string>',
to_number: '<string>',
ttl_seconds: 315,
client_name: '<string>',
client_label: '<string>'
})
};
fetch('https://api.revdesk.com/v1/room-token', 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.revdesk.com/v1/room-token",
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([
'from_number' => '<string>',
'to_number' => '<string>',
'ttl_seconds' => 315,
'client_name' => '<string>',
'client_label' => '<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.revdesk.com/v1/room-token"
payload := strings.NewReader("{\n \"from_number\": \"<string>\",\n \"to_number\": \"<string>\",\n \"ttl_seconds\": 315,\n \"client_name\": \"<string>\",\n \"client_label\": \"<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.revdesk.com/v1/room-token")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from_number\": \"<string>\",\n \"to_number\": \"<string>\",\n \"ttl_seconds\": 315,\n \"client_name\": \"<string>\",\n \"client_label\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.revdesk.com/v1/room-token")
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 \"from_number\": \"<string>\",\n \"to_number\": \"<string>\",\n \"ttl_seconds\": 315,\n \"client_name\": \"<string>\",\n \"client_label\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"token": "<string>",
"room_url": "<string>",
"room_name": "<string>",
"call_id": "<string>",
"expires_in": 123,
"from_number": "<string>",
"to_number": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"resolution_hint": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"resolution_hint": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"resolution_hint": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"resolution_hint": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"resolution_hint": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"resolution_hint": "<string>",
"fields": {},
"doc_url": "<string>"
}
}Authorizations
Organization-scoped RevDesk API key. Each operation declares its required permissions in x-required-scopes.
Headers
UUID — when present, deduplicates repeat submissions. See /api-reference/idempotency.
Optional end-user IPv4 or IPv6 address reported by your server for the browser caller. Stored as client-reported diagnostics, separately from the API request IP; never used for authentication. Raw IPs expire after 30 days.
Body
Response
Success
Show child attributes
Show child attributes