Skip to content
AF

Synthetic Health Data Generator

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.

Platform
Types

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.

Steps · HKQuantityTypeIdentifierStepCount

FieldType, as the source prints itHow it is written
typeHKQuantityTypeIdentifier (Objective-C constant)HKQuantityTypeIdentifierStepCount
startDate / endDateinstant, UTC (ISO 8601)the interval the quantity covers
valuenumberin the count unit family Apple states; expressed here in count
unitFamily / valueUnitstringthe family from Apple's prose; the unit is this tool's choice inside it
metadata.HKMetadataKeyTimeZoneNSStringoptional; IANA zone name
  • Not generated: HKUnit — Apple's prose states a unit family, not a unit; the HKUnit you construct is your choice (see /healthkit-units)

Heart rate · HKQuantityTypeIdentifierHeartRate

FieldType, as the source prints itHow it is written
typeHKQuantityTypeIdentifier (Objective-C constant)HKQuantityTypeIdentifierHeartRate
startDate / endDateinstant, UTC (ISO 8601)equal: a reading at one moment
valuenumberin the count/time unit family Apple states; expressed here in count/min
unitFamily / valueUnitstringthe family from Apple's prose; the unit is this tool's choice inside it
metadata.HKMetadataKeyTimeZoneNSStringoptional; IANA zone name
  • Not generated: HKUnit — Apple's prose states a unit family, not a unit; the HKUnit you construct is your choice (see /healthkit-units)

Resting heart rate · HKQuantityTypeIdentifierRestingHeartRate

FieldType, as the source prints itHow it is written
typeHKQuantityTypeIdentifier (Objective-C constant)HKQuantityTypeIdentifierRestingHeartRate
startDate / endDateinstant, UTC (ISO 8601)equal: a reading at one moment
valuenumberin the count/time unit family Apple states; expressed here in count/min
unitFamily / valueUnitstringthe family from Apple's prose; the unit is this tool's choice inside it
metadata.HKMetadataKeyTimeZoneNSStringoptional; IANA zone name
  • Not generated: HKUnit — Apple's prose states a unit family, not a unit; the HKUnit you construct is your choice (see /healthkit-units)

Heart rate variability · HKQuantityTypeIdentifierHeartRateVariabilitySDNN

FieldType, as the source prints itHow it is written
typeHKQuantityTypeIdentifier (Objective-C constant)HKQuantityTypeIdentifierHeartRateVariabilitySDNN
startDate / endDateinstant, UTC (ISO 8601)equal: a reading at one moment
valuenumberin the time unit family Apple states; expressed here in ms
unitFamily / valueUnitstringthe family from Apple's prose; the unit is this tool's choice inside it
metadata.HKMetadataKeyTimeZoneNSStringoptional; IANA zone name
  • Not generated: HKUnit — Apple's prose states a unit family, not a unit; the HKUnit you construct is your choice (see /healthkit-units)

Active energy · HKQuantityTypeIdentifierActiveEnergyBurned

FieldType, as the source prints itHow it is written
typeHKQuantityTypeIdentifier (Objective-C constant)HKQuantityTypeIdentifierActiveEnergyBurned
startDate / endDateinstant, UTC (ISO 8601)the interval the quantity covers
valuenumberin the energy unit family Apple states; expressed here in kcal
unitFamily / valueUnitstringthe family from Apple's prose; the unit is this tool's choice inside it
metadata.HKMetadataKeyTimeZoneNSStringoptional; IANA zone name
  • Not generated: HKUnit — Apple's prose states a unit family, not a unit; the HKUnit you construct is your choice (see /healthkit-units)

Distance · HKQuantityTypeIdentifierDistanceWalkingRunning

FieldType, as the source prints itHow it is written
typeHKQuantityTypeIdentifier (Objective-C constant)HKQuantityTypeIdentifierDistanceWalkingRunning
startDate / endDateinstant, UTC (ISO 8601)the interval the quantity covers
valuenumberin the length unit family Apple states; expressed here in m
unitFamily / valueUnitstringthe family from Apple's prose; the unit is this tool's choice inside it
metadata.HKMetadataKeyTimeZoneNSStringoptional; IANA zone name
  • Not generated: HKUnit — Apple's prose states a unit family, not a unit; the HKUnit you construct is your choice (see /healthkit-units)

Body weight · HKQuantityTypeIdentifierBodyMass

