Developer docs Security & compliance Live demo
Try the demo

Developers

Build on it without asking us

A clinic with a website, a group with a warehouse, a partner with a dashboard — none of them should have to wait for us to build something.

HMAC-SHA256 signed At-least-once delivery One canonical model

Webhooks

Subscribe, and we post to your URL

Signed, with retries. Set one up in the interface and the signing secret is shown once.

EventFires when
appointment.bookedSomebody books, from any route
appointment.cancelledA visit is cancelled
referral.receivedA referral arrives by fax, portal or by hand
referral.advancedA referral moves to a new stage
form.completedA patient finishes an intake form
payment.receivedMoney is recorded
order.placedA clinician orders something
message.receivedA patient replies

What a payload contains

Identifiers and states. Never a name, a number or a clinical detail — a webhook goes to a server we do not control, at a URL somebody typed into a form, and anything else would make every integration a patient-data export that nobody reviewed.

When you need the detail, ask for it having proved who you are.

Verifying one

Every request carries X-Essentials-Signature, an HMAC-SHA256 of the timestamp and the raw body joined with a dot, plus X-Essentials-Signature-Timestamp. Compare in constant time and reject anything older than five minutes.

Delivery is at-least-once

Retries happen, and your acknowledgement can be lost on the way back. Every event carries an id in both the header and the body — X-Essentials-Event-Id — precisely so you can recognise a repeat.

A subscriber that keeps failing is switched off rather than retried for ever, and we keep your server's own reply so "we never got it" has an answer.

signature = hmac_sha256(timestamp + "." + raw_body, your_secret)

Where it is set up

Subscriptions, in the product

A practice adds a subscription itself: an HTTPS address, the events it wants, and a secret shown once. Every delivery is kept with the status code your end returned, and a subscription that keeps failing switches itself off rather than retrying for ever.

The webhooks page listing six subscriptions, each with its HTTPS address, the events it receives and an on or off status, above the form for adding a new subscription.
Signed, retried event notifications that carry identifiers, never patient details. Shown with sample data.

The capability map

Ask before you write

Before writing code that creates a lab order, ask whether the EMR on the other side can accept one. The map answers per resource and per operation, and an unsupported call returns a specific "not supported" with a sentence you can show a user — never a silent success.

This is the difference between an integration that degrades and one that lies. If your code treats "cannot" and "failed" the same way, it will retry the impossible for ever and lose the possible.

Three outcomes, not two

  • Sent — the write reached the chart
  • Retryable — a transient failure, queued again
  • Not supported — 501, with the reason in plain words

The canonical model

One shape, whatever system it came from

Patient, Practitioner, Location, Appointment, Encounter, Coverage, DocumentReference and Order. Every record carries where it came from — which EMR, which connection, which id there, and when it was last changed — so provenance is never guessed.

Identifiers are ours, minted once and stable for ever. Reconnecting an EMR does not create a second copy of every patient, which is the failure that makes most integrations unusable in their second year.

Every record carries

  • Which EMR it came from
  • Which connection fetched it
  • Its identifier over there
  • When it last changed

The API

Want the API rather than the webhooks?

There is a read and write API behind the same signing scheme. It is not open to the public yet because we would rather stabilise it with a few partners first than publish something we have to break. Ask, and we will bring you in.