Voxbi Cockpit APIs
All endpoints

Company home office calendar

Lightweight home office calendar for the caller's company: every colleague's home office bookings in the pending, approved and pending_removal states. Any employee in the company may read it (a team availability view); this is intentionally not scoped to the caller's own records and carries only the fields a calendar needs - full request detail lives on the home-office-requests endpoints. The response is a flat array, not wrapped in a data envelope and not paginated. Cancellation-in-progress rows appear once (the original, as pending_removal); the internal removal credit is omitted.

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[department_id] query · string
Narrow to one or more departments (comma-separated), by the employee's active contract. Omit for the whole company.
filter[from] query · string · date
Only events overlapping on or after this date (`Y-m-d`).
filter[to] query · string · date
Only events overlapping on or before this date (`Y-m-d`).

Responses

The company home office calendar. Flat array, not wrapped in data, not paginated.
Response schema
idstring · uuid
example: 550e8400-e29b-41d4-a716-446655440030
employee_idstring · uuid
example: 550e8400-e29b-41d4-a716-446655440001
employee_namestring | null
example: Jane Smith
department_idstring | null · uuid
Department of the employee's active contract; null when none.
example: 550e8400-e29b-41d4-a716-446655440042
typestring
enum: home_office
example: home_office
sub_typestring | null
statusstring
enum: pending approved pending_removal
example: approved
startstring · date
example: 2026-07-07
endstring · date
example: 2026-07-07
total_secondsinteger
Total booked time across all days, in seconds.
example: 28800
daysarray<object>
Every entry of the booking's raw per-day map. Home office is one row per date, so this normally holds a single day. `working_day_details` below is the same breakdown with any non-working day dropped and the half-day hours resolved; both are returned, and this one is unchanged.
datestring · date
example: 2026-07-07
secondsinteger
example: 28800
working_daysnumber
How long the booking is, in working days the employee actually consumes, each measured against that employee's own scheduled day. A part-timer's 4h day counts as 1, while 4h out of an 8h day counts as 0.5. Home office is one whole day per row, so this is normally 1. Whole counts serialize without a fractional part (1, not 1.0), so decode this as a float rather than an integer.
example: 1
workshift_seconds_per_dayinteger
What one full working day is worth for this employee, in seconds: 28800 on a standard 8h shift, 14400 for somebody contracted to 4h days. Use it instead of assuming 8h. 0 when no contract or work shift resolves, which should be read as unknown.
example: 28800
is_half_dayboolean
True when either end of the booking is a half day. Normally false for home office, which is booked as whole days.
example:
starts_half_dayboolean
True when the first day is a half day: worked that morning, then away.
example:
ends_half_dayboolean
True when the last day is a half day. On a single-day booking this and `starts_half_day` are both true.
example:
start_timestring | null
Local wall-clock hour (HH:MM) the day begins on a half-day start, null otherwise. Taken from the booking's own stored time when it has one, else the tenant's configured AM/PM split (default 12:00).
end_timestring | null
Local wall-clock hour (HH:MM) the day ends on a half-day end, null otherwise. Same source as `start_time`.
working_day_detailsarray<object>
Per-day breakdown holding working days only, ascending by date, with the half-day verdict and hours resolved per day.
datestring · date
example: 2026-07-07
secondsinteger
Seconds booked off that day, scaled to the employee's own day.
example: 28800
is_half_dayboolean
True when this day's seconds fall short of `workshift_seconds_per_day` by more than 900 (a tolerance for lunch and rounding).
example:
start_timestring | null
HH:MM; non-null only on a half-day first day.
end_timestring | null
HH:MM; non-null only on a half-day last day.
Authorization Token Missing. This error is returned when the authorization token is missing.
Response schema
errorstring
Error message
example: Authorization Token is missing
The caller belongs to another tenant, has no employee record, or has no active company.
Response schema
No response body.
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}/calendar/home-office
Base URL
Request sample
curl -X GET 'https://cockpit.voxbi.com/api/v1/{pbx_id}/calendar/home-office' \
  -H 'Authorization: Bearer YOUR_TOKEN'
const response = await fetch('https://cockpit.voxbi.com/api/v1/{pbx_id}/calendar/home-office', {
  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}/calendar/home-office',
    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}/calendar/home-office', false, $context);
$data = json_decode($response, true);
print_r($data);
[]
{},
"id": "550e8400-e29b-41d4-a716-446655440050",
"employee_id": "550e8400-e29b-41d4-a716-446655440001",
"employee_name": "Jane Smith",
"department_id": "550e8400-e29b-41d4-a716-446655440042",
"type": "home_office",
"sub_type": null,
"status": "approved",
"start": "2026-08-04",
"end": "2026-08-04",
"total_seconds": 28800,
"days": [],
{}
"date": "2026-08-04",
"seconds": 28800
}
],
"working_days": 1,
"workshift_seconds_per_day": 28800,
"is_half_day": false,
"starts_half_day": false,
"ends_half_day": false,
"start_time": null,
"end_time": null,
"working_day_details": []
{}
"date": "2026-08-04",
"seconds": 28800,
"is_half_day": false,
"start_time": null,
"end_time": null
}
]
},
{}
"id": "550e8400-e29b-41d4-a716-446655440051",
"employee_id": "550e8400-e29b-41d4-a716-446655440001",
"employee_name": "Jane Smith",
"department_id": "550e8400-e29b-41d4-a716-446655440042",
"type": "home_office",
"sub_type": null,
"status": "pending",
"start": "2026-08-06",
"end": "2026-08-06",
"total_seconds": 28800,
"days": [],
{}
"date": "2026-08-06",
"seconds": 28800
}
],
"working_days": 1,
"workshift_seconds_per_day": 28800,
"is_half_day": false,
"starts_half_day": false,
"ends_half_day": false,
"start_time": null,
"end_time": null,
"working_day_details": []
{}
"date": "2026-08-06",
"seconds": 28800,
"is_half_day": false,
"start_time": null,
"end_time": null
}
]
}
]
{}
"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