Check in to a Booking
A checkin records actual presence at a bookable, on top of or independent of a booking. Tablets at the door, kiosk screens, badge readers and QR scan flows all create the same row.
1. Create the Checkin
POST /checkin
{
"starts_at": "2026-05-15T08:00:00Z",
"ends_at": "2026-05-15T09:00:00Z",
"object_type": "public.bookable",
"object_id": "c3d4e5f6-a7b8-9012-cdef-345678901234",
"booking_id": "f9955a9a-bb9e-450b-8e91-09a43f0e6cd6",
"owner_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}starts_at, ends_at, object_type and object_id are required. object_type must be public.bookable. Link to a booking with booking_id when tracking attendance for a specific reservation. Standalone drop-ins leave booking_id out. checkin_created fires on the bookable.
Response:
{
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"starts_at": "2026-05-15T08:00:00Z",
"ends_at": "2026-05-15T09:00:00Z",
"object_type": "public.bookable",
"object_id": "c3d4e5f6-a7b8-9012-cdef-345678901234",
"check_in": null,
"check_out": null,
"type": null,
"created_by": "e992bfc1-0336-42c5-bd0a-4f4804a9fd24",
"owner_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"created_at": "2026-05-15T07:59:44.112Z",
"updated_at": "2026-05-15T07:59:44.112Z"
},
"request_id": "c1d2e3f4-a5b6-7890-cdef-123456789012",
"count": 1
}Note: booking_id is used to link the checkin to the booking row but is not stored on the checkin itself.
2. Record Arrival
PUT /checkin/{id}
{
"check_in": "2026-05-15T08:02:14Z"
}checkin_updated fires on the bookable.
3. Record Departure
PUT /checkin/{id}
{
"check_out": "2026-05-15T08:58:30Z"
}checkout_started fires first as a pre-hook, then checkout_completed fires once check_out is written. Both fire on the bookable.
Response (same shape for both PUT calls):
{
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"starts_at": "2026-05-15T08:00:00Z",
"ends_at": "2026-05-15T09:00:00Z",
"object_type": "public.bookable",
"object_id": "c3d4e5f6-a7b8-9012-cdef-345678901234",
"check_in": "2026-05-15T08:02:14Z",
"check_out": "2026-05-15T08:58:30Z",
"type": null,
"created_by": "e992bfc1-0336-42c5-bd0a-4f4804a9fd24",
"owner_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"created_at": "2026-05-15T07:59:44.112Z",
"updated_at": "2026-05-15T08:58:31.004Z"
},
"request_id": "d2e3f4a5-b6c7-8901-def0-234567890123",
"count": 1
}Triggers
| Trigger | Fires when |
|---|---|
checkin_created | A checkin is registered |
checkin_updated | A checkin is modified |
checkout_started | A PUT is received (pre-hook, used for payment gating) |
checkout_completed | check_out is set for the first time |
checkin_deleted | A checkin is deleted |
Bind any of these to an action on the bookable to drive a real world side effect.
Where this fits
A typical room flow: user books a room, scans a QR code at the door, the server resolves the code, an action creates the checkin with check_in set, checkout_started and checkin_updated fire, and a door unlock action runs. See Code Scan Flow for the scan side. The Activity log compares booked time against actual presence after the fact.