September 3, 2026 · 3 min read

Basal body temperature

Where readings come from, how the daily value is averaged, how it differs from wrist temperature, and what to build.

What body_temperature_basal measures

body_temperature_basal is the day’s average of the user’s basal body temperature readings, the resting core temperature measured on waking, in degrees Celsius.

Fieldbody_temperature_basal
UnitCelsius
ReportedDaily average, on days with at least one reading
WindowMidnight to midnight, profile local time
Wearable requiredYes, a thermometer or sensor writing to the platform
APIGET /api/v1/profile/biomarker/{externalId}?categories=vitals&types=body_temperature_basal plus a date range
WebhookBiomarkerCreatedIntegrationEvent. Entries update in place, upsert on id.

Data sources

PlatformRecordNotes
iOS, HealthKitbasalBodyTemperatureFertility tracking apps, wearable thermometers, and manual entries
Android, Health ConnectBasalBodyTemperatureRecordSame kinds of apps
Direct integrationsProvider-dependent
Phone onlyManual entries only

How Sahha calculates body_temperature_basal

  1. Pick one source for the day within the temperature category, which also covers sleeping skin temperature. One source wins per day; readings are never blended.
  2. Average that source’s readings with an end time inside the local day. Usually there is one.

Absence means no reading that day.

Interpreting the value

The shift is the signal. Basal temperature is used for its small, consistent rise after ovulation and its fall before menstruation. Absolute values vary by person and by thermometer. Charts of the daily value over a cycle are the established presentation.

Consistency of measurement matters more than the device. A reading taken after getting up, or at a different time, is not a basal reading. The biomarker cannot tell.

Basal body temperature is not a score factor and has no trend or comparison insight. The reproductive biomarkers planned for 2026 are the natural companion.

Use cases

A cycle chart. Plot the daily value over the current cycle with a rolling 3-day average to smooth single-day noise, and mark the day the average rises above the preceding six days.

GET /api/v1/profile/biomarker/{externalId}?categories=vitals&types=body_temperature_basal&startDateTime=2026-08-03&endDateTime=2026-09-02

A reminder loop. Absence of a reading by mid-morning is the trigger for users who chart.

Limitations

  • Sparse and user-driven. Coverage depends on the user measuring.
  • Not the same as wrist temperature. Do not merge the two fields.
  • Absence is not zero.

Related