27 types across three platforms · shapes read from HealthKit (2026-10-02), Health Connect (2026-10-03) and Google Health API (2026-10-31) sources · synthetic values only
Pick a platform, the record types, a date range, a time zone and a seed, and this generates synthetic fixtures in your browser: 8 HealthKit types, 9 Health Connect record classes and 10 Google Health API data types, downloadable as JSON or CSV. Every field name comes from this site's generated copies of Apple's and Google's own references, and each record carries the UTC offset in force at its own instant, so a range across a daylight-saving change produces records whose start and end offsets differ. The values are synthetic and illustrative, not real or physiologically validated.
Synthetic test data. Every value is generated from your seed — not real, not physiologically validated, and the ranges are illustrative.
Time zones are the part fixtures get wrong
The three platforms record the user’s zone three different ways, and the generator writes each one the way its own reference describes. Health Connect puts a nullable ZoneOffset? beside every Instant (startZoneOffset, endZoneOffset, or zoneOffset on an instantaneous record), and you can untick offsets to get the null case. The Google Health API marks startUtcOffset, endUtcOffset and utcOffset Required, written as a duration in seconds the way Google’s own list example prints "0s"; its Daily types are keyed by a civil Date instead. HealthKit stores absolute dates and carries the zone only as optional metadata: Apple documents HKMetadataKeyTimeZone as “This key takes a string value compatible with the NSTimeZone class’s timeZoneWithName: method.”
Each offset is resolved for its own record’s instant through your browser’s time-zone database, never once per file. The default range, 31 October to 2 November 2026 in New York, crosses the end of daylight saving time, so the night of 31 October starts at −04:00 and ends at −05:00. That is the record that breaks a “today” computed as a fixed UTC window; the day-boundary demo shows why, and the day-boundary rollup recipe is tested code that handles it.
What each type is built from
Neither HealthKit nor Health Connect has a JSON wire format; both are native APIs. For those two the file is this tool’s JSON encoding of the native object, with the field names the reference uses and every encoding choice stated in the table and in the file’s _synthetic block. The Google Health API is a REST API, so its file is shaped like the list method’s response.
Apple HealthKit
From Apple's documentation JSON, read 2026-10-02 (metadata keys 2026-10-04); the full set is on every HealthKit type identifier.
one of HKWorkoutActivityTypeRunning, HKWorkoutActivityTypeWalking, HKWorkoutActivityTypeHiking, HKWorkoutActivityTypeYoga, HKWorkoutActivityTypeRowing, HKWorkoutActivityTypeElliptical
startDate / endDate
instant, UTC (ISO 8601)
the workout's interval
metadata.HKMetadataKeyTimeZone
NSString
optional; IANA zone name
Not generated: duration, energy, distance, events — HKWorkout's own properties are not in this site's generated datasets, so they are not generated
Not offered, and why
HKCategoryTypeIdentifierSleepAnalysis: a category sample is decoded by HKCategoryValueSleepAnalysis, and the identifier dataset names that enum but not its cases, so there is no value this tool could write without inventing one.
HKQuantityTypeIdentifierOxygenSaturation: Apple's prose puts it in the percent family but does not state the scale a percent quantity is written in, and a fixture that guesses 0–1 against 0–100 is wrong by a factor of a hundred.
HKWorkout's duration, energy and distance: HKWorkout's own properties are not in this site's generated datasets; workouts carry an activity type and an interval only.
written as "+HH:MM"; null when you untick offsets (the type is nullable)
endTime
Instant
ISO 8601 instant, UTC
endZoneOffset
ZoneOffset?
written as "+HH:MM"; null when you untick offsets (the type is nullable)
stages
List<SleepSessionRecord.Stage>
always [] — the constructor's default
Not generated: stages[] contents — SleepSessionRecord.Stage's fields are not in this site's dataset; the STAGE_TYPE_* constants are, but not the class that carries them
Not generated: metadata — every constructor requires a Metadata, but Metadata's fields are not in this site's dataset
not a record field — the constant's name, for your reading
Not generated: segments, laps, route — left at the constructor's defaults; their element classes are not in this site's dataset
Not generated: metadata — every constructor requires a Metadata, but Metadata's fields are not in this site's dataset
Not offered, and why
HeartRateRecord (and the other Series records): a series record holds a list of HeartRateRecord.Sample, and the dataset carries that nested class's name and one-line description but not its fields. Resting heart rate, an instantaneous record with a stated field, is offered instead.
SleepSessionRecord stages: the STAGE_TYPE_* constants are in the dataset, but SleepSessionRecord.Stage's fields are not, so sessions are written with stages = [], the constructor's own default.
Metadata: every constructor requires one, but Metadata's fields are not in the dataset, so it is left out of every record.
Google Health API
From Google's v4 discovery document (revision 20261030), read 2026-10-31; the full set is on the Google Health API reference.
Optional. The root mean square of successive differences between normal heartbeats. This is a measure of heart rate variability used by Google Health. Must be in the range `[1, 200]`.
Not generated: civilTime — Output only in the discovery document — the server computes them
Not generated: name, dataSource — DataPoint's wrapper fields are not in this site's schema extract; only the data-type union member is generated
Required. The localized, human-readable name of the exercise. For all exercise types other than `OTHER`, the system ignores client input and overrides this field with a generated name based on `exercise_type` (e.g., "Walking" for `WALKING`). If `exercise_type` is `OTHER`, this field can contain the user's custom, free-form display name.
Not generated: civilEndTime, civilStartTime — Output only in the discovery document — the server computes them
Not generated: name, dataSource — DataPoint's wrapper fields are not in this site's schema extract; only the data-type union member is generated
Not generated: exerciseEvents, splits, splitSummaries, exerciseMetadata — optional; not generated
Not offered, and why
civilStartTime, civilEndTime, civilTime: the discovery document marks them Output only — the server computes them from the instant and the offset, so a fixture you send should not carry them.
the DataPoint wrapper (name, dataSource): only the data-type member of DataPoint's union is generated; the wrapper's schema is not in this site's extract.
Workout activities are six of the ones the workout-type crosswalk names identically on all three platforms (read 2026-10-18), so the same seed gives the same activity on each. Heart rate variability is generated from one stream but labelled per platform: HealthKit stores SDNN and Health Connect and Google store RMSSD, and the cross-platform matrix explains why those are not interconvertible — do not read the synthetic numbers as a conversion.
The values are synthetic
Every number is drawn from a seeded generator inside a conservative, illustrative range — hourly steps between 0 and 900 over waking hours, heart rate between about 50 and 90 bpm, nights of six and a half to eight and a half hours — and then dropped if it falls outside the validation range the platform’s reference states. That is why a Health Connect file has fewer step records than the Google one for the same seed: Google allows a count of 0, and StepsRecord’s count starts at 1. None of it is real data, none of it is physiologically validated, and it is not fit for research or clinical use. Use it to exercise parsing, storage, rollups and edge cases.
Everything runs client-side. The generator loads when you first press Generate, builds the files in your browser and hands them to the download; nothing is sent to a server and nothing is stored.
The type names, field names, Kotlin and discovery types, validation ranges, enum values and constructor signatures are read at build time from this site’s generated datasets — the same ones behind the HealthKit identifiers, the metadata keys, the Health Connect records and the Google Health API reference. If a regeneration renames a field this tool writes, the build fails rather than shipping a fixture with a stale name. Units in HealthKit files are this tool’s choice inside the family Apple states; see HealthKit unit families before you build an HKUnit.
The same seed and settings give the same file, provided the browser’s time-zone rules agree. The offsets come from the browser’s own tz database, so a zone whose rules changed recently can differ between an old browser and a new one.
A free tool from AIFitnessAPI. Shapes read from the vendors’ published references; the machine-readable exports of those references are on datasets.