Getting started
What you need
- An iPhone on iOS 17 or later, with the app installed.
- An HTTP endpoint the phone can reach that answers
2xx. A receiver on your own network can be plain HTTP at an IP address.
1. Run a receiver
The quickest correct one is an example receiver:
one file, no dependencies, samples into SQLite. With Node 22.13 or later, from
examples/receiver-node, run HOST=0.0.0.0 node server.mjs; with Python 3.11 or later,
from examples/receiver-python, run HOST=0.0.0.0 python3 receiver.py. Both listen on
port 8080. HOST=0.0.0.0 makes them reachable from the phone rather than only from the
computer they run on.
2. Point the app at it
In the app, open Destination and enter:
- Address — the full address of your receiver: scheme (
httporhttps), host, port and path. The app sends to it exactly, and appends no path and no query. - Method —
POSTis the usual choice. - Headers — any your receiver needs, plus a credential in the header name you choose.
The example receivers check
Authorization: Bearer <token>when started withRECEIVER_TOKENset. - Format — JSON or CSV. Same samples either way; see JSON payload and CSV.
Then tap Test connection. The app sends a probe — the same request with no samples in
it — over the same method, headers and credential a real export uses. The example receivers
answer 200 and record nothing.
3. Choose what leaves the phone
Open Metrics and turn on the groups you want: activity, heart, body, sleep, vitals, workouts. Health asks for read access per group, when you turn that group on. Only enabled groups are read.
4. Export
Tap Export Now and pick a time range. If your receiver is on your local network, the first export is where the app explains why it needs to reach devices on your network and iOS asks for that permission; answer it once and it is remembered.
Your receiver now holds the samples. The example receivers report counts at GET /stats.
Next
- Run exports without tapping: arm the scheduled export in the app, or build a Shortcuts automation — see Shortcuts. Read Limits first: the schedule is a target, not a promise.
- Before you write your own receiver, read Delivery semantics. The one
rule that matters most is to upsert on
uuid.