Voxbi Cockpit APIs
All endpoints

List home office calendars across employees (user)

Returns virtual home office calendar entries aggregated from home_office transactions across the tenant. Each entry groups the pending, approved, and removed home-office days for one employee, company, and calendar year.

When the caller has permission to view other employees' home office (resolved from the validator scope), entries for the caller's company are returned; without a group filter the result is scoped to the caller's company. Otherwise only the caller's own entries are returned. The response is a plain list under data and is not paginated, even though page and per_page are accepted as filters.

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>
pbx_id path · string · uuid *
UUID of the PBX tenant.
filter[year] query · integer
Restrict the calendars to a single calendar year.
filter[group_id] query · string · uuid
Restrict the calendars to employees in a specific department group.
include query · string
When set to `user`, embeds the linked Voxbi user summary on each entry.
enum: user
page query · integer
Accepted for compatibility; the response is not paginated.
per_page query · integer
Accepted for compatibility; the response is not paginated.
accept header · string
example: application/json

Responses

Response schema
data*array<object>
Each item — Virtual home office calendar entry for a single employee and calendar year, as serialized by the V1 `HomeOfficeCalendarResource`. This object is not backed by a dedicated table: it is derived on the fly from `TempusTransaction` records of type `home_office`, then grouped by employee, company, and year. The response shape is preserved for backward compatibility with the legacy `TempusHomeOfficeCalendar` resource, so several values are denormalized into this single object rather than exposed as relations. Each day a home office request touches is classified into one of three date lists based on the source transaction's status and sub-type: pending requests go into `requested_days`, approved requests into `approved_days`, and pending removals or rejected requests into `removed_days`. Every date is an ISO 8601 calendar date (YYYY-MM-DD) and the lists are deduplicated. The matching `count_*` fields hold the number of entries in each list. The `user` object is only present when the calendar is requested with employee user details included (the `includeUser` option); it is absent otherwise.
id*string · uuid
Identifier of the underlying `TempusTransaction` (home office request) that seeded this calendar entry. Not a stable identifier of the calendar itself, which is a virtual aggregate.
read-only
example: 550e8400-e29b-41d4-a716-446655440000
mxvp_user_id*string · uuid
Identifier of the Pbx (tenant) that owns this calendar. Named `mxvp_user_id` for backward compatibility with the legacy API; it corresponds to the transaction's `pbx_id`.
example: 550e8400-e29b-41d4-a716-446655440001
ext_id*string | null
External identifier of the employee's primary extension, resolved from the employee record. Null when the employee has no associated extension.
example: 201
company_id*string | null · uuid
Identifier of the company the home office requests belong to. Null when the requests are not scoped to a specific company.
example: 550e8400-e29b-41d4-a716-446655440002
creator_id*string · uuid
Identifier of the Tempus employee who created the home office request (the transaction requester, falling back to the subject employee). This is a `tempus_employees` identifier, not a user identifier.
example: 550e8400-e29b-41d4-a716-446655440003
validator_id*string | null · uuid
Identifier of the Tempus employee who validated (approved) the request, resolved from the approving user. Null when the request has not yet been validated. This is a `tempus_employees` identifier, not a user identifier.
example: 550e8400-e29b-41d4-a716-446655440004
year*integer · int32
Calendar year this entry aggregates. All dates in the day lists fall within this year.
example: 2026
days_of_week*string
Comma-separated list of weekday abbreviations on which home office is considered applicable. Currently a fixed working-week value.
example: mon,tue,wed,thu,fri
requested_days*array<string>
Calendar dates with a pending home office request (not yet approved). Each entry is an ISO 8601 date (YYYY-MM-DD). Deduplicated; may be empty.
[]string · date
example: 2026-06-15
approved_days*array<string>
Calendar dates on which home office has been approved. Each entry is an ISO 8601 date (YYYY-MM-DD). Deduplicated; may be empty.
[]string · date
example: 2026-06-16
removed_days*array<string>
Calendar dates that were removed: pending removals or rejected requests. Each entry is an ISO 8601 date (YYYY-MM-DD). Deduplicated; may be empty.
[]string · date
example: 2026-06-17
comment*string
Free-form note carried over from the most recent contributing home office transaction. Empty string when no note was provided.
example: Working from home on project deadline week
created*string | null · date-time
ISO 8601 timestamp when the seeding transaction was created. Null when the timestamp is unavailable.
read-only
example: 2026-06-01T08:29:07+00:00
modified*string | null · date-time
ISO 8601 timestamp when the seeding transaction was last updated. Null when the timestamp is unavailable.
read-only
example: 2026-06-10T14:12:33+00:00
count_requested_days*integer · int32
Number of distinct dates in `requested_days`.
example: 1
count_approved_days*integer · int32
Number of distinct dates in `approved_days`.
example: 1
count_removed_days*integer · int32
Number of distinct dates in `removed_days`.
example: 1
userobject
Summary of the employee's linked Voxbi user. Only present when the calendar is requested with user details included; omitted otherwise.
idstring · uuid
Unique identifier of the linked user.
example: 550e8400-e29b-41d4-a716-446655440005
numberstring | null
Extension number assigned to the user. Null when none is set.
example: 201
namestring | null
First name of the user.
example: Jane
name2string | null
Last name of the user.
example: Smith
Authorization Token Missing. This error is returned when the authorization token is missing.
Response schema
errorstring
Error message
example: Authorization Token is missing
Forbidden. The authenticated user does not belong to the requested PBX tenant.
Response schema
messagestring
example: This action is unauthorized.
Unprocessable Parameters. This error is returned when a parameter is not valid.
Response schema
messagestring
example: The given data was invalid.
errorsobject
filterarray<string>
[]string
sortarray<string>
[]string
pagearray<string>
[]string
per_pagearray<string>
[]string
get https://cockpit.voxbi.com/api/v1/{pbx_id}/home-office-calendars
Base URL
Request sample
curl -X GET 'https://cockpit.voxbi.com/api/v1/{pbx_id}/home-office-calendars' \
  -H 'Authorization: Bearer YOUR_TOKEN'
const response = await fetch('https://cockpit.voxbi.com/api/v1/{pbx_id}/home-office-calendars', {
  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/{pbx_id}/home-office-calendars',
    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/{pbx_id}/home-office-calendars', false, $context);
$data = json_decode($response, true);
print_r($data);
No example for this status.
{}
"error": "Authorization Token is missing"
}
Cache-Control string
example: private, must-revalidate
Connection string
example: keep-alive
Content-Type string
example: application/json
Vary string
example: Origin
X-RateLimit-Limit integer
Max requests allowed in the current rate-limit window.
example: 60
X-RateLimit-Remaining integer
Requests remaining in the current rate-limit window.
example: 57
No example for this status.
{}
"errors": {}
"filter": [],
"The filter field must be an array."
],
"sort": [],
"The sort field must be a string."
],
"page": [],
"The page field must be an integer."
],
"per_page": []
"The per page field must be an integer."
]
}
}
Cache-Control string
example: private, must-revalidate
Connection string
example: keep-alive
Content-Type string
example: application/json
Vary string
example: Origin
X-RateLimit-Limit integer
Max requests allowed in the current rate-limit window.
example: 60
X-RateLimit-Remaining integer
Requests remaining in the current rate-limit window.
example: 57