Skip to content
Document DB v7.2: Temporal Support, Telemetry Collection, All Calculations, String Based APIs, & Orleans Storage Providers! Feed The Machine Here

Writing Data

You can write health data to Apple HealthKit and Android Health Connect using the Write method. Request write permissions first using PermissionType.Write.

public class HealthWriteViewModel(IHealthService health)
{
async Task WriteDataAsync()
{
// 1. Request write permissions (uniform for all types)
await health.RequestPermissions(
PermissionType.Write,
DataType.Weight,
DataType.StepCount,
DataType.Hydration
);
// Or mix read/write per metric in a single call
// await health.RequestPermissions(
// (PermissionType.Write, DataType.Weight),
// (PermissionType.Write, DataType.StepCount),
// (PermissionType.ReadWrite, DataType.Hydration)
// );
var now = DateTimeOffset.Now;
// 2. Write a weight measurement
await health.Write(new NumericHealthResult(DataType.Weight, now, now, 75.0));
// 3. Write step counts over a time range
await health.Write(new NumericHealthResult(
DataType.StepCount, now.AddMinutes(-30), now, 500
));
// 4. Write blood pressure
await health.Write(new BloodPressureResult(now, now, 120.0, 80.0));
}
}

Menstruation flow uses the categorical MenstruationFlowResult. Request the MenstruationFlow permission, then write a record per day. The optional IsCycleStart flag marks the first day of the period.

await health.RequestPermissions(PermissionType.Write, DataType.MenstruationFlow);
var today = DateTimeOffset.Now;
await health.Write(new MenstruationFlowResult(today, today, MenstrualFlow.Medium, IsCycleStart: true));
await health.Write(new MenstruationFlowResult(today.AddDays(1), today.AddDays(1), MenstrualFlow.Light));

All numeric metrics are written with NumericHealthResult — just pass the matching DataType and value in its documented unit:

await health.RequestPermissions(
PermissionType.Write,
DataType.BloodGlucose,
DataType.BodyTemperature,
DataType.ActiveEnergyBurned
);
var now = DateTimeOffset.Now;
await health.Write(new NumericHealthResult(DataType.BloodGlucose, now, now, 95)); // mg/dL
await health.Write(new NumericHealthResult(DataType.BodyTemperature, now, now, 36.8)); // °C
await health.Write(new NumericHealthResult(DataType.ActiveEnergyBurned, now.AddMinutes(-30), now, 250)); // kcal
await health.RequestPermissions(
PermissionType.Write,
DataType.SexualActivity,
DataType.OvulationTest,
DataType.CervicalMucus,
DataType.IntermenstrualBleeding
);
var now = DateTimeOffset.Now;
await health.Write(new SexualActivityResult(now, now, SexualActivityProtection.Protected));
await health.Write(new OvulationTestResult(now, now, OvulationTestOutcome.Positive));
await health.Write(new CervicalMucusResult(now, now, CervicalMucusAppearance.EggWhite));
await health.Write(new IntermenstrualBleedingResult(now, now));
await health.RequestPermissions(PermissionType.Write, DataType.Workout);
var end = DateTimeOffset.Now;
var start = end.AddMinutes(-45);
await health.Write(new WorkoutResult(
start, end,
WorkoutType.Running,
TotalEnergyKilocalories: 420,
TotalDistanceMeters: 7500,
Title: "Morning run"
));

Only the nutrient values you set are written; everything else is omitted. Masses are in grams, energy in kilocalories.

await health.RequestPermissions(PermissionType.Write, DataType.Nutrition);
var now = DateTimeOffset.Now;
await health.Write(new NutritionResult(
now, now,
Meal: MealType.Lunch,
Name: "Chicken & rice",
EnergyKilocalories: 550,
ProteinGrams: 40,
CarbohydratesGrams: 60,
TotalFatGrams: 12
));