You can export heart-rate data already stored in Apple Health to CSV or JSON with Health.md on your iPhone. First decide whether you need a daily statistic, such as average or resting heart rate, or individual timestamped readings. Those are different outputs and require different selections.
Health.md includes 5 free export actions, followed by a single lifetime unlock. Manual export needs no Mac. For Apple's native XML archive and the broader export options, see how to export Apple Health data.
Choose the heart metric and level of detail
In Health Metrics → Heart, enable the metrics you want. The picker names and CSV labels are related but not always identical:
| What you need | Selection and detail | CSV output |
|---|---|---|
| Daily average | Average Heart Rate, Summary | Heart / Average Heart Rate, bpm |
| Daily minimum or maximum | Minimum Heart Rate or Maximum Heart Rate, Summary | Heart / Min Heart Rate or Max Heart Rate, bpm |
| Resting rate | Resting Heart Rate, Summary | Heart / Resting Heart Rate, bpm |
| Walking average | Walking Heart Rate Average, Summary | Heart / Walking Heart Rate Average, bpm |
| Timestamped heart-rate readings | At least one of Average, Minimum, or Maximum Heart Rate, with Detailed Time-Series | Available Heart / Heart Rate Sample rows, bpm, with Timestamp |
| HRV summary or readings | Heart Rate Variability; add Detailed Time-Series for samples | Heart / HRV and available HRV Sample rows, ms |
Selecting only Resting Heart Rate does not request the general heart-rate sample stream. Select one of the average/minimum/maximum heart-rate metrics and Detailed Time-Series when individual readings are your goal.
Heart rate in beats per minute (bpm) is distinct from heart rate variability in milliseconds (ms). Health.md's Apple HRV path reads HealthKit's SDNN type; do not silently label it RMSSD or merge it with a different HRV measure. Apple documents SDNN HRV and the separate resting heart-rate type.
1. Authorize and preview a known day
- Confirm the records you want are present in Apple Health on this iPhone. Let the watch or source app finish writing its data before exporting.
- Authorize Health.md to read the relevant health categories, then choose the Heart metrics above. If needed, review app permissions using Apple's Health access instructions.
- Select CSV for spreadsheet inspection or JSON for structured processing. Start with one known day and use YYYY-MM-DD as the export date format for easy checking.
- Choose Summary or Detailed Time-Series according to the table, select a writable Files folder, and tap Preview.
- Check the date, units, and whether the intended statistics or sample rows appear. Export, then open the actual saved file and confirm its destination and contents.
A longer range creates one file per day, not one combined spreadsheet. Follow your first iPhone export if setup, authorization, or folder access is incomplete.
An export contains available recorded data, not a promise of evenly spaced readings. Source hardware, activity, settings, and record availability can affect coverage. Apple's heart-rate monitoring guide describes measurement behavior and limitations; exporting does not create measurements that were never saved.
2. Read the CSV without mixing summaries and samples
Try the synthetic daily CSV first. It contains fictional values generated by the exporter. Its header is Date,Category,Metric,Value,Unit,Timestamp.
These exact source rows illustrate three different representations:
2026-03-15,Heart,Average Heart Rate,72.0,bpm
2026-03-15,Heart,HRV,42.0,ms
2026-03-15,Heart,Heart Rate Sample,61.0,bpm,2026-03-15T00:30:00Z
The daily statistics omit the final Timestamp field; the sample has all six fields and a UTC timestamp. A CSV-aware importer should keep the five supplied summary fields aligned and leave the final cell empty. Preserve quoted commas and newlines. Do not split the file manually on commas.
For a daily average trend, filter exactly Category = Heart, Metric = Average Heart Rate, and Unit = bpm. For a reading-by-reading chart, use Category = Heart, Metric = Heart Rate Sample, and Unit = bpm instead. For resting rate, choose its own Metric label. Keep HRV in a separate analysis with Unit ms.
The full Value column is mixed-type and includes metadata and other nonnumeric content. Filter the intended rows before converting values to numbers. Do not append a daily average to a list of individual readings, sum bpm values as a meaningful heart-rate total, or average HRV milliseconds together with bpm.
The synthetic fixture exercises serializer fields; it is not a complete measured day from which you can recompute every summary. Daily statistics and selected sample arrays are separate outputs. A few displayed samples do not establish the daily average or continuous coverage.
3. Use JSON for structured analysis
The synthetic daily JSON contains a nested heart object. Depending on selection and available records, it can include:
averageHeartRate,heartRateMin, andheartRateMaxfor daily heart-rate statistics.restingHeartRateandwalkingHeartRateAverageas distinct values.hrvfor the HRV summary.heartRateSamplesandhrvSamples, with timestamp/value entries and optional metadata when sample data is present.
Inspect the actual fields and the export's units and time_context metadata. An omitted field or array does not mean zero. The sample has a resting heart rate of 58 bpm, daily average heart rate of 72 bpm, and HRV of 42 ms; those labels and units must remain distinct.
The compatibility sample arrays are convenient timestamped projections, not a full source-identity archive. If you need selected public HealthKit record UUIDs, source provenance, exact intervals, and capture diagnostics, review the Apple-only Lossless Health Records option in the format guide and canonical record reference. It is Health.md's representation of selected public API results, not Apple's private database. A heart-rate sample value is not an ECG waveform or a beat-to-beat interval series.
4. Check dates, coverage, and aggregation
Use Timestamp for the time axis of sample charts. A timestamp ending in Z is UTC; the daily Date label follows the export calendar. Convert times consistently for display, and do not relabel UTC as local time or assume the calendar date portion of a UTC timestamp always equals Date.
The daily sample path assigns a record by its start time within the selected calendar day. Daily statistics use their own statistical query. Their query boundaries and reductions are not a promise that averaging the displayed sample rows will reproduce every summary exactly.
Before combining files, check overlapping dates and re-exports. Keep the intended version instead of adding or averaging duplicate copies. Compatibility sample rows do not expose a universal source UUID key; use the canonical archive when source identity is required, rather than assuming equal timestamp/value pairs prove duplicate records.
For a weekly summary, state whether you are averaging daily statistics or pooling individual recorded samples. An average of daily averages is not automatically a pooled-sample or time-weighted average. Report the recorded-day count and missing dates. Do not fill gaps with zeros or interpolate a continuous trace without labeling that transformation.
For import steps and chart setup, use Apple Health to Excel or Google Sheets, replacing the steps/sleep filters with the exact Heart filters above. Workout-specific heart-rate statistics belong to the Workouts category and represent another context; see the workout export guide.
Troubleshooting
- Summaries but no readings: check Detailed Time-Series and an Average, Minimum, or Maximum Heart Rate selection. Resting Heart Rate alone does not request those readings.
- No HRV samples: enable Heart Rate Variability, use Detailed Time-Series, and check whether the source has SDNN records for the selected day.
- A value or day is missing: review source records, synchronization, date, selection, and authorization. An absent row does not establish zero or identify a particular read-denial state.
- Dates or averages differ from another app: compare timezone, selected dates, source coverage, metric identity, and aggregation method before replacing values.
- Saving fails after Preview: check folder/provider availability and reselect the destination. See export troubleshooting.
These instructions describe file contents and calculations, not a clinical interpretation of heart-rate values. The export does not by itself establish a diagnosis or explain why a reading changed.
Protect your export
The core local folder workflow requires no Health.md account and creates no Health.md server copy by default. Synced folders, recipients, spreadsheets hosted online, and model providers follow their own storage and privacy rules. Detailed files can preserve exact health timestamps and source information; inspect them before sharing.
The separate opt-in, single-owner Health.md Cloud pilot retains only API exports intentionally uploaded to it, has no public signup and no automatic device sync, and is not generally available. This folder workflow does not upload to that pilot. See retention and destination boundaries.
For a non-synced folder and backup checks, follow export health data without the cloud. For exact row contracts, return to Apple Health to CSV. Android users should use the Health Connect guide and its documented metric semantics rather than assume every Apple heart metric has an identical counterpart.