Suggest open meeting slots across the caller and colleagues (user)
Free/busy across the caller's own mailbox and the given colleagues,
reduced to open windows of at least duration_minutes. Colleagues who
have not enabled the assistant are silently skipped rather than failing
the whole request. Only busy/free windows are considered; subjects,
locations and attendee lists never enter this computation on either
provider.
Requires the ListUsers permission - the same gate as
GET /users/{user}/calendar/* - because colleague_ids reaches the
identical colleague-mailbox resolution those routes use.
colleague_ids names colleagues by their internal user id, never by
email, and each id must exist in the caller's own PBX (Rule::exists
scoped by pbx_id); capped at 19 (20 mailboxes total with the caller).
The window may not span more than 62 days, same rule as
GET /me/calendar/agenda.
Rate limited to 10 requests/minute (throttle:calendar-availability):
this endpoint fans out up to 20 provider calls per request against a
shared per-project quota.
User bearer token. Default authentication for customer-facing endpoints.
Obtain a token by calling POST /login with your credentials, then send it
on every subsequent request as Authorization: Bearer <token>. The token
inherits the permissions and PBX scope of the authenticated user.
- HTTP Authorization Scheme
bearer- Bearer format
Bearer <token>
application/jsonRequest body · required · application/json
colleague_idsarray<string>
Responses
dataarray<object>
errorsobject
https://cockpit.voxbi.com/api/v1/me/calendar/availability
curl -X POST 'https://cockpit.voxbi.com/api/v1/me/calendar/availability' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
--data '{"earliest":"2026-09-08T00:00:00Z","latest":"2026-09-12T00:00:00Z","duration_minutes":30,"colleague_ids":["550e8400-e29b-41d4-a716-446655440000"]}'
const response = await fetch('https://cockpit.voxbi.com/api/v1/me/calendar/availability', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${YOUR_TOKEN}`,
},
body: JSON.stringify({
"earliest": "2026-09-08T00:00:00Z",
"latest": "2026-09-12T00:00:00Z",
"duration_minutes": 30,
"colleague_ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();
console.log(data);
import requests
response = requests.post('https://cockpit.voxbi.com/api/v1/me/calendar/availability',
headers={'Authorization': f'Bearer {YOUR_TOKEN}'},
json={
"earliest": "2026-09-08T00:00:00Z",
"latest": "2026-09-12T00:00:00Z",
"duration_minutes": 30,
"colleague_ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
)
response.raise_for_status()
data = response.json()
print(data)
<?php
$context = stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json\r\nAuthorization: Bearer YOUR_TOKEN",
'content' => '{
\"earliest\": \"2026-09-08T00:00:00Z\",
\"latest\": \"2026-09-12T00:00:00Z\",
\"duration_minutes\": 30,
\"colleague_ids\": [
\"550e8400-e29b-41d4-a716-446655440000\"
]
}',
],
]);
$response = file_get_contents('https://cockpit.voxbi.com/api/v1/me/calendar/availability', false, $context);
$data = json_decode($response, true);
print_r($data);
{ … }
"colleague_ids": [ … ]
{ … }
"data": [ … ]
{ … }
{ … }
application/json{ … }
{ … }
"errors": { … }
"latest": [ … ]
{ … }
60application/json