Manage practice group settings, access tokens, and configuration. Use the access token endpoint to generate short-lived JWTs for Hero Elements.
API Reference
//
Get an Appointment
Hero Health Public API (1.0.0)
The Hero Health Public API enables healthtech partners to integrate with NHS GP practices connected to EMIS Web and TPP SystmOne.
- Patient messaging — Send SMS, email, and NHS App messages on behalf of a practice
- Appointment booking — List available slots, create reservations, and confirm bookings
- Patient management — Register and look up patients via PDS (Personal Demographics Service)
- Webhooks — Subscribe to events such as appointment confirmations and write-to-record outcomes
- Booking & form links — Generate sharable links for patient self-service flows
- Elements — Generate access tokens for embedding pre-built Hero UI components
All endpoints require an x-api-key and x-practice-group-id header. API keys are scoped to specific functionality (messaging, booking, booking links). Contact Hero support to request your key.
Download OpenAPI description
Languages
Servers
Mock server
https://developer.herohealth.net/_mock/apis/public-api/openapi/
Staging
https://api.staging.htech.app/
Production
https://api.herohealth.net/
- Mock serverhttps://developer.herohealth.net/_mock/apis/public-api/openapi/v1/appointments/{id}
- Staginghttps://api.staging.htech.app/v1/appointments/{id}
- Productionhttps://api.herohealth.net/v1/appointments/{id}
- curl
- NodeJS
- Ruby
curl -i -X GET \
'https://developer.herohealth.net/_mock/apis/public-api/openapi/v1/appointments/{id}' \
-H 'x-api-key: YOUR_API_KEY_HERE' \
-H 'x-practice-group-id: YOUR_API_KEY_HERE'Response
application/json
{ "id": "string", "patient_id": "string", "practitioner_id": "string", "location_id": "string", "appointment_type_id": "string", "duration": 1, "start_time": "2019-08-24T14:15:22Z", "video": false, "in_person": false, "telephone": false, "video_url": "string", "link_id": "string", "reserved_until": "2019-08-24T14:15:22Z", "booking_confirmed_at": "2019-08-24T14:15:22Z", "can_be_cancelled": false, "can_be_rescheduled": false, "cancellation_policy_hours": 0, "suppress_mail": false, "reason": "string", "appointment_template_name": "string", "location_name": "string", "appointment_source": "string", "cancelled_at": "2019-08-24T14:15:22Z", "patient": { "title": "Baron", "first_name": "string", "last_name": "string" }, "practitioner": { "title": "Baron", "first_name": "string", "last_name": "string" } }
- Mock serverhttps://developer.herohealth.net/_mock/apis/public-api/openapi/v1/appointments/{id}
- Staginghttps://api.staging.htech.app/v1/appointments/{id}
- Productionhttps://api.herohealth.net/v1/appointments/{id}
- curl
- NodeJS
- Ruby
curl -i -X PUT \
'https://developer.herohealth.net/_mock/apis/public-api/openapi/v1/appointments/{id}' \
-H 'Content-Type: application/json' \
-H 'x-api-key: YOUR_API_KEY_HERE' \
-H 'x-practice-group-id: YOUR_API_KEY_HERE' \
-d '{
"practitioner_id": "15",
"duration": 15,
"start_time": "2026-03-15T09:30:00Z",
"suppress_mail": false,
"suppress_availability_check": false
}'Request
Create an appointment reservation for a patient. The appointment is held in a reserved state until confirmed via the Book Appointment endpoint.
Flow: List Slots → Create Appointment (reserve) → Book Appointment (confirm).
If the reservation is not confirmed within the hold period, it will be automatically released.
Security
apiKeyAuth and practiceGroupId
- Mock serverhttps://developer.herohealth.net/_mock/apis/public-api/openapi/v1/appointments
- Staginghttps://api.staging.htech.app/v1/appointments
- Productionhttps://api.herohealth.net/v1/appointments
- curl
- NodeJS
- Ruby
curl -i -X POST \
https://developer.herohealth.net/_mock/apis/public-api/openapi/v1/appointments \
-H 'Content-Type: application/json' \
-H 'x-api-key: YOUR_API_KEY_HERE' \
-H 'x-practice-group-id: YOUR_API_KEY_HERE' \
-d '{
"appointment_type_id": "42",
"location_id": "7",
"practitioner_id": "15",
"duration": 15,
"start_time": "2026-03-15T09:30:00Z",
"patient_id": "1234",
"billpayer_id": "5678",
"reason": "Annual health check",
"suppress_mail": false,
"suppress_availability_check": false
}'Response
application/json
{ "id": "string", "reserved_until": "2019-08-24T14:15:22Z" }