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_id and default shift times.
  • Status types — resolving status_id.
  • Check-ins — actual arrival and departure marks against schedule entries.
Was this article helpful?