FieldType, as the source prints itHow it is written
typeHKQuantityTypeIdentifier (Objective-C constant)HKQuantityTypeIdentifierBodyMass
startDate / endDateinstant, UTC (ISO 8601)equal: a reading at one moment
valuenumberin the mass unit family Apple states; expressed here in kg
unitFamily / valueUnitstringthe family from Apple's prose; the unit is this tool's choice inside it
metadata.HKMetadataKeyTimeZoneNSStringoptional; IANA zone name
  • Not generated: HKUnit — Apple's prose states a unit family, not a unit; the HKUnit you construct is your choice (see /healthkit-units)

Workouts · HKWorkout (activity type and interval only)

FieldType, as the source prints itHow it is written
workoutActivityTypeHKWorkoutActivityType case (Objective-C constant)one of HKWorkoutActivityTypeRunning, HKWorkoutActivityTypeWalking, HKWorkoutActivityTypeHiking, HKWorkoutActivityTypeYoga, HKWorkoutActivityTypeRowing, HKWorkoutActivityTypeElliptical
startDate / endDateinstant, UTC (ISO 8601)the workout's interval
metadata.HKMetadataKeyTimeZoneNSStringoptional; 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.

Android Health Connect

From Google's Jetpack record references, read 2026-10-03; the full set is on every Health Connect record type.

Steps · androidx.health.connect.client.records.StepsRecord

FieldType, as the source prints itHow it is written
startTimeInstantISO 8601 instant, UTC
startZoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
endTimeInstantISO 8601 instant, UTC
endZoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
countLongValid range: 1-1000000.
  • Not generated: metadata — every constructor requires a Metadata, but Metadata's fields are not in this site's dataset

Resting heart rate · androidx.health.connect.client.records.RestingHeartRateRecord

FieldType, as the source prints itHow it is written
timeInstantISO 8601 instant, UTC
zoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
beatsPerMinuteLongValidation range: 1-300.
  • Not generated: metadata — every constructor requires a Metadata, but Metadata's fields are not in this site's dataset

Heart rate variability · androidx.health.connect.client.records.HeartRateVariabilityRmssdRecord

FieldType, as the source prints itHow it is written
timeInstantISO 8601 instant, UTC
zoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
heartRateVariabilityMillisDoubleValid Range: 1-200.
  • Not generated: metadata — every constructor requires a Metadata, but Metadata's fields are not in this site's dataset

Active energy · androidx.health.connect.client.records.ActiveCaloriesBurnedRecord

FieldType, as the source prints itHow it is written
startTimeInstantISO 8601 instant, UTC
startZoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
endTimeInstantISO 8601 instant, UTC
endZoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
energyEnergy{ value, unit: "kcal" } — unit from Google's sentence "Valid range: 0-1000000 kcal."
  • Not generated: metadata — every constructor requires a Metadata, but Metadata's fields are not in this site's dataset

Distance · androidx.health.connect.client.records.DistanceRecord

FieldType, as the source prints itHow it is written
startTimeInstantISO 8601 instant, UTC
startZoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
endTimeInstantISO 8601 instant, UTC
endZoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
distanceLength{ value, unit: "meters" } — unit from Google's sentence "Valid range: 0-1000000 meters."
  • Not generated: metadata — every constructor requires a Metadata, but Metadata's fields are not in this site's dataset

Body weight · androidx.health.connect.client.records.WeightRecord

FieldType, as the source prints itHow it is written
timeInstantISO 8601 instant, UTC
zoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
weightMass{ value, unit: "kilograms" } — unit from Google's sentence "Valid range: 0-1000 kilograms."
  • Not generated: metadata — every constructor requires a Metadata, but Metadata's fields are not in this site's dataset

Oxygen saturation · androidx.health.connect.client.records.OxygenSaturationRecord

FieldType, as the source prints itHow it is written
timeInstantISO 8601 instant, UTC
zoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
percentagePercentageValid range: 0-100.
  • Not generated: metadata — every constructor requires a Metadata, but Metadata's fields are not in this site's dataset
  • Not generated: Percentage encoding — written as a bare number in Google's stated 0–100 range

Sleep sessions · androidx.health.connect.client.records.SleepSessionRecord

FieldType, as the source prints itHow it is written
startTimeInstantISO 8601 instant, UTC
startZoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
endTimeInstantISO 8601 instant, UTC
endZoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
stagesList<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

Workouts · androidx.health.connect.client.records.ExerciseSessionRecord

FieldType, as the source prints itHow it is written
startTimeInstantISO 8601 instant, UTC
startZoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
endTimeInstantISO 8601 instant, UTC
endZoneOffsetZoneOffset?written as "+HH:MM"; null when you untick offsets (the type is nullable)
exerciseTypeIntthe constant's value: EXERCISE_TYPE_RUNNING = 56, EXERCISE_TYPE_WALKING = 79, EXERCISE_TYPE_HIKING = 37, EXERCISE_TYPE_YOGA = 83, EXERCISE_TYPE_ROWING = 53, EXERCISE_TYPE_ELLIPTICAL = 25
exerciseTypeNamestringnot 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.

