A small, predictable REST API over your Apple Health data. JSON in, JSON out, Bearer auth.
Install the HealthAPI app for iPhone, authorize Apple Health, and open Connect AI to copy your personal key. Then call the API with your key as a Bearer token. The base URL is:
Every example below is a complete request — drop in your key and run it.
All endpoints require your API key in the Authorization header. There are no other credentials — the key is the identity.
Keys are issued by the iPhone app and can be rotated from the Console or via /account/regenerate-key. A missing or invalid key returns 401.
Returns your plan and how much of your daily quota you've used. This call is cheap and reflects live consumption.
Steps, average heart rate, and workouts for a single local day.
| Param | Type | Notes |
|---|---|---|
date | string | YYYY-MM-DD. Defaults to today in your timezone. |
tz | string | IANA zone, e.g. America/New_York. Defaults to your account timezone. |
Step totals are aggregated across sources, so overlapping iPhone and Apple Watch samples aren't counted twice — the number matches Apple Health.
Per-day statistics for one metric over a window.
| Param | Type | Notes |
|---|---|---|
type | string | Required. e.g. stepCount, heartRate, activeEnergyBurned. |
days | integer | 1–365. Defaults to 7. |
tz | string | IANA zone. Optional. |
For point-in-time metrics (heart rate, HRV, SpO₂), each day's avg/min/max is served from a pre-computed daily rollup, so long ranges stay fast.
The complete daily roll-up: steps, active & basal energy, distance, flights, exercise time, heart-rate averages, sleep, and workouts.
| Param | Type | Notes |
|---|---|---|
date | string | Required. YYYY-MM-DD. |
tz | string | IANA zone. Optional. |
The same aggregate as the full daily roll-up, totalled and averaged across an ISO calendar week.
| Param | Type | Notes |
|---|---|---|
week | string | Required. ISO week in YYYY-Www format, e.g. 2026-W19. |
tz | string | IANA zone. Optional. |
Individual data points — when you want the raw series, not an aggregate. All filters are optional; results are newest-first.
| Param | Type | Notes |
|---|---|---|
type | string | Optional. Filter by metric (e.g. heartRate). |
start_date | string | ISO date/time. Optional. |
end_date | string | ISO date/time. Optional. |
limit | integer | 1–20000. Defaults to 100. |
Your workout sessions — type, duration, distance, and energy.
| Param | Type | Notes |
|---|---|---|
activity_type | string | Optional. Filter by workout activity type. |
start_date | string | ISO date/time. Optional. |
end_date | string | ISO date/time. Optional. |
limit | integer | 1–20000. Defaults to 100. |
The most recent reading for every metric you sync — one indexed call, ideal for a dashboard.
Issues a new key and invalidates the current one immediately. Update any connected agents afterward.
Downloads a complete JSON export of your account, health samples, and workouts.
Deactivates your account immediately and schedules permanent deletion. You have a 30-day grace period — sign back in within 30 days to recover everything. For immediate, irreversible erasure, use DELETE /gdpr/account with a confirmation body.
Quotas are per account, per day — the window resets at 00:00 UTC. Your own data uploads from the app don't count against them — only API queries do. Every account starts with a 7-day free trial; after that, an active subscription (Pro or Developer) is required — there is no permanent free tier. See plans for details.
| Plan | Requests / day | Best for |
|---|---|---|
| Free trial | 25 | First 7 days |
| Pro | 100 | Personal dashboards |
| Developer | 1,000 | Agents that poll |
| Enterprise | Custom | Products & teams |
Every authenticated response includes your live quota in headers:
Exceeding the limit returns 429 Too Many Requests with a Retry-After header.
Errors return the appropriate HTTP status with a JSON body shaped like:
| Status | Meaning |
|---|---|
401 | Missing or invalid API key. |
409 | Conflict — e.g. an Apple ID already linked to another account (detail.code = account_exists). |
422 | Validation error — a required parameter is missing or malformed. |
429 | Rate limit exceeded. Back off until Retry-After. |