Check-ins
Returns check-ins — employees' actual arrival and departure marks, with pagination and filters by period, department, and employee.
Scope
Requires the checkins.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: you get the check-ins 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 check-ins in the organization's timezone:
curl -s https://smengo.com/api/v1/check-ins \
-H "Authorization: Bearer smg_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
For a specific period and a department:
curl -s "https://smengo.com/api/v1/check-ins?from=2026-07-01&to=2026-07-31&department_id=9c1a2e34-5678-4abc-9def-0123456789ab" \
-H "Authorization: Bearer smg_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Response
{
"data": [
{
"id": "4d8f2c6a-1e3b-4f7d-9c5a-8b0e2f4a6c19",
"employee_id": "5e6d9f2a-3b7c-4e2f-9a1d-7c8e2f6b4a10",
"entry_date": "2026-07-14",
"check_in_at": "2026-07-14T05:58:12.000Z",
"check_out_at": "2026-07-14T14:03:47.000Z",
"source": "telegram",
"schedule_entry_id": "7a3c1d5e-8f2b-4c6a-9e1f-2d4b6a8c0e13"
},
{
"id": "6c0a2e4d-7b9f-4c1e-8a3d-5e7f9b1d3a64",
"employee_id": "0b2f5e7a-9c31-4d6e-8a2b-4f1e6c9d3a52",
"entry_date": "2026-07-15",
"check_in_at": "2026-07-15T06:02:33.000Z",
"check_out_at": null,
"source": "telegram",
"schedule_entry_id": null
}
],
"meta": { "next_cursor": null }
}
Response fields
| Field | Type | Description |
|---|---|---|
id |
string (uuid) |
The check-in's unique identifier. |
employee_id |
string (uuid) |
The employee the mark belongs to. The employee's name is not embedded in the response (unlike schedule entries) — resolve employee_id via Employees. |
entry_date |
string (YYYY-MM-DD) |
The mark's day, in the organization's timezone; the list is sorted by this field (plus id as a tiebreaker). |
check_in_at |
string (ISO 8601 UTC) | null |
The arrival mark's instant; null — no check-in happened. |
check_out_at |
string (ISO 8601 UTC) | null |
The departure mark's instant; null — no check-out happened (or hasn't happened yet). Any combination of null in the check_in_at/check_out_at pair is possible, including a check-in without a check-out. |
source |
string |
The mark's source. This is an open string, not a closed enum: currently the only writer of check-ins is the Telegram bot with the value telegram; other values may appear in the future. |
schedule_entry_id |
string (uuid) | null |
The link to a schedule entry (see Schedule entries); null — a check-in outside the schedule. |
Terminated employees never appear in this response — they're excluded entirely, along with their check-ins, regardless of filters.
Pagination
The list is sorted by entry_date, id. If there are more check-ins 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/check-ins?limit=1&cursor=eyJrIjoiMjAyNi0wNy0xNCIsImlkIjoiNGQ4ZjJjNmEtMWUzYi00ZjdkLTljNWEtOGIwZTJmNGE2YzE5In0" \
-H "Authorization: Bearer smg_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
meta.next_cursor is null once there are no more check-ins. Full pagination rules are in Conventions → Pagination.
What's next
- Schedule entries — the plan that
schedule_entry_idpoints to. - Employees — resolving
employee_id. - Timesheets — the monthly summary check-ins roll up into.