Bookings: calendar-ready, join-safe appointments

This entry describes the v1 contract. Bookings survive into Sender API v2 as content_type: "booking" on a letter correspondence, with the typed fields carried in attributes. See Correspondence.

The booking content type is now complete. Deliver an appointment (a clinic visit, an enrollment slot, a virtual hearing or interview) as a typed, calendar-ready mailpiece instead of loose text.

What's new

  • Virtual coordinates, validated: alongside starts_at, ends_at, and location, a booking now carries meeting_url (https only, no userinfo), meeting_code, meeting_passcode, and meeting_dial_in. A booking must carry at least one reachable coordinate so the recipient can always get to the room, physical or virtual; hybrids (venue and link) are accepted. location is now optional to make the fully-virtual case first-class.
  • Join-safe by construction: recipient apps render the tap-to-join affordance from the typed meeting_* fields only. Links in the message body are never promoted to a Join button. Appointment "your meeting moved, join here" phishing does not survive a verified-sender mailpiece with a validated join link.
  • A sealed slip for every booking: when your delivery includes no PDF part, Keepable renders a deterministic sealed booking slip from the typed fields, file-hash-verifiable through /public/verify. Attach your own PDF to keep your attestation.
  • Add to calendar: recipients get a server-side .ics projection (or a native calendar insert on mobile) straight from the typed fields, plus a single reminder the day before.

booking stays a preview type while the remaining clients ship; its attributes shape may still change. See Content types for the full field reference.

Back to every dated change.