Skip to content
Docs menu

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.write

Path parameters

NameTypeDescription
appointmentIdrequiredstringAppointment 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

Shell
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.write

Path parameters

NameTypeDescription
appointmentIdrequiredstringAppointment id.

Request body

NameTypeDescription
statusrequiredstringFORMS_COMPLETED | IN_ROOM | COMPLETED.

Request body

JSON
{ "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

Shell
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" }'