List presence timepoints for the authenticated user (user)
Return a paginated list of presence timepoints (status changes recorded over
time) scoped to the authenticated user's PBX. Results are sorted by
start_time descending by default.
Filtering and sorting follow the Spatie query-builder convention: filters are
passed as filter[<field>] and sorts as a comma-separated sort value where
a leading - denotes descending order.
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>
per_page
query · integer
Number of items per page. Defaults to 50.
page
query · integer
Page number to retrieve.
filter[user_id]
query · string · uuid
Filter by user identifier.
filter[status_id]
query · string · uuid
Filter by status identifier.
filter[start_time]
query · string · date-time
Filter by start time.
filter[end_time]
query · string · date-time
Filter by end time.
filter[is_synced]
query · boolean
Filter by sync state with the external Tempus system.
sort
query · string
Sort field. Allowed values: `start_time`, `end_time`, `created_at`.
Prefix with `-` for descending order. Defaults to `-start_time`.
accept
header · string
example:
application/jsonResponses
Response schema
dataarray<object>
Each item — A Tempus time point as serialized by the V1 `TimePointResource`. A time point
records a single interval during which an employee was in a given presence or
attendance status (for example working, on break, or off). Each time point
belongs to exactly one Pbx (tenant) and one user, references the status that
was active during the interval, and is bounded by a `start_time` and an
optional `end_time`.
An open time point (one with `end_time` set to null) represents the employee's
current, ongoing status. When a new time point is opened for an employee, any
previously open time point for that same employee is automatically closed by
setting its `end_time`.
This object documents the exact keys returned by the resource, not every raw
database column. Columns such as `successive_count`, `comment`, `mapping_id`,
`deleted_at`, `created_by`, and `updated_by` exist on the model but are not
exposed by this resource. The `sources`, `triggers`, and `meta_data` fields
are stored as JSON and returned as free-form objects.
Location data comes in three distinct parts that must not be conflated:
`location_id` plus the nested `location` object describe the *configured*
location record the employee selected; `device_gps` records where the
*device* said it was; `location_check` is the comparison of the two.
id*string · uuid
Unique time point identifier.
read-only
example:
550e8400-e29b-41d4-a716-446655440000pbx_id*string · uuid
Identifier of the Pbx (tenant) that owns this time point.
example:
550e8400-e29b-41d4-a716-446655440001user_id*string · uuid
Identifier of the user (employee) this time point belongs to.
example:
550e8400-e29b-41d4-a716-446655440002status_id*string · uuid
Identifier of the Tempus status that was active during this interval (for
example working, break, or off). References a `TempusStatus` record.
example:
550e8400-e29b-41d4-a716-446655440003location_idstring | null · uuid
Identifier of the location the status was recorded against. Null when no
location was selected.
example:
550e8400-e29b-41d4-a716-446655440010locationobject | null
The configured location record referenced by `location_id`, including its
own coordinates and geofence radius. Null when `location_id` is null.
These are the location's *configured* coordinates, not the device's: see
`device_gps` for the latter.
idstring · uuid
example:
550e8400-e29b-41d4-a716-446655440010namestring
example:
HQ Luxembourgdescriptionstring | null
street_nostring | null
example:
12streetstring | null
example:
Rue de Bonnevoiecitystring | null
example:
Luxembourgpostalstring | null
example:
1260country_idstring | null · uuid
example:
550e8400-e29b-41d4-a716-446655440011latitudenumber | null · double
The location's configured latitude, in degrees.
example:
49.6008longitudenumber | null · double
The location's configured longitude, in degrees.
example:
6.133geofence_radius_minteger | null
Geofence radius around the configured point, in metres.
example:
150is_fixed_locationboolean
example:
1start_time*string · date-time
Timestamp marking the beginning of the status interval.
example:
2024-03-01T08:29:07Zend_timestring | null · date-time
Timestamp marking the end of the status interval. Null while the time
point is still open, which indicates the employee's current ongoing
status.
example:
2024-03-01T12:00:00Zsourcesobject | null
Free-form JSON object describing the origin systems that contributed to
this time point (for example the cockpit UI, a badge reader, or an API
client). Structure varies by integration. Null when no source data is
recorded.
example:
{"channel":"cockpit","device_id":"550e8400-e29b-41d4-a716-446655440010"}triggersobject | null
Free-form JSON object describing the events that triggered the creation or
closing of this time point (for example a manual status change or an
automated rollover). Structure varies by integration. Null when no trigger
data is recorded.
example:
{"type":"manual_change","actor_id":"550e8400-e29b-41d4-a716-446655440002"}meta_dataobject | null
Free-form JSON object holding additional key-value metadata attached to
the time point, exactly as the client sent it. Keys are
integration-specific. Null when no metadata is stored.
Two keys are written by the server rather than the client: `device_gps`
and `location_check`, both also surfaced as top-level fields of this
resource (see below).
example:
{"note":"Started shift remotely","gpsLat":49.95,"gpsLong":6.133}device_gpsobject | null
The coordinates the client reported when this status was recorded, stored
exactly as sent. Read from whichever field the client already uses
(`gpsData`, or GPS keys inside `meta_data`, under any of the historical
spellings such as `gpsLat` / `lat` / `latitude`).
This is never derived from, corrected by, or overwritten with the
coordinates configured on the selected location: it records where the
device claimed to be, which is only useful as evidence if it is left
untouched. Compare it with `location.latitude` / `location.longitude`,
which describe the configured location record instead.
Null when the request carried no usable fix (no coordinates at all, only
one of the pair, or values outside the valid latitude / longitude range).
A request with an unusable fix still succeeds, and whatever it sent is
preserved verbatim under `meta_data`.
latitude*number · double
Latitude reported by the device, in degrees.
example:
49.95longitude*number · double
Longitude reported by the device, in degrees.
example:
6.133accuracy_mnumber | null · double
Accuracy radius of the fix in metres, as reported by the device. Null
when the client sent none. Used as tolerance by `location_check`.
example:
12.5captured_atstring | null · date-time
The device's GPS timestamp, parsed. Null when the client sent none or
sent a value that could not be parsed.
example:
2026-07-07T10:07:39+00:00captured_at_rawstring | number | null
The GPS timestamp exactly as the client sent it: epoch milliseconds,
epoch seconds, or an ISO 8601 string. Kept alongside the parsed value
so nothing the client reported is lost.
example:
1783418859289location_checkobject | null
Comparison of `device_gps` against the selected location's configured
coordinates and geofence radius. This is the integrity signal: it shows
when an employee recorded a status against a location they were not
actually at.
Null when the time point has neither a device fix nor a location, and on
time points written before this check existed.
location_idstring | null · uuid
The location the status was recorded against, if any.
example:
550e8400-e29b-41d4-a716-446655440010location_latitudenumber | null · double
The location's configured latitude at the time of the check.
example:
49.6008location_longitudenumber | null · double
The location's configured longitude at the time of the check.
example:
6.133geofence_radius_minteger | null
The location's configured geofence radius in metres.
example:
150distance_minteger | null
Distance in metres between the device fix and the location's
configured point. Recorded whenever both sides have coordinates, even
when the location has no geofence radius and no in-or-out verdict is
possible: the distance alone is the useful signal.
example:
38957within_geofenceboolean | null
Whether the device fix falls inside the geofence. The device's own
reported accuracy is added to the radius as tolerance, so a poor fix
slightly outside a small geofence is not treated as a discrepancy.
Null when no verdict was possible.
example:
verdictstring
`match`: the device fix is inside the geofence.
`mismatch`: the device fix is outside it, meaning the selected
location disagrees with where the device said it was.
`unknown`: not enough data to judge, see `reason`.
enum:
match mismatch unknownexample:
mismatchreasonstring | null
Why the verdict is `unknown`. `no_device_gps`: the request carried no
usable fix. `no_location`: no location was selected, or it does not
belong to this tenant. `location_without_coordinates`: the location
record has no coordinates configured. `no_geofence_radius`: the
location has coordinates but no radius, so only `distance_m` is
meaningful. Null when the verdict is `match` or `mismatch`.
enum:
no_device_gps no_location location_without_coordinates no_geofence_radius nullis_synced*boolean
Whether this time point has been synchronized to the downstream
time-and-attendance system. False until the record has been exported.
example:
created_atstring | null · date-time
Timestamp when the time point was created.
read-only
example:
2024-03-01T08:29:07Zupdated_atstring | null · date-time
Timestamp when the time point was last updated.
read-only
example:
2024-03-01T08:29:07Zlinksobject
firststring
The first page of the resource
example:
http://localhost/api/v1/resources?page=1laststring
The last page of the resource
example:
http://localhost/api/v1/resources?page=1prevnull | string
The previous page of the resource
nextnull | string
The next page of the resource
metaobject
current_pageinteger
The current page of the resource
≥ 1
example:
1fromnull | integer
The first item of the resource
≥ 1
example:
1last_pageinteger
The last page of the resource
≥ 1
example:
1linksarray<object>
urlstring | null
The url of the resource (null for the boundary prev/next links)
example:
http://localhost/api/v1/resources?page=1labelstring
The label of the resource
example:
firstactiveboolean
The status of the resource
example:
1pathstring
The path of the resource
example:
http://localhost/api/v1/resourcesper_pageinteger
The number of items per page of the resource
≥ 1
example:
15tonull | integer
The last item of the resource
≥ 1
example:
1totalinteger
The total number of items of the resource
≥ 0
example:
1Authorization Token Missing. This error is returned when the authorization token is missing.
Response schema
errorstring
Error message
example:
Authorization Token is missing
get
https://cockpit.voxbi.com/api/v1/timepoints
Base URL
Request sample
curl -X GET 'https://cockpit.voxbi.com/api/v1/timepoints' \
-H 'Authorization: Bearer YOUR_TOKEN'
const response = await fetch('https://cockpit.voxbi.com/api/v1/timepoints', {
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/timepoints',
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/timepoints', false, $context);
$data = json_decode($response, true);
print_r($data);
{ … }
"data": [ … ]
{ … }
"id": "550e8400-e29b-41d4-a716-446655440000",
"pbx_id": "550e8400-e29b-41d4-a716-446655440001",
"user_id": "550e8400-e29b-41d4-a716-446655440002",
"status_id": "550e8400-e29b-41d4-a716-446655440003",
"location_id": "550e8400-e29b-41d4-a716-446655440010",
"start_time": "2026-07-07T10:07:39Z",
"end_time": "2026-07-07T12:00:00Z",
"sources": [ … ],
"mobile"
],
"triggers": [ … ],
"manual"
],
"meta_data": { … },
"gpsLat": 49.95,
"gpsLong": 6.133,
"source": "api_v1",
"device_gps": { … },
"latitude": 49.95,
"longitude": 6.133,
"accuracy_m": 12.5,
"captured_at": "2026-07-07T10:07:39+00:00",
"captured_at_raw": 1783418859289
},
"location_check": { … }
"location_id": "550e8400-e29b-41d4-a716-446655440010",
"location_latitude": 49.6008,
"location_longitude": 6.133,
"geofence_radius_m": 150,
"distance_m": 38957,
"within_geofence": false,
"verdict": "mismatch",
"reason": null
}
},
"location": { … },
"id": "550e8400-e29b-41d4-a716-446655440010",
"name": "HQ Luxembourg",
"latitude": 49.6008,
"longitude": 6.133,
"geofence_radius_m": 150,
"is_fixed_location": true
},
"device_gps": { … },
"latitude": 49.95,
"longitude": 6.133,
"accuracy_m": 12.5,
"captured_at": "2026-07-07T10:07:39+00:00",
"captured_at_raw": 1783418859289
},
"location_check": { … },
"location_id": "550e8400-e29b-41d4-a716-446655440010",
"location_latitude": 49.6008,
"location_longitude": 6.133,
"geofence_radius_m": 150,
"distance_m": 38957,
"within_geofence": false,
"verdict": "mismatch",
"reason": null
},
"is_synced": true,
"created_at": "2026-07-07T10:07:39Z",
"updated_at": "2026-07-07T12:00:00Z"
}
]
}
{ … }
"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