Skip to content

Get a colleague's agenda (user)

GET only, and this route group registers no other verb, ever - a deliberate protocol property, not an oversight. /users/{user}/calendar exposes read-only roster views; every write on this feature happens exclusively under /me/calendar/*, on the caller's own mailbox, and no route parameter anywhere in this feature ever reaches a write.

Requires the ListUsers permission, checked before {user} is even resolved, so a caller without the permission never learns whether the id exists. A cross-tenant or nonexistent {user} both 404 identically, so this route cannot be used as an existence oracle either.

Any event whose sensitivity is not normal returns as a busy block with no subject and no attendee list. On top of that, if the colleague set their own colleague_visibility to busy_only (the default), every event is reduced the same way regardless of its own sensitivity.

The window may not span more than 62 days, same rule as GET /me/calendar/agenda. Colleague reads are always primary-calendar only, unlike the caller's own agenda which may merge in opted-in secondary calendars.

If the colleague has not enabled the assistant, this answers 200 with an empty body rather than a 403 - the same softer handling as the caller's own agenda.

Returns the raw, camelCase event shape (CalendarEventRaw), the same known inconsistency as GET /me/calendar/agenda.

HTTP: bearerAuth

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>
user path · string · uuid *
start query · string · date-time *
end query · string · date-time *
accept header · string
example: application/json

Responses

OK. `data` is omitted entirely both when the window has no events and when the colleague has not enabled the assistant.
Response schema
dataarray<object>
Each item — The raw, camelCase shape currently returned by `GET /me/calendar/agenda` and `GET /users/{user}/calendar/agenda`. Every other calendar endpoint on this page returns the snake_case `CalendarEvent` model instead; these two endpoints serialise the underlying event data directly rather than through that resource. This is a known, tracked inconsistency, documented as-is rather than coerced into the shape it "should" have.
idstring
example: AAMkAGI1AAAtOTU1AAA=
deletedboolean
example:
seriesMasterIdstring | null
subjectstring | null
example: Weekly Sync
startstring | null · date-time
example: 2026-09-08T09:00:00.000000Z
endstring | null · date-time
example: 2026-09-08T09:30:00.000000Z
isAllDayboolean
example:
isCancelledboolean
example:
showAsstring | null
enum: free tentative busy oof workingElsewhere null
example: busy
sensitivitystring | null
enum: normal personal private confidential null
example: normal
responsestring | null
enum: none organizer tentativelyAccepted accepted declined notResponded null
example: accepted
calendarIdstring | null
attendeesarray<object>
emailstring · email
example: jane.smith@example.com
namestring | null
example: Jane Smith
typestring
enum: required optional
example: required
responsestring | null
enum: none organizer tentativelyAccepted accepted declined notResponded null
example: accepted
organizerEmailstring | null · email
example: jane.smith@example.com
locationstring | null
example: Conference Room 2
onlineMeetingstring | null
example: https://meet.example.com/abc-defg-hij
Unauthenticated. The `Authorization: Bearer <token>` header was missing, malformed, or names a token that has been revoked or deleted.
Response schema
messagestring
The caller does not hold the `ListUsers` permission required to read a colleague's calendar. Checked before the `{user}` id is resolved, so a caller without the permission never learns whether the id even exists.
Response schema
messagestring
`{user}` does not resolve in the caller's own PBX. Deliberately identical whether the id is simply wrong or belongs to a real user in a different tenant: cross-tenant and nonexistent both 404 the same way, so this route cannot be used as an existence oracle for another tenant's user ids.
Response schema
messagestring
`start`/`end` missing or invalid, `end` not after `start`, or the window spans more than 62 days.
Response schema
messagestring
errorsobject
Free-form object
get https://cockpit.voxbi.com/api/v1/users/{user}/calendar/agenda
Base URL
Request sample
curl -X GET 'https://cockpit.voxbi.com/api/v1/users/{user}/calendar/agenda' \
  -H 'Authorization: Bearer YOUR_TOKEN'
const response = await fetch('https://cockpit.voxbi.com/api/v1/users/{user}/calendar/agenda', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${YOUR_TOKEN}`,
  },
});

const data = await response.json();
console.log(data);
import requests

response = requests.get('https://cockpit.voxbi.com/api/v1/users/{user}/calendar/agenda',
    headers={'Authorization': f'Bearer {YOUR_TOKEN}'}
)
response.raise_for_status()
data = response.json()
print(data)
<?php
$context = stream_context_create([
    'http' => [
        'method'  => 'GET',
        'header'  => "Content-Type: application/json\r\nAuthorization: Bearer YOUR_TOKEN",
    ],
]);

$response = file_get_contents('https://cockpit.voxbi.com/api/v1/users/{user}/calendar/agenda', false, $context);
$data = json_decode($response, true);
print_r($data);
{ … }
"data": [ … ]
{ … }
"id": "AAMkAGI1AAAtOTU1AAA=",
"deleted": false,
"seriesMasterId": null,
"subject": null,
"start": "2026-09-08T09:00:00.000000Z",
"end": "2026-09-08T09:30:00.000000Z",
"isAllDay": false,
"isCancelled": false,
"showAs": "busy",
"sensitivity": null,
"response": null,
"calendarId": null,
"attendees": null,
"organizerEmail": null,
"location": null,
"onlineMeeting": null
}
]
}
{ … }
"message": "Unauthenticated."
}
Content-Type string
example: application/json
{ … }
"message": "You are not authorized to view a colleague's calendar."
}
No example for this status.
No example for this status.