Skip to content

Your Apple Health data, delivered where you choose

Health Relay reads Apple Health on your iPhone and sends each day to destinations you choose, such as your own server or a self-hosted dashboard. Every changed day is re-sent whole, deletions included, in one open, documented schema.
The Status tab: last sync, a destination that is up to date, and the sync and re-send actions
Every destination’s state at a glance
A destination's settings: name, URL, bearer token, and a passing connection test
Any HTTP endpoint, tested in one tap
A destination's delivery log: each batch of days with the receiver's answer
Each delivery with the receiver’s answer

Apple Health has no cloud API. The only way your data leaves the phone is through an app on the phone, and the existing options pre-aggregate it, change their payload between versions, or sync when they feel like it. Health Relay does one job and does it exactly.

Exact, incremental sync

Bookmarks on every Health type find exactly the days that changed. Each one is sent whole, every type and source, so your receiver ends up with what the phone has, edits and deletions included.

One open schema

A single documented JSON format in Apple Health’s own terms, versioned by name. If you read export.xml today, you already know it. Read the schema.

Destinations you choose

Add any HTTP endpoint with an optional bearer token and headers: your server, a home lab dashboard, a webhook. Every destination gets every day; one failing never holds up another.

Private by design

No account, no backend, no analytics. Data goes only to your destinations, tokens live in the Keychain, and nothing is read that the schema doesn’t name.

Reliable in the background

Wakes when Health records something, catches up every morning, keeps unsent batches on disk and retries with backoff. It tells you plainly when iOS is in the way.

Per-source detail

Daily statistics per source (Watch, iPhone, scale, apps) plus the raw samples where they matter: sleep stages, blood pressure, workouts with routes, ECG traces.

1. Health changesA watch sync, a weigh-in, last night’s sleep.
2. Days markedThe days that gained samples, plus today and yesterday.
3. Read wholeEvery type and source for each of those days.
4. DeliveredJSON batches to each destination, kept until accepted.

Write a receiver in an afternoon: accept a POST, check a token, store the days, answer 200. Writing a receiver has the rules, and the repository includes a reference receiver and canonical fixtures to test against.

Every destination keeps a log of its deliveries with the receiver’s answer, and Data by type shows which Health types had data in the last 30 days, so a permission switched off in Settings is easy to spot.

Data by type: each Health type with when it last had data
Which types are arriving, at a glance