ediverse Explore the platform

Spotlight PEPPOL BIS Billing 3.0 The EU e-invoicing mandate is here — France Sept 2026, Belgium Jan 2026, Germany 2025.

AppointmentResponse — Reply to an appointment

An actor — patient, practitioner, room — replies to an appointment proposal. Accept, decline, counter-propose: AppointmentResponse records each RSVP.

Purpose

AppointmentResponse represents a participant's reply to a proposed Appointment. When the system creates an appointment with multiple participants (clinician, patient, room, device), each can reply individually — one AppointmentResponse per actor. The overall Appointment status depends on the aggregated replies: booked only if all required participants have accepted.

Key fields

FieldTypeCardinalityRole
identifierIdentifier[]0..*External identifiers.
appointmentReference(Appointment)1..1Mandatory. Target appointment.
proposedNewTimeboolean0..1true = counter-proposal with another slot.
startinstant0..1Proposed/accepted start.
endinstant0..1Proposed/accepted end.
participantTypeCodeableConcept[]0..*Participant role.
actorReference(Patient | Group | Practitioner | PractitionerRole | RelatedPerson | Device | HealthcareService | Location)0..1Responding participant.
participantStatuscode1..1Mandatory. accepted, declined, tentative, needs-action.
commentstring0..1Free-form comment.
recurringboolean0..1Applies to the whole series.
occurrenceDatedate0..1Targeted occurrence (if recurring).
recurrenceIdpositiveInt0..1Occurrence ID in the series.

Lifecycle

An Appointment is created in proposed or pending: the server generates one AppointmentResponse needs-action per required participant. Each reply updates the participant's status in Appointment.participant[]. When all required participants have accepted, the Appointment flips to booked.

JSON example

A patient confirms their 20 May 2026 appointment:

json appointmentresponse-patient.json
{
  "resourceType": "AppointmentResponse",
  "id": "ar-001",
  "identifier": [{ "system": "urn:oid:1.2.34", "value": "AR-2026-05-15-001" }],
  "appointment": { "reference": "Appointment/apt-2026-05-20-001" },
  "proposedNewTime": false,
  "start": "2026-05-20T10:00:00+02:00",
  "end": "2026-05-20T10:30:00+02:00",
  "participantType": [{
    "coding": [{
      "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType",
      "code": "ATND",
      "display": "attender"
    }]
  }],
  "actor": { "reference": "Patient/doe-john" },
  "participantStatus": "accepted",
  "comment": "Confirmed, I will arrive 10 minutes early",
  "recurring": false,
  "occurrenceDate": "2026-05-20"
}

Common pitfalls

  • No sync with Appointment.participant.status — creating an AppointmentResponse without updating the Appointment-side status leaves the EHR confused.
  • Counter-proposal without start/endproposedNewTime=true must come with a new slot, otherwise there is nothing actionable.
  • Reply for an unlisted actoractor must be part of Appointment.participant[].
  • Ambiguous recurrencerecurring=true without occurrenceDate applies to all occurrences: often unintentional.
  • Confusing with Appointment.participant.status — the formal reply is a resource; the status is denormalized for fast reads.