curl --request POST \
--url https://{host}/api/v1/conference-rooms \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"number": "<string>",
"enabled": true,
"end_when_moderator_leaves": false,
"max_members": 0,
"minutes_email": "<string>",
"moderator_pin": "<string>",
"organisation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"participant_pin": "<string>",
"record": false,
"wait_for_moderator": false
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
number: '<string>',
enabled: true,
end_when_moderator_leaves: false,
max_members: 0,
minutes_email: '<string>',
moderator_pin: '<string>',
organisation_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
participant_pin: '<string>',
record: false,
wait_for_moderator: false
})
};
fetch('https://{host}/api/v1/conference-rooms', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{host}/api/v1/conference-rooms"
payload = {
"name": "<string>",
"number": "<string>",
"enabled": True,
"end_when_moderator_leaves": False,
"max_members": 0,
"minutes_email": "<string>",
"moderator_pin": "<string>",
"organisation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"participant_pin": "<string>",
"record": False,
"wait_for_moderator": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"created_at": "2023-11-07T05:31:56Z",
"enabled": true,
"end_when_moderator_leaves": true,
"exemptions": [
{
"extension_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"number": "<string>",
"role": "participant"
}
],
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"live_members": 123,
"max_members": 123,
"members": [
{
"extension_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"number": "<string>",
"role": "participant",
"virtual": true
}
],
"minutes_email": "<string>",
"moderator_pin": "<string>",
"name": "<string>",
"number": "<string>",
"numbers": [
"<string>"
],
"organisation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"participant_pin": "<string>",
"record": true,
"wait_for_moderator": true
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}Create a conference room
Refused in words when the number is not 2-8 digits, a PIN is not 4-10 digits, or the two PINs are equal (every caller would be a moderator). A room may wait for a moderator with no moderator PIN when an exempt extension joins as one. Name and number are each unique within the organisation.
curl --request POST \
--url https://{host}/api/v1/conference-rooms \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"number": "<string>",
"enabled": true,
"end_when_moderator_leaves": false,
"max_members": 0,
"minutes_email": "<string>",
"moderator_pin": "<string>",
"organisation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"participant_pin": "<string>",
"record": false,
"wait_for_moderator": false
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
number: '<string>',
enabled: true,
end_when_moderator_leaves: false,
max_members: 0,
minutes_email: '<string>',
moderator_pin: '<string>',
organisation_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
participant_pin: '<string>',
record: false,
wait_for_moderator: false
})
};
fetch('https://{host}/api/v1/conference-rooms', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{host}/api/v1/conference-rooms"
payload = {
"name": "<string>",
"number": "<string>",
"enabled": True,
"end_when_moderator_leaves": False,
"max_members": 0,
"minutes_email": "<string>",
"moderator_pin": "<string>",
"organisation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"participant_pin": "<string>",
"record": False,
"wait_for_moderator": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"created_at": "2023-11-07T05:31:56Z",
"enabled": true,
"end_when_moderator_leaves": true,
"exemptions": [
{
"extension_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"number": "<string>",
"role": "participant"
}
],
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"live_members": 123,
"max_members": 123,
"members": [
{
"extension_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"number": "<string>",
"role": "participant",
"virtual": true
}
],
"minutes_email": "<string>",
"moderator_pin": "<string>",
"name": "<string>",
"number": "<string>",
"numbers": [
"<string>"
],
"organisation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"participant_pin": "<string>",
"record": true,
"wait_for_moderator": true
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}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.
Body
^[0-9]{2,8}$Comma-separated addresses for the minutes.
Empty for no moderator role. Must differ from participant_pin.
Required when more than one organisation is in scope.
Empty means no PIN.
^([0-9]{4,10})?$Response
Created
A dial-in bridge the organisation owns. Migration 0115 says why the PINs are stored and returned in clear.
The organisation's extensions that dial the room number and are seated without a PIN, each in its role. Set as a whole with PUT /conference-rooms/{id}/exemptions.
Show child attributes
Show child attributes
People in the room right now.
0 = no limit beyond the node's capacity.
Default members: the organisation's extensions rung when the room opens, or as soon as they are free while it is up. virtual marks a virtual agent's extension, whose conduct in the room is the AI module's. Set as a whole with PUT /conference-rooms/{id}/members.
Show child attributes
Show child attributes
Comma-separated addresses a session's minutes go to, when the AI module writes them.
4-10 digits, or empty for a room with no moderator role.
2-8 digits: what an extension dials, and what a caller keys at a shared 'conference' number.
Phone numbers pointed at this room alone.
4-10 digits, or empty: no PIN, dial the number and you are in.
Record every session of this room.
Participants hear hold music until a moderator has joined.