Manage practice group settings, access tokens, and configuration. Use the access token endpoint to generate short-lived JWTs for Hero Elements.
API Reference
//
Connect a Patient to EHR
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/patients/{id}/ehr/candidates
- Staginghttps://api.staging.htech.app/v1/patients/{id}/ehr/candidates
- Productionhttps://api.herohealth.net/v1/patients/{id}/ehr/candidates
- curl
- NodeJS
- Ruby
curl -i -X GET \
'https://developer.herohealth.net/_mock/apis/public-api/openapi/v1/patients/{id}/ehr/candidates' \
-H 'x-api-key: YOUR_API_KEY_HERE' \
-H 'x-practice-group-id: YOUR_API_KEY_HERE'Response
application/json
{ "data": [ { … } ], "count": 0 }
- Mock serverhttps://developer.herohealth.net/_mock/apis/public-api/openapi/v1/patients/{id}/ehr/connect
- Staginghttps://api.staging.htech.app/v1/patients/{id}/ehr/connect
- Productionhttps://api.herohealth.net/v1/patients/{id}/ehr/connect
- curl
- NodeJS
- Ruby
curl -i -X POST \
'https://developer.herohealth.net/_mock/apis/public-api/openapi/v1/patients/{id}/ehr/connect' \
-H 'Content-Type: application/json' \
-H 'x-api-key: YOUR_API_KEY_HERE' \
-H 'x-practice-group-id: YOUR_API_KEY_HERE' \
-d '{
"ehr_partner_id": "string"
}'- Mock serverhttps://developer.herohealth.net/_mock/apis/public-api/openapi/v1/patients/{id}/merge/preview
- Staginghttps://api.staging.htech.app/v1/patients/{id}/merge/preview
- Productionhttps://api.herohealth.net/v1/patients/{id}/merge/preview
- curl
- NodeJS
- Ruby
curl -i -X POST \
'https://developer.herohealth.net/_mock/apis/public-api/openapi/v1/patients/{id}/merge/preview' \
-H 'Content-Type: application/json' \
-H 'x-api-key: YOUR_API_KEY_HERE' \
-H 'x-practice-group-id: YOUR_API_KEY_HERE' \
-d '{
"patient_id": "string"
}'Ok
Enum"Baron""Baroness""Brigadier""Count""Colonel""Countess""Captain""Dame""The Dowager Viscountess""Dr"
Enum"nhs_number""gha_number""ehr_partner_id""hero_id""hero_uid"
Enum"Baron""Baroness""Brigadier""Count""Colonel""Countess""Captain""Dame""The Dowager Viscountess""Dr"
Enum"nhs_number""gha_number""ehr_partner_id""hero_id""hero_uid"
Enum"Baron""Baroness""Brigadier""Count""Colonel""Countess""Captain""Dame""The Dowager Viscountess""Dr"
Enum"nhs_number""gha_number""ehr_partner_id""hero_id""hero_uid"
Response
application/json
{ "main_patient": { "id": "string", "uid": "string", "emis_id": "string", "ehr_partner_id": "string", "dob": "2019-08-24T14:15:22Z", "deceased_at": "2019-08-24T14:15:22Z", "title": "Baron", "first_name": "string", "last_name": "string", "sex": "Not known", "nhs_number": "string", "email": "string", "emails": [ … ], "mobile": "string", "last_sync_at": "2019-08-24T14:15:22Z", "address_line_1": "string", "address_line_2": "string", "address_line_3": "string", "country": "string", "postcode": "string", "town": "string", "county": "string", "notes": "string", "verification_credentials": [ … ], "data_source": "hero", "restricted": false, "sex_changed_at": "2019-08-24T14:15:22Z", "status": "archived", "ods_code": "string", "identifiers": [ … ], "ehr_registered": true }, "incoming_patient": { "id": "string", "uid": "string", "emis_id": "string", "ehr_partner_id": "string", "dob": "2019-08-24T14:15:22Z", "deceased_at": "2019-08-24T14:15:22Z", "title": "Baron", "first_name": "string", "last_name": "string", "sex": "Not known", "nhs_number": "string", "email": "string", "emails": [ … ], "mobile": "string", "last_sync_at": "2019-08-24T14:15:22Z", "address_line_1": "string", "address_line_2": "string", "address_line_3": "string", "country": "string", "postcode": "string", "town": "string", "county": "string", "notes": "string", "verification_credentials": [ … ], "data_source": "hero", "restricted": false, "sex_changed_at": "2019-08-24T14:15:22Z", "status": "archived", "ods_code": "string", "identifiers": [ … ], "ehr_registered": true }, "result_patient": { "id": "string", "uid": "string", "emis_id": "string", "ehr_partner_id": "string", "dob": "2019-08-24T14:15:22Z", "deceased_at": "2019-08-24T14:15:22Z", "title": "Baron", "first_name": "string", "last_name": "string", "sex": "Not known", "nhs_number": "string", "email": "string", "emails": [ … ], "mobile": "string", "last_sync_at": "2019-08-24T14:15:22Z", "address_line_1": "string", "address_line_2": "string", "address_line_3": "string", "country": "string", "postcode": "string", "town": "string", "county": "string", "notes": "string", "verification_credentials": [ … ], "data_source": "hero", "restricted": false, "sex_changed_at": "2019-08-24T14:15:22Z", "status": "archived", "ods_code": "string", "identifiers": [ … ], "ehr_registered": true }, "merge_token": "string" }