Entities¶
One device per donor account, named NHS Give Blood — not your name, because device names surface in logs, diagnostics and screenshots.
Entity IDs below assume a single account. With more than one, Home Assistant appends _2 and so on.
Calendar¶
calendar.nhs_give_blood_appointments¶
Your booked donation appointments as calendar events.
| Field | Source |
|---|---|
| Summary | Give blood — {procedure} |
| Start | Appointment date and time |
| End | Start plus an estimated duration |
| Location | Venue name and full address |
| Description | Procedure, venue notes (parking, step-free access), session ID |
The API gives a start time but no duration, so it is estimated per procedure:
| Procedure | Estimated duration |
|---|---|
| Whole blood | 60 minutes |
| Plasma | 90 minutes |
| Platelets | 120 minutes |
These match the app's own guidance so the calendar block roughly matches how long you will actually be
there. The entity reads on while an appointment is in progress and off otherwise.
Only future appointments
The API exposes upcoming appointments only, so querying a past date range legitimately returns
nothing. Past donations are on sensor.nhs_give_blood_last_donation instead.
Sensors¶
Appointments¶
| Entity | Type | Notes |
|---|---|---|
sensor.nhs_give_blood_next_appointment |
timestamp | Attributes carry venue, address, coordinates, session ID, procedure, and the full upcoming list |
sensor.nhs_give_blood_next_appointment_venue |
text | Venue name including sub-location |
sensor.nhs_give_blood_upcoming_appointments |
count |
next_appointment attributes:
venue: Testville, Example Donor Centre (Main Hall)
venue_id: TSTV1
venue_address: 1 Example Street, Testville, ZZ99 3WZ
postcode: ZZ99 3WZ
venue_latitude: 51.5
venue_longitude: -0.12
procedure: Platelet
session_id: CS0000
appointments:
- starts_at: "2026-10-08T17:30:00+01:00"
procedure: Platelet
venue: Testville, Example Donor Centre (Main Hall)
session_id: CS0000
Eligibility¶
| Entity | Type | Meaning |
|---|---|---|
sensor.nhs_give_blood_eligible_from |
timestamp | When you can next donate — the clinical deferral date |
sensor.nhs_give_blood_can_book_from |
timestamp | When you can next book |
These are different dates
can_book_from also accounts for booking windows and existing appointments, and routinely differs
from eligible_from by weeks. Conflating them is the easiest mistake to make with this API.
Credits and awards¶
| Entity | Type | Notes |
|---|---|---|
sensor.nhs_give_blood_donation_credits |
total increasing | Lifetime credits. Authoritative. |
sensor.nhs_give_blood_award_level |
text | Bronze, Silver, Gold, Emerald, Ruby |
sensor.nhs_give_blood_next_award |
text | Threshold in the credits_required attribute |
sensor.nhs_give_blood_credits_to_next_award |
count | Floored at zero |
sensor.nhs_give_blood_total_awards |
count |
History¶
| Entity | Type | Notes |
|---|---|---|
sensor.nhs_give_blood_last_donation |
timestamp | |
sensor.nhs_give_blood_donations_recorded |
count | Diagnostic. A lower bound — see below |
donations_recorded is not your lifetime total
The API truncates long histories and flags it as history_truncated: true in the attributes. Use
donation_credits for your real total.
Attributes include the most recent 20 donations with date, venue and the raw one-letter outcome code. NHSBT publishes no mapping for those codes, so they are passed through verbatim rather than guessed at.
Other¶
| Entity | Type | Notes |
|---|---|---|
sensor.nhs_give_blood_blood_group |
text | |
sensor.nhs_give_blood_donor_messages |
count | Filtered to your blood group; bodies in attributes |
sensor.nhs_give_blood_donation_type |
text | Diagnostic |
sensor.nhs_give_blood_registered_since |
timestamp | Diagnostic |
sensor.nhs_give_blood_nearest_plasma_venue |
text | Disabled by default |
sensor.nhs_give_blood_nearest_plasma_venue_distance |
distance | Disabled by default |
Distance units
The API reports distances without a unit; the app renders them as miles, so that is what the integration declares. Home Assistant then converts to your configured unit system, so a metric instance will show kilometres.
Binary sensors¶
| Entity | Device class | Notes |
|---|---|---|
binary_sensor.nhs_give_blood_appointment_booked |
— | |
binary_sensor.nhs_give_blood_eligible_to_donate |
— | Compared by date, so it turns on at the start of the eligible day |
binary_sensor.nhs_give_blood_booking_system_problem |
problem | Diagnostic. unknown when the check itself failed |
binary_sensor.nhs_give_blood_data_degraded |
problem | Diagnostic, disabled by default |
binary_sensor.nhs_give_blood_platelet_plus |
— | Diagnostic, disabled by default |
binary_sensor.nhs_give_blood_email_change_pending |
— | Diagnostic, disabled by default |
booking_system_problem reports unknown rather than off when the failover check itself failed —
reporting "no problem" from a failed check would be a false all-clear.
data_degraded names the failed endpoints in its degraded_endpoints attribute, which is the fastest
way to diagnose "some sensors are unknown but others work".
Enabling disabled entities¶
Settings → Devices & services → NHS Give Blood → entities, pick the entity, then Settings → enable.
They are off by default because they are either niche (plasma venue) or only useful when something has
gone wrong (data_degraded).