Book an event on the caller's own calendar (user)
Always writes to the caller's own mailbox; there is no way to name a subject on this endpoint. Attendees are invited by email address only, never by a colleague's internal user id, which would let this endpoint be used to probe one.
attendees is capped at 50: a draft with attendees sets
sendUpdates=all on the provider, so an unbounded list would turn this
endpoint into a bulk-invite sender from the caller's own, real,
DKIM/SPF-passing domain.
Rate limited to 15 requests/minute (throttle:calendar-write).
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
attendeesarray<object>
required optionalResponses
dataobject
AAMkAGI1AAAtOTU1AAA=Weekly Sync2026-09-08T09:00:00Z2026-09-08T09:30:00Zfree tentative busy oof workingElsewhere nullbusynormal personal private confidential nullnormalnone organizer tentativelyAccepted accepted declined notResponded nullacceptedattendeesarray<object>
jane.smith@example.comJane Smithrequired optionalrequirednone organizer tentativelyAccepted accepted declined notResponded nullacceptedjane.smith@example.comConference Room 2https://meet.example.com/abc-defg-hijerrorsobject
https://cockpit.voxbi.com/api/v1/me/calendar/events
curl -X POST 'https://cockpit.voxbi.com/api/v1/me/calendar/events' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
--data '{"subject":"Weekly Sync","start":"2026-09-08T09:00:00Z","end":"2026-09-08T09:30:00Z","timezone":"Europe/Luxembourg","location":"Conference Room 2","online_meeting":true,"attendees":[{"email":"jane.smith@example.com","name":"Jane Smith","type":"required"}]}'
const response = await fetch('https://cockpit.voxbi.com/api/v1/me/calendar/events', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${YOUR_TOKEN}`,
},
body: JSON.stringify({
"subject": "Weekly Sync",
"start": "2026-09-08T09:00:00Z",
"end": "2026-09-08T09:30:00Z",
"timezone": "Europe/Luxembourg",
"location": "Conference Room 2",
"online_meeting": true,
"attendees": [
{
"email": "jane.smith@example.com",
"name": "Jane Smith",
"type": "required"
}
]
}),
});
const data = await response.json();
console.log(data);
import requests
response = requests.post('https://cockpit.voxbi.com/api/v1/me/calendar/events',
headers={'Authorization': f'Bearer {YOUR_TOKEN}'},
json={
"subject": "Weekly Sync",
"start": "2026-09-08T09:00:00Z",
"end": "2026-09-08T09:30:00Z",
"timezone": "Europe/Luxembourg",
"location": "Conference Room 2",
"online_meeting": true,
"attendees": [
{
"email": "jane.smith@example.com",
"name": "Jane Smith",
"type": "required"
}
]
}
)
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' => '{
\"subject\": \"Weekly Sync\",
\"start\": \"2026-09-08T09:00:00Z\",
\"end\": \"2026-09-08T09:30:00Z\",
\"timezone\": \"Europe/Luxembourg\",
\"location\": \"Conference Room 2\",
\"online_meeting\": true,
\"attendees\": [
{
\"email\": \"jane.smith@example.com\",
\"name\": \"Jane Smith\",
\"type\": \"required\"
}
]
}',
],
]);
$response = file_get_contents('https://cockpit.voxbi.com/api/v1/me/calendar/events', false, $context);
$data = json_decode($response, true);
print_r($data);
{ … }
"attendees": [ … ]
{ … }
{ … }
application/json{ … }
{ … }
"errors": { … }
"subject": [ … ]
{ … }
60application/json