Check-in
Day-of visit state machine: arrived → forms completed → in room → completed.
Each appointment has at most one check-in session. Start it with a POST; advance it with PATCH and a target status. The state machine only moves forward; sending the same status twice is idempotent.
Start a check-in
Open the day-of session for an appointment. Status starts at ARRIVED.
Required scopes:
contacts.writePath parameters
| Name | Type | Description |
|---|---|---|
appointmentIdrequired | string | Appointment id. |
Responses
201 CreatedSession opened.example { "id": "ci_8q4w2k…", "appointmentId": "ap_3w8d2k…", "status": "ARRIVED", "arrivedAt": "2026-05-22T18:55:00Z", "formsCompletedAt": null, "inRoomAt": null, "completedAt": null }409 ConflictSession already started.
Code samples
curl -X POST https://app.contactfollowup.com/api/check-in/{appointmentId} \
-H "Authorization: Bearer $HEARTHNOTE_TOKEN" \
-H "Content-Type: application/json"Advance the state machine
Mark forms completed, the patient in-room, or the visit complete.
Required scopes:
contacts.writePath parameters
| Name | Type | Description |
|---|---|---|
appointmentIdrequired | string | Appointment id. |
Request body
| Name | Type | Description |
|---|---|---|
statusrequired | string | FORMS_COMPLETED | IN_ROOM | COMPLETED. |
Request body
{ "status": "IN_ROOM" }Responses
200 OKUpdated session.example { "id": "ci_8q4w2k…", "appointmentId": "ap_3w8d2k…", "status": "IN_ROOM", "arrivedAt": "2026-05-22T18:55:00Z", "formsCompletedAt": null, "inRoomAt": null, "completedAt": null }
Code samples
curl -X PATCH https://app.contactfollowup.com/api/check-in/{appointmentId} \
-H "Authorization: Bearer $HEARTHNOTE_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "status": "IN_ROOM" }'