Download OpenAPI specification:
Programmatic access to HearLink services.
Retrieves a single patient by UID.
| uid required | string <uuid> The patient UID. |
{- "success": true,
- "data": {
- "uid": "string",
- "fullName": "string",
- "title": "string",
- "phoneNumber": "string",
- "secondaryPhoneNumber": "string",
- "dob": "2019-08-24T14:15:22Z",
- "gender": "string",
- "maritalStatus": "string",
- "referral": "string",
- "referralSubType": "string",
- "primaryClinic": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "postcode": "string",
- "country": "string"
}, - "status": {
- "status": "string",
- "subStatus": "string",
- "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}, - "contactPreference": "string",
- "contactPermissions": [
- "string"
], - "emergencyContactName": "string",
- "emergencyContactNumber": "string",
- "gpDetails": "string",
- "virtualServicingEnabled": true,
- "lastTestDate": "2019-08-24T14:15:22Z",
- "lastFittingDate": "2019-08-24T14:15:22Z",
- "externalSystemId": "string",
- "state": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}, - "customFields": [
- {
- "key": "string",
- "value": "string",
- "values": [
- "string"
], - "type": "string"
}
], - "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Returns a list of patients for the authenticated organisation. Supports three mutually exclusive modes: List mode (no filter params): Returns all patients ordered by created date descending, paginated. External ID lookup (externalSystemId only): Returns 0 or 1 result matching the given external system ID. Search (exactly one of query, phoneNumber, or emailAddress): Returns up to 50 results. Optionally combine with dob to post-filter results. query is a free-text search over name, contact details and address, and tolerates misspellings and partial words in the name and address only. phoneNumber and emailAddress are exact lookups. A phone number matches whichever way it was written, in national or international form, but a partial or mistyped number returns nothing rather than a near match. Limitations: - dob filtering may miss matches whose name ranks outside the top 50 hits.
| query | string Free-text search over name, contact details and address. Misspellings and partial words are tolerated in the name and address only. |
| phoneNumber | string Phone number lookup. Normalised to digits-only before search (fuzzy lookup mode). |
| emailAddress | string <email> Email address lookup, case-insensitive (fuzzy lookup mode). |
| externalSystemId | string Exact lookup by external system ID. Mutually exclusive with all other filters. |
| dob | string^\d{4}-\d{2}-\d{2}$ Date of birth in YYYY-MM-DD format. Used as an additional post-filter when combined with query, phoneNumber, or emailAddress. Not valid on its own. |
| cursor | string Opaque pagination cursor from a previous response. List mode only. |
| limit | integer [ 1 .. 200 ] Default: 100 Number of results per page. List mode only. |
{- "success": true,
- "data": [
- {
- "uid": "abc-123",
- "fullName": "John Smith",
- "phoneNumber": "07123456789",
- "emailAddress": "[email protected]"
}
], - "nextCursor": "eyJjcmVhdGVkQXQiOjE3NDg5MDg4MDAwMDAsInVpZCI6ImFiYy0xMjMifQ=="
}Creates a new patient.
Field groups (exactly one required per group): - referralId or referralName - primaryClinicId or primaryClinicName - statusId or statusName
| title | string |
| fullName required | string non-empty |
object (Address) Patient address details | |
| referralId | string Provide exactly one of referralId or referralName |
| referralName | string Provide exactly one of referralId or referralName |
| primaryClinicId | string Provide exactly one of primaryClinicId or primaryClinicName |
| primaryClinicName | string Provide exactly one of primaryClinicId or primaryClinicName |
| statusId | string Provide exactly one of statusId or statusName |
| statusName | string Provide exactly one of statusId or statusName |
| secondaryStatusId | string Optional sub-status key within the chosen status's sub-workflow. |
| secondaryStatusName | string Optional sub-status name within the chosen status's sub-workflow. |
| primaryPhoneNumber required | string non-empty |
| secondaryPhoneNumber | string |
| emailAddress | string <email> |
| dob | string^\d{4}-\d{2}-\d{2}$ Optional date of birth in YYYY-MM-DD format |
| age | integer >= 0 |
| gender | string |
| notes | string |
required | object (Tracking) Tracking/marketing information |
{- "fullName": "John Smith",
- "primaryPhoneNumber": "07123456789",
- "dob": "1985-07-12",
- "statusName": "Patient Created",
- "primaryClinicName": "Manchester",
- "referralName": "Facebook",
- "tracking": {
- "provider": "facebook",
- "ids": {
- "gclid": "123abc",
- "campaignId": "456def"
}, - "utm_source": "facebook",
- "utm_medium": "cpc",
- "utm_campaign": "spring_sale"
}
}{- "success": true,
- "data": {
- "patientUid": "pat_456"
}
}Returns bookable time slots for a given appointment type and clinic over a date range. Dates with no bookable slots are omitted from the response. The date range must not exceed 62 days and from must be today or later in the organisation's timezone.
| from required | string^\d{4}-\d{2}-\d{2}$ Inclusive start date in YYYY-MM-DD format. Must be today or later. |
| to required | string^\d{4}-\d{2}-\d{2}$ Inclusive end date in YYYY-MM-DD format. Must be on or after |
| appointmentTypeId required | string <uuid> UID of the appointment type to check availability for. |
| clinicId required | string <uuid> UID of the clinic to check availability for. |
| assigneeId | string Optional. When supplied, only slots where this clinician is available are returned. |
{- "success": true,
- "data": [
- {
- "date": "2026-06-01",
- "slots": [
- {
- "start": "09:00",
- "availableConsultants": [
- {
- "uid": "bzmkTG9kWXRTmytUvuMfB2h3buI2",
- "fullName": "Jane Smith"
}
]
}, - {
- "start": "09:30",
- "availableConsultants": [
- {
- "uid": "bzmkTG9kWXRTmytUvuMfB2h3buI2",
- "fullName": "Jane Smith"
}
]
}
]
}
]
}Returns a paginated list of appointments filtered by a required date range plus optional filters. Date strings are interpreted in the organisation's configured timezone. Results are sorted by startDateTime ascending.
Pagination: keep requesting with the returned nextCursor until the response omits nextCursor.
| from required | string^\d{4}-\d{2}-\d{2}$ Inclusive lower bound on |
| to required | string^\d{4}-\d{2}-\d{2}$ Inclusive upper bound on |
| appointmentTypeId | string <uuid> Filter by appointment type UID. |
| assigneeId | string Filter by assigned user UID. |
| clinicId | string <uuid> Filter by clinic UID. |
| patientId | string <uuid> Filter by patient UID. |
| cursor | string Opaque pagination token from the previous response's |
| limit | integer [ 1 .. 200 ] Default: 100 Maximum number of results per page. Defaults to 100. Values above 200 are clamped to 200. Values below 1 return a 400 error. |
{- "success": true,
- "data": [
- {
- "uid": "d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "2a5f9a91-9c3b-4f78-9f5e-2f22d6a0e4c1",
- "clinic": "a5f1b2c3-d4e5-6789-abcd-ef0123456789",
- "location": "clinic",
- "assignee": {
- "uid": "c79f61b0-1dbb-4f2d-9a4e-e0b2f66b9a34",
- "fullName": "Jane Smith"
}, - "startDateTime": "2026-05-12T09:00:00.000Z",
- "endDateTime": "2026-05-12T09:45:00.000Z",
- "patient": {
- "uid": "8d1e3d17-60a9-4b92-bf0b-4c0a4a0d3a15",
- "fullName": "John Doe"
}, - "confirmed": true,
- "cancelled": false,
- "sendConfirmation": true,
- "created": {
- "at": "2026-04-01T10:00:00.000Z",
- "by": {
- "uid": "c79f61b0-1dbb-4f2d-9a4e-e0b2f66b9a34",
- "fullName": "Jane Smith"
}
}, - "updated": {
- "at": "2026-04-01T10:00:00.000Z",
- "by": {
- "uid": "c79f61b0-1dbb-4f2d-9a4e-e0b2f66b9a34",
- "fullName": "Jane Smith"
}
}
}
], - "nextCursor": "eyJzdGFydERhdGVUaW1lTXMiOjE3NDcwNDA0MDAwMDAsInVpZCI6ImQyOTBmMWVlLTZjNTQtNGIwMS05MGU2LWQ3MDE3NDhmMDg1MSJ9"
}Retrieves a single appointment by UID.
| uid required | string <uuid> The appointment UID. |
{- "success": true,
- "data": {
- "uid": "string",
- "type": "string",
- "clinic": "string",
- "location": "clinic",
- "assignee": {
- "uid": "string",
- "fullName": "string"
}, - "startDateTime": "2019-08-24T14:15:22Z",
- "endDateTime": "2019-08-24T14:15:22Z",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "additionalNote": "string",
- "outcome": "string",
- "confirmed": true,
- "cancelled": true,
- "sendConfirmation": true,
- "referral": "string",
- "referralSubType": "string",
- "externalId": "string",
- "arrived": true,
- "noShow": true,
- "rescheduled": true,
- "checkedOut": true,
- "noAnswer": true,
- "voicemailLeft": true,
- "customStatuses": [
- "string"
], - "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Updates an appointment. Any subset of fields may be supplied. Supplying any of appointmentTypeId, clinicId, assigneeId, date, start, end, or location reschedules the appointment and re-runs full availability validation (calendar working hours, enabled days, appointment-type blockouts, assignee eligibility, and schedule location matching); omitted reschedule fields retain their current value. Status fields (cancelled, confirmed, arrived, noShow, checkedOut, outcome, additionalNote) are applied directly. Times are interpreted in the organisation's configured timezone.
| uid required | string <uuid> The appointment UID. |
| appointmentTypeId | string <uuid> |
| clinicId | string <uuid> |
| assigneeId | string ID of the user the appointment is assigned to. |
| date | string^\d{4}-\d{2}-\d{2}$ Appointment date in YYYY-MM-DD format. |
| start | string^\d{2}:\d{2}$ Start time in 24-hour HH:mm format. |
| end | string^\d{2}:\d{2}$ End time in 24-hour HH:mm format. Must be after the effective start time. |
| location | string Enum: "clinic" "home" |
| additionalNote | string |
| referralId | string <uuid> |
| cancelled | boolean |
| confirmed | boolean |
| arrived | boolean |
| noShow | boolean |
| checkedOut | boolean |
| outcome | string Must be a valid outcome key configured on the appointment type. |
{- "date": "2026-05-14",
- "start": "10:00",
- "end": "10:45"
}{- "success": true,
- "data": {
- "appointmentUid": "4c80a58f-7cd5-456d-8585-d34c3c593d25"
}
}Permanently deletes an appointment. This also tears down any scheduled reminders and communication automations and regenerates online-booking availability for the slot.
| uid required | string <uuid> The appointment UID. |
{- "success": true,
- "data": {
- "appointmentUid": "4c80a58f-7cd5-456d-8585-d34c3c593d25"
}
}Creates a new appointment. The patient, appointment type, clinic, assignee, and (optional) referral must already exist.
| patientId required | string <uuid> |
| appointmentTypeId required | string <uuid> |
| clinicId required | string <uuid> |
| assigneeId required | string ID of the user the appointment is assigned to. |
| date required | string^\d{4}-\d{2}-\d{2}$ Appointment date in YYYY-MM-DD format. |
| start required | string^\d{2}:\d{2}$ Start time in 24-hour HH:mm format. |
| end required | string^\d{2}:\d{2}$ End time in 24-hour HH:mm format. Must be after |
| location required | string Enum: "clinic" "home" |
| additionalNote | string |
| referralId | string <uuid> |
| sendConfirmation | boolean Default: false Whether to send a confirmation email/SMS to the patient, subject to the appointment type's confirmation settings. |
{- "patientId": "8d1e3d17-60a9-4b92-bf0b-4c0a4a0d3a15",
- "appointmentTypeId": "2a5f9a91-9c3b-4f78-9f5e-2f22d6a0e4c1",
- "clinicId": "a5f1b2c3-d4e5-6789-abcd-ef0123456789",
- "assigneeId": "FVbzVLPvg1ONRXJgFuiktmNhsrb2",
- "date": "2026-05-12",
- "start": "09:00",
- "end": "09:45",
- "location": "clinic",
- "sendConfirmation": true
}{- "success": true,
- "data": {
- "appointmentUid": "4c80a58f-7cd5-456d-8585-d34c3c593d25"
}
}Retrieves a single invoice by UID.
| uid required | string <uuid> The invoice UID. |
{- "success": true,
- "data": {
- "uid": "string",
- "type": "invoice",
- "orderDate": "2019-08-24T14:15:22Z",
- "orderNumber": "string",
- "audiologist": "string",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "status": "string",
- "discount": 0,
- "vat": 0,
- "subtotal": 0,
- "total": 0,
- "lineItems": [
- { }
], - "dueDate": "2019-08-24T14:15:22Z",
- "billTo": "string",
- "billFrom": "string",
- "clinic": "string",
- "linkedAppointment": {
- "uid": "string",
- "typeUid": "string",
- "clinic": "string"
}, - "additionalInformation": "string",
- "externalId": "string",
- "xeroInvoiceId": "string",
- "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Returns a paginated list of the authenticated organisation's clinics, sorted by name ascending. Deleted clinics are excluded. Use this to discover the clinic identifiers required by the availability and appointment create endpoints.
Any valid, active API key for the organisation may call this endpoint — no additional permissions are required.
Pagination: keep requesting with the returned nextCursor until the response omits nextCursor.
| cursor | string Opaque pagination token from the previous response's |
| limit | integer [ 1 .. 200 ] Default: 100 Maximum number of results per page. Defaults to 100. Values above 200 are clamped to 200. Values below 1 return a 400 error. |
{- "success": true,
- "data": [
- {
- "uid": "a5f1b2c3-d4e5-6789-abcd-ef0123456789",
- "name": "Ashford Clinic",
- "address": {
- "formattedAddress": "1 High Street, Ashford, TN23 1AA, GB",
- "postcode": "TN23 1AA",
- "lat": 51.1465,
- "lng": 0.8676
}, - "phoneNumber": "01233 000000",
- "created": {
- "at": "2026-04-01T10:00:00.000Z",
- "by": {
- "uid": "c79f61b0-1dbb-4f2d-9a4e-e0b2f66b9a34",
- "fullName": "Jane Smith"
}
}, - "updated": {
- "at": "2026-04-01T10:00:00.000Z",
- "by": {
- "uid": "c79f61b0-1dbb-4f2d-9a4e-e0b2f66b9a34",
- "fullName": "Jane Smith"
}
}
}
], - "nextCursor": "eyJuYW1lIjoiQXNoZm9yZCBDbGluaWMiLCJ1aWQiOiJhNWYxYjJjMy1kNGU1LTY3ODktYWJjZC1lZjAxMjM0NTY3ODkifQ"
}Returns a paginated list of the authenticated organisation's appointment types, sorted by name ascending. Deleted types are excluded. Use this to discover the appointment type identifiers required by the availability and appointment create endpoints, and the duration that determines how long each appointment runs.
Requires an API key whose user holds appointment_types:browse, or organisation:owner.
This is a broader set than /online-booking/config returns. That endpoint lists only the types an organisation has enabled for online booking, whereas this lists every type the organisation uses, including internal ones. Both are accepted by /appointments/availability. If you are building a patient-facing booking journey, prefer the config endpoint so you only offer types the organisation intends patients to see.
A type listed here may return no availability at a given clinic. An appointment type can be disabled for a specific clinic, and a clinic accepts online bookings only on certain weekdays. This endpoint returns types without that clinic context — /online-booking/config reports the per-clinic rules if you need them.
Pagination: keep requesting with the returned nextCursor until the response omits nextCursor.
| cursor | string Opaque pagination token from the previous response's |
| limit | integer [ 1 .. 200 ] Default: 100 Maximum number of results per page. Defaults to 100. Values above 200 are clamped to 200. Values below 1 return a 400 error. |
{- "success": true,
- "data": [
- {
- "uid": "3f6c1d90-8b2a-4e77-9c31-5a8d2f0e1b44",
- "name": "Hearing Assessment",
- "duration": 60
}, - {
- "uid": "7b21e4a8-5c93-4a1f-8e6d-2f9c0b3d5e17",
- "name": "Wax Removal",
- "duration": 30
}
]
}Returns a paginated list of the authenticated organisation's bookable staff, sorted by name ascending. Use this to discover the clinician identifiers accepted as assigneeId by the availability endpoint and as consultantId when creating an online booking — for example to build a "choose your clinician" step.
Requires an API key whose user holds users:read, or organisation:owner.
Staff means clinicians who can hold an appointment, not every user. A user appears here only if they are assignable to at least one live appointment type, so administrators and other non-clinical staff are excluded. Removing someone from every appointment type removes them from this list.
Being listed here does not guarantee bookable slots. Availability also depends on the clinician's schedule and working locations, so a clinician listed here may return no slots at a particular clinic or on a particular date. Treat this as a directory for display, and /appointments/availability — whose response names the consultants free for each slot — as the authority on who can actually be booked.
Only an identifier and a name are returned. No contact details or other personal information about staff are exposed.
Pagination: keep requesting with the returned nextCursor until the response omits nextCursor.
| cursor | string Opaque pagination token from the previous response's |
| limit | integer [ 1 .. 200 ] Default: 100 Maximum number of results per page. Defaults to 100. Values above 200 are clamped to 200. Values below 1 return a 400 error. |
{- "success": true,
- "data": [
- {
- "uid": "c79f61b0-1dbb-4f2d-9a4e-e0b2f66b9a34",
- "name": "Jane Smith"
}, - {
- "uid": "f41d8c22-9b7e-4a35-b8d1-6e2a0c9f5713",
- "name": "Rahul Mehta"
}
]
}Build your own patient-facing booking experience. Retrieve the organisation's bookable configuration, then check availability and create bookings.
Returns everything needed to build a patient-facing booking journey for the authenticated organisation: the clinics and appointment types that are bookable online, the consultants who can be booked, the patient details the organisation requires, and the organisation's timezone.
Any valid, active API key for the organisation may call this endpoint — no additional permissions are required.
Use this rather than /clinics to build a booking UI. /clinics returns every clinic in the organisation, including those excluded from online booking. This endpoint returns only the bookable set, so the combinations it offers are the combinations /appointments/availability will accept. A clinic or appointment type absent here cannot be booked online.
This is a server-to-server endpoint. API keys must never be exposed in browser JavaScript, so call it from your own backend and proxy the result to your front-end.
Slot times returned by /appointments/availability are in the timezone given here — use it when rendering times to patients.
{- "success": true,
- "data": {
- "timezone": "Europe/London",
- "clinics": [
- {
- "uid": "a5f1b2c3-d4e5-6789-abcd-ef0123456789",
- "name": "Ashford Clinic",
- "address": "1 High Street, Ashford, TN23 1AA, GB",
- "latitude": 51.1465,
- "longitude": 0.8676,
- "enabledDays": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "maximumAdvanceBookingWeeks": 12,
- "disabledAppointmentTypeUids": [ ]
}
], - "appointmentTypes": [
- {
- "uid": "3f6c1d90-8b2a-4e77-9c31-5a8d2f0e1b44",
- "name": "Hearing Assessment",
- "duration": 60,
- "requiresPayment": false,
- "description": "A full assessment of your hearing with one of our audiologists.",
- "price": 50,
- "currency": "GBP"
}, - {
- "uid": "7b21e4a8-5c93-4a1f-8e6d-2f9c0b3d5e17",
- "name": "Wax Removal",
- "duration": 30,
- "requiresPayment": true,
- "price": 60,
- "currency": "GBP"
}
], - "consultants": [
- {
- "uid": "c79f61b0-1dbb-4f2d-9a4e-e0b2f66b9a34",
- "name": "Jane Smith"
}
], - "formFields": {
- "fields": [
- {
- "key": "fullName",
- "required": true
}, - {
- "key": "phoneNumber",
- "required": true
}, - {
- "key": "emailAddress",
- "required": false
}, - {
- "key": "dob",
- "required": true
}, - {
- "key": "address",
- "required": true
}
], - "patientsMinimumAge": 18,
- "referralOptions": [ ]
}
}
}Creates a patient appointment in a single call. The booker is matched against existing patients using the organisation's own matching rules — name, phone number, email, date of birth and address — and is attached to the match if one is found, or created as a new patient if not. The patient and the appointment are written together, so a rejected request never leaves a partial record behind.
Requires an API key whose user holds both appointments:create and patients:create, or organisation:owner.
Call /online-booking/config first. It tells you which clinics, appointment types and consultants are bookable, which patient details this organisation requires, and which appointment types require payment and therefore cannot be booked here. Then call /appointments/availability to get a date and slot, and pass one of that slot's availableConsultants as consultantId.
Appointment length is taken from the appointment type, not from the request.
Slot availability is not re-checked at write time. If the slot was taken between your availability call and this one, the booking is still created. Fetch availability immediately before booking, and note that a retried request creates a second booking — there is no idempotency key.
| clinicId required | string <uuid> Must be a clinic returned by |
| appointmentTypeId required | string <uuid> Must be an appointment type returned by |
| consultantId required | string Must be assignable to the appointment type. Use one of the slot's |
| date required | string^\d{4}-\d{2}-\d{2}$ Slot date in YYYY-MM-DD, in the organisation's timezone. |
| slot required | string^\d{2}:\d{2}$ Slot start time in HH:mm, in the organisation's timezone. |
| fullName required | string non-empty |
| phoneNumber required | string non-empty |
| emailAddress | string <email> |
| dob | string^\d{4}-\d{2}-\d{2}$ Date of birth in YYYY-MM-DD. Rejected if the organisation sets a minimum patient age and the booker is younger. |
object | |
| gender | string |
| gpDetails | string |
| referral | string <uuid> Must be one of the |
| additionalNote | string |
| gclid | string Google click identifier, stored against the patient for attribution. |
| sendConfirmation | boolean Whether HearLink sends the patient its own booking confirmation. Defaults to the appointment type's configured behaviour — note this differs from |
{- "clinicId": "a5f1b2c3-d4e5-6789-abcd-ef0123456789",
- "appointmentTypeId": "3f6c1d90-8b2a-4e77-9c31-5a8d2f0e1b44",
- "consultantId": "c79f61b0-1dbb-4f2d-9a4e-e0b2f66b9a34",
- "date": "2026-09-14",
- "slot": "10:30",
- "fullName": "Alex Taylor",
- "phoneNumber": "07700 900000"
}{- "success": true,
- "data": {
- "appointment": {
- "uid": "9d3a7c21-6f48-4b0e-8a52-1c7e9b4d0f36"
}, - "patient": {
- "uid": "4e8b1a05-2c93-4d17-9f60-3a5c8e2b7d11",
- "created": false
}
}
}Webhooks send real-time HTTP POST notifications to a URL you configure whenever events occur in HearLink.
Every delivery wraps entity data in a standard envelope:
{
"id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
"type": "patient.created",
"createdAt": "2026-04-10T14:30:00.000Z",
"data": { ... }
}
| Header | Description |
|---|---|
X-HearLink-Signature |
t=<unix>,v1=<hmac-sha256> — verify authenticity |
X-HearLink-Event |
The event type, e.g. patient.created |
X-HearLink-Delivery |
Unique ID for this delivery attempt |
Compute HMAC-SHA256(secret, "{timestamp}.{raw_body}") and compare to the v1 value.
Node.js example:
const crypto = require('crypto');
function verifySignature(rawBody, secret, signatureHeader) {
const [tPart, v1Part] = signatureHeader.split(',');
const timestamp = tPart.replace('t=', '');
const expected = v1Part.replace('v1=', '');
const computed = crypto
.createHmac('sha256', secret)
.update(`${timestamp}.${rawBody}`)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(computed),
Buffer.from(expected),
);
}
Failed deliveries (non-2xx or timeout after 30s) are retried up to 5 times with exponential back-off. After 50 consecutive failures across any events, the webhook is automatically disabled.
Fired when a new patient record is created.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "fullName": "string",
- "title": "string",
- "phoneNumber": "string",
- "secondaryPhoneNumber": "string",
- "dob": "2019-08-24T14:15:22Z",
- "gender": "string",
- "maritalStatus": "string",
- "referral": "string",
- "referralSubType": "string",
- "primaryClinic": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "postcode": "string",
- "country": "string"
}, - "status": {
- "status": "string",
- "subStatus": "string",
- "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}, - "contactPreference": "string",
- "contactPermissions": [
- "string"
], - "emergencyContactName": "string",
- "emergencyContactNumber": "string",
- "gpDetails": "string",
- "virtualServicingEnabled": true,
- "lastTestDate": "2019-08-24T14:15:22Z",
- "lastFittingDate": "2019-08-24T14:15:22Z",
- "externalSystemId": "string",
- "state": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}, - "customFields": [
- {
- "key": "string",
- "value": "string",
- "values": [
- "string"
], - "type": "string"
}
], - "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when a patient record is modified.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "fullName": "string",
- "title": "string",
- "phoneNumber": "string",
- "secondaryPhoneNumber": "string",
- "dob": "2019-08-24T14:15:22Z",
- "gender": "string",
- "maritalStatus": "string",
- "referral": "string",
- "referralSubType": "string",
- "primaryClinic": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "postcode": "string",
- "country": "string"
}, - "status": {
- "status": "string",
- "subStatus": "string",
- "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}, - "contactPreference": "string",
- "contactPermissions": [
- "string"
], - "emergencyContactName": "string",
- "emergencyContactNumber": "string",
- "gpDetails": "string",
- "virtualServicingEnabled": true,
- "lastTestDate": "2019-08-24T14:15:22Z",
- "lastFittingDate": "2019-08-24T14:15:22Z",
- "externalSystemId": "string",
- "state": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}, - "customFields": [
- {
- "key": "string",
- "value": "string",
- "values": [
- "string"
], - "type": "string"
}
], - "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when a patient record is deleted.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "fullName": "string",
- "title": "string",
- "phoneNumber": "string",
- "secondaryPhoneNumber": "string",
- "dob": "2019-08-24T14:15:22Z",
- "gender": "string",
- "maritalStatus": "string",
- "referral": "string",
- "referralSubType": "string",
- "primaryClinic": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "postcode": "string",
- "country": "string"
}, - "status": {
- "status": "string",
- "subStatus": "string",
- "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}, - "contactPreference": "string",
- "contactPermissions": [
- "string"
], - "emergencyContactName": "string",
- "emergencyContactNumber": "string",
- "gpDetails": "string",
- "virtualServicingEnabled": true,
- "lastTestDate": "2019-08-24T14:15:22Z",
- "lastFittingDate": "2019-08-24T14:15:22Z",
- "externalSystemId": "string",
- "state": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}, - "customFields": [
- {
- "key": "string",
- "value": "string",
- "values": [
- "string"
], - "type": "string"
}
], - "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when a new appointment is created.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "type": "string",
- "clinic": "string",
- "location": "clinic",
- "assignee": {
- "uid": "string",
- "fullName": "string"
}, - "startDateTime": "2019-08-24T14:15:22Z",
- "endDateTime": "2019-08-24T14:15:22Z",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "additionalNote": "string",
- "outcome": "string",
- "confirmed": true,
- "cancelled": true,
- "sendConfirmation": true,
- "referral": "string",
- "referralSubType": "string",
- "externalId": "string",
- "arrived": true,
- "noShow": true,
- "rescheduled": true,
- "checkedOut": true,
- "noAnswer": true,
- "voicemailLeft": true,
- "customStatuses": [
- "string"
], - "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when an appointment is modified (including status changes like confirmed, cancelled, arrived, no-show).
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "type": "string",
- "clinic": "string",
- "location": "clinic",
- "assignee": {
- "uid": "string",
- "fullName": "string"
}, - "startDateTime": "2019-08-24T14:15:22Z",
- "endDateTime": "2019-08-24T14:15:22Z",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "additionalNote": "string",
- "outcome": "string",
- "confirmed": true,
- "cancelled": true,
- "sendConfirmation": true,
- "referral": "string",
- "referralSubType": "string",
- "externalId": "string",
- "arrived": true,
- "noShow": true,
- "rescheduled": true,
- "checkedOut": true,
- "noAnswer": true,
- "voicemailLeft": true,
- "customStatuses": [
- "string"
], - "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when an appointment is deleted.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "type": "string",
- "clinic": "string",
- "location": "clinic",
- "assignee": {
- "uid": "string",
- "fullName": "string"
}, - "startDateTime": "2019-08-24T14:15:22Z",
- "endDateTime": "2019-08-24T14:15:22Z",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "additionalNote": "string",
- "outcome": "string",
- "confirmed": true,
- "cancelled": true,
- "sendConfirmation": true,
- "referral": "string",
- "referralSubType": "string",
- "externalId": "string",
- "arrived": true,
- "noShow": true,
- "rescheduled": true,
- "checkedOut": true,
- "noAnswer": true,
- "voicemailLeft": true,
- "customStatuses": [
- "string"
], - "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when a new invoice is created.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "type": "invoice",
- "orderDate": "2019-08-24T14:15:22Z",
- "orderNumber": "string",
- "audiologist": "string",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "status": "string",
- "discount": 0,
- "vat": 0,
- "subtotal": 0,
- "total": 0,
- "lineItems": [
- { }
], - "dueDate": "2019-08-24T14:15:22Z",
- "billTo": "string",
- "billFrom": "string",
- "clinic": "string",
- "linkedAppointment": {
- "uid": "string",
- "typeUid": "string",
- "clinic": "string"
}, - "additionalInformation": "string",
- "externalId": "string",
- "xeroInvoiceId": "string",
- "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when an invoice is modified.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "type": "invoice",
- "orderDate": "2019-08-24T14:15:22Z",
- "orderNumber": "string",
- "audiologist": "string",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "status": "string",
- "discount": 0,
- "vat": 0,
- "subtotal": 0,
- "total": 0,
- "lineItems": [
- { }
], - "dueDate": "2019-08-24T14:15:22Z",
- "billTo": "string",
- "billFrom": "string",
- "clinic": "string",
- "linkedAppointment": {
- "uid": "string",
- "typeUid": "string",
- "clinic": "string"
}, - "additionalInformation": "string",
- "externalId": "string",
- "xeroInvoiceId": "string",
- "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when an invoice is deleted.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "type": "invoice",
- "orderDate": "2019-08-24T14:15:22Z",
- "orderNumber": "string",
- "audiologist": "string",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "status": "string",
- "discount": 0,
- "vat": 0,
- "subtotal": 0,
- "total": 0,
- "lineItems": [
- { }
], - "dueDate": "2019-08-24T14:15:22Z",
- "billTo": "string",
- "billFrom": "string",
- "clinic": "string",
- "linkedAppointment": {
- "uid": "string",
- "typeUid": "string",
- "clinic": "string"
}, - "additionalInformation": "string",
- "externalId": "string",
- "xeroInvoiceId": "string",
- "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when a new transaction (payment or refund) is created.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "transactionType": "string",
- "amount": 0,
- "method": "string",
- "date": "2019-08-24T14:15:22Z",
- "orderUid": "string",
- "externalId": "string",
- "transactionNumber": "string",
- "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when a transaction is modified.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "transactionType": "string",
- "amount": 0,
- "method": "string",
- "date": "2019-08-24T14:15:22Z",
- "orderUid": "string",
- "externalId": "string",
- "transactionNumber": "string",
- "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when a transaction is deleted.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "transactionType": "string",
- "amount": 0,
- "method": "string",
- "date": "2019-08-24T14:15:22Z",
- "orderUid": "string",
- "externalId": "string",
- "transactionNumber": "string",
- "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when a new credit note is created.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "creditNoteNumber": "string",
- "date": "2019-08-24T14:15:22Z",
- "orderUid": "string",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "discount": 0,
- "vat": 0,
- "subtotal": 0,
- "total": 0,
- "lineItems": [
- {
- "type": "string",
- "description": "string",
- "uid": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discount": 0,
- "total": 0,
- "vat": 0
}
], - "externalId": "string",
- "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when a credit note is modified.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "creditNoteNumber": "string",
- "date": "2019-08-24T14:15:22Z",
- "orderUid": "string",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "discount": 0,
- "vat": 0,
- "subtotal": 0,
- "total": 0,
- "lineItems": [
- {
- "type": "string",
- "description": "string",
- "uid": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discount": 0,
- "total": 0,
- "vat": 0
}
], - "externalId": "string",
- "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when a credit note is deleted.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "creditNoteNumber": "string",
- "date": "2019-08-24T14:15:22Z",
- "orderUid": "string",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "discount": 0,
- "vat": 0,
- "subtotal": 0,
- "total": 0,
- "lineItems": [
- {
- "type": "string",
- "description": "string",
- "uid": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discount": 0,
- "total": 0,
- "vat": 0
}
], - "externalId": "string",
- "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when a new hearing test is recorded.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "clinic": "string",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "testDate": "2019-08-24T14:15:22Z",
- "audiologist": "string",
- "durationOfLoss": "string",
- "occupation": "string",
- "familyDeafness": "string",
- "audiometer": "string",
- "notes": "string",
- "audiogram": { },
- "leftEarHealth": { },
- "rightEarHealth": { },
- "hearingLossCauses": { },
- "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when a hearing test is modified.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "clinic": "string",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "testDate": "2019-08-24T14:15:22Z",
- "audiologist": "string",
- "durationOfLoss": "string",
- "occupation": "string",
- "familyDeafness": "string",
- "audiometer": "string",
- "notes": "string",
- "audiogram": { },
- "leftEarHealth": { },
- "rightEarHealth": { },
- "hearingLossCauses": { },
- "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Fired when a hearing test is deleted.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "uid": "string",
- "clinic": "string",
- "patient": {
- "uid": "string",
- "fullName": "string",
- "tracking": {
- "provider": "string",
- "ids": {
- "gclid": "123abc",
- "campaignId": "summer2025"
}, - "utm_term": "string",
- "utm_campaign": "string",
- "utm_content": "string",
- "utm_medium": "string",
- "utm_source": "string"
}
}, - "testDate": "2019-08-24T14:15:22Z",
- "audiologist": "string",
- "durationOfLoss": "string",
- "occupation": "string",
- "familyDeafness": "string",
- "audiometer": "string",
- "notes": "string",
- "audiogram": { },
- "leftEarHealth": { },
- "rightEarHealth": { },
- "hearingLossCauses": { },
- "created": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}, - "updated": {
- "at": "2019-08-24T14:15:22Z",
- "by": {
- "uid": "string",
- "fullName": "string"
}
}
}
}Sent when a user clicks the "Test" button in the portal. Not subscribable — always delivered to the webhook being tested.
| id required | string Unique event ID prefixed with |
| type required | string The event type. |
| createdAt required | string <date-time> ISO 8601 timestamp of when the event was created. |
required | object The entity payload. Shape varies by event type. |
{- "id": "evt_d290f1ee-6c54-4b01-90e6-d701748f0851",
- "type": "patient.created",
- "createdAt": "2019-08-24T14:15:22Z",
- "data": {
- "message": "This is a test webhook event from HearLink.",
- "triggeredBy": "string"
}
}