Steps · Steps (steps)

FieldType, as the source prints itHow it is written
steps.intervalObservationTimeIntervalstartTime: string/google-datetime; startUtcOffset: string/google-duration; endTime: string/google-datetime; endUtcOffset: string/google-duration
steps.countstring/int64Required. Number of steps in the recorded interval. Must be in the range `[0, 1000000]`.
  • 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

Heart rate · Heart Rate (heart-rate)

FieldType, as the source prints itHow it is written
heartRate.sampleTimeObservationSampleTimephysicalTime: string/google-datetime; utcOffset: string/google-duration
heartRate.beatsPerMinutestring/int64Required. The heart rate value in beats per minute. Must be in the range `[1, 300]`.
  • 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

Resting heart rate · Daily Resting Heart Rate (daily-resting-heart-rate)

FieldType, as the source prints itHow it is written
dailyRestingHeartRate.dateDateyear: integer/int32; month: integer/int32; day: integer/int32
dailyRestingHeartRate.beatsPerMinutestring/int64Required. The resting heart rate value in beats per minute.
  • Not generated: name, dataSource — DataPoint's wrapper fields are not in this site's schema extract; only the data-type union member is generated

Heart rate variability · Heart Rate Variability (heart-rate-variability)

FieldType, as the source prints itHow it is written
heartRateVariability.sampleTimeObservationSampleTimephysicalTime: string/google-datetime; utcOffset: string/google-duration
heartRateVariability.rootMeanSquareOfSuccessiveDifferencesMillisecondsnumber/doubleOptional. 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

Active energy · Active Energy Burned (active-energy-burned)

FieldType, as the source prints itHow it is written
activeEnergyBurned.intervalObservationTimeIntervalstartTime: string/google-datetime; startUtcOffset: string/google-duration; endTime: string/google-datetime; endUtcOffset: string/google-duration
activeEnergyBurned.kcalnumber/doubleRequired. Energy burned during an activity, measured in kilocalories. Must be in the range `[0, 1000000]`.
  • 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

Distance · Distance (distance)

FieldType, as the source prints itHow it is written
distance.intervalObservationTimeIntervalstartTime: string/google-datetime; startUtcOffset: string/google-duration; endTime: string/google-datetime; endUtcOffset: string/google-duration
distance.millimetersstring/int64Required. Distance in millimeters over the observed interval. Must be in the range `[0, 1000000000]`.
  • 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

Body weight · Weight (weight)

FieldType, as the source prints itHow it is written
weight.sampleTimeObservationSampleTimephysicalTime: string/google-datetime; utcOffset: string/google-duration
weight.weightGramsnumber/doubleRequired. Weight of a user in grams. Must be in the range `[0, 1000000]`.
  • 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

Oxygen saturation · Oxygen Saturation (oxygen-saturation)

FieldType, as the source prints itHow it is written
oxygenSaturation.sampleTimeObservationSampleTimephysicalTime: string/google-datetime; utcOffset: string/google-duration
oxygenSaturation.percentagenumber/doubleRequired. The oxygen saturation percentage. Must be in the range `[0, 100]`.
  • 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

Sleep sessions · Sleep (sleep)

FieldType, as the source prints itHow it is written
sleep.intervalSessionTimeIntervalstartTime: string/google-datetime; startUtcOffset: string/google-duration; endTime: string/google-datetime; endUtcOffset: string/google-duration
sleep.typestringalways STAGES
sleep.stages[]array<SleepStage>Optional. List of non-overlapping contiguous sleep stage segments that cover the sleep period. type ∈ LIGHT, DEEP, REM, AWAKE
  • 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: outOfBedSegments, metadata — optional; not generated

Workouts · Exercise (exercise)

FieldType, as the source prints itHow it is written
exercise.intervalSessionTimeIntervalstartTime: string/google-datetime; startUtcOffset: string/google-duration; endTime: string/google-datetime; endUtcOffset: string/google-duration
exercise.exerciseTypestringRUNNING, WALKING, HIKING, YOGA, ROWING, ELLIPTICAL
exercise.displayNamestringRequired. 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.
exercise.metricsSummaryMetricsSummarycaloriesKcal: number/double; distanceMillimeters: number/double; steps: string/int64; averageHeartRateBeatsPerMinute: string/int64
  • 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.

For loading fixtures into a running app, see Health Connect test data, testing a HealthKit integration and mocking wearable data in the testing guides; the deduplication recipe is a good first consumer of a generated file.

Where this output comes from, and where it runs

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.