curl --request POST \
--url https://{host}/api/v1/conference-rooms/{id}/dial \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"target": "1001",
"kind": "extension",
"role": "participant"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({target: '1001', kind: 'extension', role: 'participant'})
};
fetch('https://{host}/api/v1/conference-rooms/{id}/dial', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{host}/api/v1/conference-rooms/{id}/dial"
payload = {
"target": "1001",
"kind": "extension",
"role": "participant"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)Dial somebody into a room
Places a call to an extension of the organisation (kind: extension, target the number) or to an outside number (kind: external, target in E.164) and, when it is answered, seats the person in the room in role (participant or moderator) WITHOUT asking for a PIN — the role travels as a channel variable only the platform can set. An outside number is routed and rated as an outbound call and refused without credit; it sees the organisation’s first phone number as caller ID, an extension sees the room’s number. 202: the call is ringing; whether it was answered shows in the room’s live list. conferences:control.
curl --request POST \
--url https://{host}/api/v1/conference-rooms/{id}/dial \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"target": "1001",
"kind": "extension",
"role": "participant"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({target: '1001', kind: 'extension', role: 'participant'})
};
fetch('https://{host}/api/v1/conference-rooms/{id}/dial', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{host}/api/v1/conference-rooms/{id}/dial"
payload = {
"target": "1001",
"kind": "extension",
"role": "participant"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)Authorizations
Every request sends Authorization: Bearer <token>. The token is either a panel session (a JWT from /auth/login, 12 hours) or an API key ft_<id>_<secret>. An API key is accepted only from an address on its IP allowlist (403 ip_not_allowed otherwise; 403 ip_allowlist_required for an old key that has none), is limited to its rate per minute (429 rate_limited with Retry-After; X-RateLimit-Limit/Remaining/Reset on every response), and at most 60 call placements a minute.
Path Parameters
Body
Response
{dialling, role}