All documentation

The data

Export formats

Seven formats; three are lossy.

Manual exports produce files. Automatic destinations receive batches. Their formats differ.

Manual export formats#

Manual export formats, what each is good for, and what each keeps
FormatFileGood forKeeps
NDJSON.zipKeeping everything or feeding another tool.Every encoded field. The default.
SQLite.sqliteQuerying without an import step.Typed columns plus every original record.
JSON.zipTools that want one JSON value.Every encoded field in one array.
CSV — lossy.zipExcel, Numbers or Sheets.Values, dates, units and source. Drops metadata and nested workout detail.
Markdown — lossy.zipObsidian and daily journals.Daily totals and extremes. Drops source records.
GPX — lossy.zipMaps and fitness tools.Routed workouts only.

Raw NDJSON (Uncompressed NDJSON. Engine only.) piping into another tool.

NDJSON — the default#

One record per line, streamable and lossless for every encoded field.

SQLite — for asking questions#

Query it in Datasette, DuckDB, pandas, Grafana or sqlite3. Time-shaped data uses one wide sample table for cross-type queries.

Workouts, deletions and characteristics have separate tables. record and daily views provide common timelines and aggregates.

Querying an export
-- Everything that happened last Tuesday, across every type:
SELECT local_day, type, value, unit, source_name
FROM record
WHERE local_day = '2026-08-18'
ORDER BY start_date;

-- Anything the columns left out is still there:
SELECT json_extract(raw, '$.metadata.HKTimeZone.value') AS tz
FROM sample
WHERE type = 'HKQuantityTypeIdentifierStepCount'
LIMIT 5;

SQLite is lossless: every row keeps the original export line in raw.meta records scope, run time and the time zone used for local_day.

CSV — for spreadsheets#

One CSV per Health type, plus deletion and export-log files when needed. Opens in Excel, Numbers or Sheets.

Lossy. Metadata and nested workout details are omitted.

Markdown — for Obsidian and journals#

One YYYY-MM-DD.md note per day, each carrying YAML front matter that Dataview can query, then the day in prose and small tables.

Front matter on a daily note
---
date: 2026-08-18
steps: 8241
sleep_hours: 7.2
workout_minutes: 42
resting_heart_rate: 54
---

Lossy. Notes keep daily counts, totals and extremes, not records, metadata, sources, devices or sample identifiers.

Days are local days, and sleep is filed under the day it ended, because last night's sleep belongs to the morning you woke up.

GPX — for maps#

One GPX 1.1 track per routed workout. GPX excludes all other Health data. A workout without GPS produces no file.

Delivery formats#

Automatic destinations use five formats. See the delivery schema for fields and examples.

Delivery formats and what each keeps
FormatMedia typeNotes
NDJSONapplication/x-ndjsonOne record per line. Lossless and streamable.
JSONapplication/jsonThe same records as one array.
CSV — lossytext/csvFlat table. Drops metadata, devices, workout detail and route points.
Metrics JSON — lossyapplication/jsonGrouped by metric. Drops metadata, devices and workout detail.
InfluxDB line protocol — lossytext/plain; charset=utf-8For InfluxDB and Telegraf. Drops metadata, workout detail and most device detail.

No SQLite or Markdown delivery#

SQLite files cannot append over HTTP. Batch-sized Markdown rewrites would replace complete days.

No line protocol for folders#

The Mac app ingests ndjson, json, Metrics JSON and csv from folders.