Voxbi Cockpit APIs
All endpoints

List the absence requests waiting on you to decide (user)

The absence, illness and special-leave requests this employee is asked to decide, newest first, one entry per request. Requests to remove already approved days are included, marked sub_type: removal.

Read off the approval rows addressed to them, so approval chains are honoured exactly as the decision endpoints honour them: which step holds the request, watchers, self-approval grants, and restarts. Requests at a step below theirs are included with can_decide_now: false, so a validator further up a chain sees what is coming rather than having it appear from nowhere.

Your own employee record only: another employee's id returns 403, since a queue is built from rows addressed to one person.

One endpoint per request type, matching how the work is looked at: a screen showing one type pages that type, instead of over-fetching a mixed feed and filtering it. The sibling queues are pending-requests/absences, pending-requests/home-office and pending-requests/time-point-corrections; GET /v2/{pbx}/employee/{employee}/validator reports how many are waiting in each.

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 path · string · uuid *
UUID of the PBX tenant. Must be the tenant the token belongs to; anything else is refused with 403 rather than answered from another tenant.
employee_id path · string · uuid *
UUID of the Tempus employee whose queue this is. Must be the caller's own employee record: a queue is built from the approval rows addressed to one person, so another employee's id is refused rather than quietly answered with your own.
page query · integer
Page number to return.
per_page query · integer
Number of entries per page.
filter[requester_id] query · string · uuid
Narrow the queue to one person who raised requests. Named `requester_id` rather than `employee_id` because the employee in the path is the validator: these routes have two employees in play. A requester you hold no rows on yields an empty page rather than a 403, since nothing was hidden from you.
accept header · string
example: application/json

Responses

OK. Paginated absence requests waiting on this employee.
Response schema
data*array<object>
[]object
pagination*object
page*integer
example: 1
total_pages*integer
example: 2
total*integer
example: 14
per_page*integer
example: 10
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 caller is outside this PBX, or asked for an employee record that is not their own.
Response schema
messagestring
example: You do not have access to this PBX.
Not found. No such employee in this PBX.
Response schema
messagestring
example: User not found.
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/v2/{pbx}/employee/{employee}/pending-requests/absences
Base URL
Request sample
curl -X GET 'https://cockpit.voxbi.com/api/v1/v2/{pbx}/employee/{employee}/pending-requests/absences' \
  -H 'Authorization: Bearer YOUR_TOKEN'
const response = await fetch('https://cockpit.voxbi.com/api/v1/v2/{pbx}/employee/{employee}/pending-requests/absences', {
  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/v2/{pbx}/employee/{employee}/pending-requests/absences',
    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/v2/{pbx}/employee/{employee}/pending-requests/absences', false, $context);
$data = json_decode($response, true);
print_r($data);
{}
"data": [],
{}
"id": "550e8400-e29b-41d4-a716-446655440010",
"type": "absence",
"sub_type": null,
"status": "pending",
"employee_id": "550e8400-e29b-41d4-a716-446655440001",
"employee": {},
"employee_id": "550e8400-e29b-41d4-a716-446655440001",
"first_name": "Anna",
"last_name": "Muller",
"name": "Muller Anna"
},
"requested_by": null,
"company_id": "550e8400-e29b-41d4-a716-446655440005",
"start": "2026-03-04T00:00:00+00:00",
"end": "2026-03-06T00:00:00+00:00",
"dates": [],
"2026-03-04",
"2026-03-05",
"2026-03-06"
],
"requested_time": {},
"2026-03-04": 28800
},
"requested_seconds": 86400,
"next_availability": {},
"if_approved": {},
"absent_from": "2026-03-04",
"next_available_date": "2026-03-09",
"next_available_at": null,
"available_now": true,
"in_past": false,
"extends_current_absence": false,
"message": "Off from 2026-03-04, available on 2026-03-09"
},
"current": {}
"next_available_date": null,
"message": null
}
},
"comment": "Family trip",
"created": "2026-03-01T09:12:00+00:00",
"modified": "2026-03-01T09:12:00+00:00",
"validators": [],
{}
"employee_id": "550e8400-e29b-41d4-a716-446655440020",
"name": "Lemaire Farid",
"status": "pending",
"comment": null,
"step_position": 1,
"watcher": false,
"mandatory": false
}
],
"can_decide_now": true,
"watcher": false,
"step": {},
"position": 1,
"total": 2,
"name": "Team lead",
"status": "active",
"required": 1,
"mandatory": false
},
"awaiting": []
}
],
"pagination": {}
"page": 1,
"total_pages": 2,
"total": 14,
"per_page": 10
}
}
{}
"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.
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