To export workouts already stored in Apple Health, authorize Health.md to read them, select Workouts, choose the day the workout started, and save a CSV or JSON export. Start with one session you can recognize before exporting a longer range.
Health.md includes 5 free export actions, followed by a single lifetime unlock. Manual export runs on your iPhone and does not require a Mac. For Apple's native XML archive and the broader export choices, see how to export Apple Health data.
Choose the format for the job
| Goal | Starting format | What to expect |
|---|---|---|
| Inspect workout values in a spreadsheet | CSV | Several rows per workout, with Category, Metric, Value, Unit, and sometimes Timestamp. |
| Keep sessions separate for software or analysis | JSON | A workouts array with an object per exported workout, including ID, type, and exact start/end timestamps. |
| Read workout information beside daily notes | Markdown or Obsidian Bases | A readable daily projection; use structured output when source identity or detailed records matter. |
| Preserve selected public HealthKit source records | JSON or CSV with Lossless Health Records | An Apple-only canonical archive, with capture status, source identity, and query diagnostics to inspect. |
This walkthrough uses CSV and JSON, not a GPX, FIT, or TCX conversion. Route coordinates inside JSON are not automatically a file another fitness service can import. Check that service's accepted formats before choosing a workflow.
1. Check the source and authorize access
Confirm the workout is present in Apple Health on this iPhone. Health.md can read only records the watch or source app has written there and the public APIs make available under your authorization.
In Health.md, authorize the health categories you need and enable Workouts in Health Metrics. If you skipped access earlier, review Health.md's read permissions in Apple Health. Apple's Health sharing and permissions guide explains how to review app access and describes the separate native XML export.
A recorded workout does not guarantee that heart rate, distance, laps, power, cadence, or a route exists. Source apps, hardware, workout type, synchronization, and available permissions affect those fields. Selecting Workouts cannot reconstruct records that were never saved.
2. Preview one known workout day
- Choose CSV or JSON and start with Summary. You can select both formats in the same export action.
- Select the calendar day the workout started. Health.md's daily workout projection assigns sessions by their start time in the effective export calendar. For an overnight session, check the start day rather than only the day it ended.
- Choose a writable folder in Files, such as a local folder or an explicitly chosen synced destination.
- Tap Preview, inspect the date and workouts, then export. Open the saved file and confirm its contents and location.
A longer range produces daily files, not one combined workout workbook. Follow your first iPhone export for setup, folder selection, and preview. For a non-synced destination, use the local export guide, including its separate backup checks.
3. Understand the workout CSV rows
Try the synthetic daily CSV before using personal records. It is generated by the exporter and contains fictional measurements, metadata, and several workout examples.
The header is Date,Category,Metric,Value,Unit,Timestamp. Filter Category = Workouts, then inspect Metric and Unit before treating Value as a number. Text labels, start times, formatted pace, and numeric measurements coexist in the same Value column.
The sample's running workout includes these source values:
| Metric | Value | Unit | Meaning |
|---|---|---|---|
| Workout Activity Type | Running | empty | Session type marker, timestamped at 2026-03-15T10:00:00Z. |
| Running Duration | 3600.0 | seconds | 60 minutes of reported workout duration. |
| Running Distance | 10000 | meters | 10 kilometers. |
| Running Avg Pace | 6:00 /km | empty | Formatted pace text, not a decimal number. |
| Running Calories | 540.0 | kcal | Workout energy value. |
| Running Avg Heart Rate | 148 | bpm | An available workout statistic, not a heart-rate time series. |
Several CSV rows describe one session. Counting every Workouts row would count fields, not workouts. Workout Activity Type and Workout Sport are two descriptions of the same session, not two sessions.
Some identity/type rows have an exact Timestamp; many compatibility summary rows omit the final Timestamp field. Use a CSV-aware importer that keeps the remaining columns aligned and preserves quoted commas/newlines. Do not infer that every summary row has a unique session ID.
Two runs on the same day can have the same Metric labels. For reliable per-session grouping, use the JSON workout objects instead of grouping CSV rows only by date and the word “Running.” Keep distance, duration, calories, and heart-rate statistics separate rather than adding unlike units. See Apple Health to CSV for import rules.
4. Use JSON to keep workout sessions together
The synthetic daily JSON contains a workouts array. Each workout object includes id, type, sport, startTimeISO, endTimeISO, duration, and elapsedDuration. Available source data can add distance, heart-rate statistics, laps, splits, device/source metadata, route points, or time-series arrays.
For the sample running object, duration is 3600 seconds while elapsedDuration is 3900 seconds. Its exact times run from 10:00 to 11:05 UTC. Reported workout duration and elapsed start-to-end time can differ; do not overwrite one with the other or assume they measure the same thing.
Keep the workout ID and exact timestamps when combining daily JSON files. Review overlapping exports and source duplicates before counting sessions. Do not add an older and newer copy of the same workout together. Different IDs can still represent separate source recordings of the same activity, so an ID alone does not establish that two real-world sessions occurred.
JSON uses nested fields and arrays rather than CSV columns. Inspect the units and time_context metadata and the actual fields present. An omitted field is unavailable in that export, not automatically zero. Formatted distance or pace strings are display helpers; use numeric fields with their documented units for calculations.
Routes, laps, and detailed records
A workout total, a route, and a stream of heart-rate samples are different data. Apple's workout route documentation describes route data as location samples associated with a workout. A distance total is not enough to rebuild those coordinates.
Health.md's JSON renderer can include route and time-series data when the workout read returns them. Inspect even a Summary JSON export before sharing it: selecting Summary is not a guarantee that workout objects contain no detailed fields or coordinates. The synthetic JSON intentionally exercises optional fields; it is not a promise that every real workout includes them.
Detailed Time-Series adds selected samples and intervals where supported. Lossless Health Records adds Health.md's representation of selected public HealthKit/WorkoutKit records; it is Apple-only and not a copy of Apple's private database. Inspect capture status, query results, and warnings rather than assuming every possible record was captured. Read the format guide and canonical Apple Health record reference before using an archive.
Laps and splits describe parts of a workout. Do not add their distance or duration to the complete workout total. Not every sport has every statistic, and running cadence in steps per minute is distinct from cycling cadence in revolutions per minute.
Troubleshooting
- No workouts on the selected day: check the start date, Workouts selection, source records in Apple Health, read authorization, and source synchronization. Empty output does not reveal a specific permission-denial state.
- Workout present, detail missing: inspect the source and available permissions. A route, lap, or sample stream may not exist even when the workout total does.
- Too many sessions or inflated totals: do not count CSV metric rows as sessions, add laps/splits to totals, combine samples with summaries, or sum overlapping re-exports.
- Unexpected date or duration: compare the export calendar/timezone, ISO timestamps, reported duration, and elapsed duration before changing values.
- Preview works but saving fails: reselect the destination folder and check the provider's availability. See export troubleshooting.
Protect the exported files
The core local folder export requires no Health.md account and creates no Health.md server copy by default. Synced folders, recipient services, and AI uploads follow those providers' storage and privacy rules. Workout files can include exact times, device/source identifiers, and route locations; protect them as sensitive records.
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 spreadsheet analysis, continue with Apple Health to Excel or Google Sheets, adapting the metric filters and keeping sessions separate. For Android data, use the Health Connect export guide; its source semantics and archive capabilities must not be assumed identical to Apple's.