Schedule entries
Returns published schedule entries — one per day, with pagination and filters by period, department, and employee.
Scope
Requires the schedule.read scope. Without it, the key gets 403 missing_scope. See Scopes and permissions → Scope table for which permission the key's creator needs to grant this scope.
Query parameters
| Parameter | Required | Description |
|---|---|---|
limit |
no | Integer 1..200, defaults to 100. |
cursor |
no | The meta.next_cursor value from the previous response — for the next page. |
from, to |
no | YYYY-MM-DD dates in the organization's timezone, boundaries inclusive — filters by entry_date. Passed only as a pair; the maximum range is 366 days. When omitted, the current calendar month is used. |
department_id |
no | A department UUID. Matched through the employee's department, not through a column on the entry itself: you get the entries of that department's employees. An unknown or another organization's department_id is not an error, it just returns an empty list. |
employee_id |
no | An employee UUID — exact match. An unknown or foreign employee_id also returns an empty list, not an error. |
The resource has no other parameters: any extra parameter returns 400 validation_error — it's explicitly rejected, not silently ignored (see Conventions → Filters). Passing only from without to (or vice versa) is also rejected — 400 with the hint pass both from and to, or neither.
Request
Without parameters — the current month's entries in the organization's timezone:
curl -s https://smengo.com/api/v1/schedule-entries \
-H "Authorization: Bearer smg_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
For a specific period and a single employee:
curl -s "https://smengo.com/api/v1/schedule-entries?from=2026-07-01&to=2026-07-31&employee_id=5e6d9f2a-3b7c-4e2f-9a1d-7c8e2f6b4a10" \
-H "Authorization: Bearer smg_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Response
{
"data": [
{
"id": "7a3c1d5e-8f2b-4c6a-9e1f-2d4b6a8c0e13",
"employee_id": "5e6d9f2a-3b7c-4e2f-9a1d-7c8e2f6b4a10",
"employee_full_name": "Иванова Мария",
"entry_date": "2026-07-14",
"status_id": "c2e4a6b8-1d3f-4a5c-8e7b-9f0a1b2c3d4e",
"shift_preset_id": "3f8e2a1c-6b5d-4e9f-a2c1-7d8e9f0a1b2c",
"start_time": null,
"end_time": null
},
{
"id": "b91f4e2d-0a7c-4b3e-8d6f-1c2a3b4c5d6e",
"employee_id": "0b2f5e7a-9c31-4d6e-8a2b-4f1e6c9d3a52",
"employee_full_name": "Петров Игорь",
"entry_date": "2026-07-14",
"status_id": "c2e4a6b8-1d3f-4a5c-8e7b-9f0a1b2c3d4e",
"shift_preset_id": null,
"start_time": "22:00:00",
"end_time": "06:00:00"
}
],
"meta": { "next_cursor": null }
}
Response fields
| Field | Type | Description |
|---|---|---|
id |
string (uuid) |
The schedule entry's unique identifier. |
employee_id |
string (uuid) |
The employee the entry belongs to (see Employees). |
employee_full_name |
string |
The employee's full name. Embedded deliberately: a BI export of the schedule doesn't need a second request to /employees. |
entry_date |
string (YYYY-MM-DD) |
The entry's day, in the organization's timezone; the list is sorted by this field (plus id as a tiebreaker). |
status_id |
string (uuid) |
The day's status — working day, vacation, sick leave, and so on; resolve it via Status types. |
shift_preset_id |
string (uuid) | null |
The shift preset (see Shift presets); null if the entry isn't tied to a preset. |
start_time |
string (HH:MM:SS) | null |
Shift start — a per-entry override, in the organization's timezone. |
end_time |
string (HH:MM:SS) | null |
Shift end — also a per-entry override. |
start_time/end_time are raw per-entry time overrides. null doesn't mean "no time": in that case the shift's time comes from the preset (shift_preset_id) or the status (status_id) — both reference resources expose their default times. Overnight shifts can cross midnight, so start_time < end_time is not guaranteed: "22:00:00" → "06:00:00" is a shift that ends the next morning.
Schedule drafts never appear in this response — the endpoint returns published entries only; terminated employees are excluded entirely, along with their entries. The internal fields note, created_by, and updated_by are not selected.
Pagination
The list is sorted by entry_date, id. If there are more entries than limit, meta.next_cursor holds a cursor for the next page — pass it verbatim as cursor on the next request:
curl -s "https://smengo.com/api/v1/schedule-entries?limit=1&cursor=eyJrIjoiMjAyNi0wNy0xNCIsImlkIjoiN2EzYzFkNWUtOGYyYi00YzZhLTllMWYtMmQ0YjZhOGMwZTEzIn0" \
-H "Authorization: Bearer smg_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
meta.next_cursor is null once there are no more entries. Full pagination rules are in Conventions → Pagination.
What's next
- Shift presets — resolving
shift_preset_idand default shift times. - Status types — resolving
status_id. - Check-ins — actual arrival and departure marks against schedule entries.