---
title: "Any of the athlete's measurement series, over a range"
method: GET
path: "/measurements"
tags: ["Measurements"]
---

# Any of the athlete's measurement series, over a range

`GET /measurements`

## Request

- Base URL: `https://bodylab.lol/api/v1`
- URL: `https://bodylab.lol/api/v1/measurements`
- Auth: HTTP bearer

Several series in one request, each in its own shape: daily values (resting HR, HRV, sleep, energy, weight and the fitness markers), step counts, and blood pressure readings by sitting. Up to 732 days, inclusive. Each requested series is an array (empty when there's nothing in range); every other series is null.

## Query parameters

- `types` string, required: Comma-separated series to return, e.g. "bloodPressure,weightKg". Known: restingHrBpm, hrvMs, sleepScore, sleepMinutes, energyScore, steps, weightKg, vo2maxMlKgMin, vo2maxCyclingMlKgMin, ftpW, lthrBpm, lthrCyclingBpm, thresholdSpeedMs, bloodPressure, feelScore. A name this server doesn't know comes back in `unknownTypes` instead of failing the request; repeats are ignored.
- `from` string, date: First day, inclusive. Defaults to 89 days before `to`.
- `to` string, date: Last day, inclusive. Defaults to today; a later day is treated as today.

## Headers

- `X-Client-Platform` string
- `X-Client-Version` string

## Response `200`

OK

- object
  - `today` string, date, required: Today on the athlete's calendar, in their time zone.
  - `from` string, date, required: The first day covered, as resolved.
  - `to` string, date, required: The last day covered, as resolved (a `to` after today comes back as today).
  - `unknownTypes` string[], required: Requested names this server doesn't know, so a client can tell a typo from an empty series.
  - `restingHrBpm` object[], nullable, required: Morning resting heart rate, beats per minute. Newest first; days without a value are absent. Null when not requested.
    - `date` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
    - `value` number, required: The value Body Lab resolved for the day, in the unit the series' name carries.
    - `source` string, nullable, required: Where this value came from; null where Body Lab didn't record which, for older values. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `carriedForward` boolean, required: True for a test result or weigh-in dated before `from` and still the latest at `from`: the value in effect when the range begins, kept so a marker last measured before the range isn't read as missing. Only ever on the oldest entry of a marker series (weightKg, vo2max*, ftpW, lthr*, thresholdSpeedMs); never on a daily reading.
  - `hrvMs` object[], nullable, required: Overnight heart-rate variability (RMSSD), milliseconds. Newest first; days without a value are absent. Null when not requested.
    - `date` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
    - `value` number, required: The value Body Lab resolved for the day, in the unit the series' name carries.
    - `source` string, nullable, required: Where this value came from; null where Body Lab didn't record which, for older values. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `carriedForward` boolean, required: True for a test result or weigh-in dated before `from` and still the latest at `from`: the value in effect when the range begins, kept so a marker last measured before the range isn't read as missing. Only ever on the oldest entry of a marker series (weightKg, vo2max*, ftpW, lthr*, thresholdSpeedMs); never on a daily reading.
  - `sleepScore` object[], nullable, required: A device's sleep score, 0–100, on that device's own scale. Newest first; days without a value are absent. Null when not requested.
    - `date` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
    - `value` number, required: The value Body Lab resolved for the day, in the unit the series' name carries.
    - `source` string, nullable, required: Where this value came from; null where Body Lab didn't record which, for older values. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `carriedForward` boolean, required: True for a test result or weigh-in dated before `from` and still the latest at `from`: the value in effect when the range begins, kept so a marker last measured before the range isn't read as missing. Only ever on the oldest entry of a marker series (weightKg, vo2max*, ftpW, lthr*, thresholdSpeedMs); never on a daily reading.
  - `sleepMinutes` object[], nullable, required: Minutes asleep on the night that ended that morning. Newest first; days without a value are absent. Null when not requested.
    - `date` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
    - `value` number, required: The value Body Lab resolved for the day, in the unit the series' name carries.
    - `source` string, nullable, required: Where this value came from; null where Body Lab didn't record which, for older values. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `carriedForward` boolean, required: True for a test result or weigh-in dated before `from` and still the latest at `from`: the value in effect when the range begins, kept so a marker last measured before the range isn't read as missing. Only ever on the oldest entry of a marker series (weightKg, vo2max*, ftpW, lthr*, thresholdSpeedMs); never on a daily reading.
  - `energyScore` object[], nullable, required: A device's energy or body-battery score, 0–100, on that device's own scale. Newest first; days without a value are absent. Null when not requested.
    - `date` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
    - `value` number, required: The value Body Lab resolved for the day, in the unit the series' name carries.
    - `source` string, nullable, required: Where this value came from; null where Body Lab didn't record which, for older values. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `carriedForward` boolean, required: True for a test result or weigh-in dated before `from` and still the latest at `from`: the value in effect when the range begins, kept so a marker last measured before the range isn't read as missing. Only ever on the oldest entry of a marker series (weightKg, vo2max*, ftpW, lthr*, thresholdSpeedMs); never on a daily reading.
  - `steps` object[], nullable, required: Steps counted each day, newest first; days without a count are absent. Null when not requested.
    - `date` string, date, required: The day the count belongs to, as its source dated it. A whoop count is a cycle, from one sleep to the next, dated by the wake that starts it.
    - `value` integer, required: Steps counted. A day with no count, or a count of 0 (not worn), is absent.
    - `source` string, required: The service the count came from. The whole series is one source's — never several devices added together — as on GET /wellness/steps.
    - `partial` boolean, required: True while the day isn't over in the athlete's time zone: a count so far, to leave out of any average.
  - `weightKg` object[], nullable, required: Body mass, kilograms, to 0.1. Newest first; days without a value are absent. Null when not requested.
    - `date` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
    - `value` number, required: The value Body Lab resolved for the day, in the unit the series' name carries.
    - `source` string, nullable, required: Where this value came from; null where Body Lab didn't record which, for older values. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `carriedForward` boolean, required: True for a test result or weigh-in dated before `from` and still the latest at `from`: the value in effect when the range begins, kept so a marker last measured before the range isn't read as missing. Only ever on the oldest entry of a marker series (weightKg, vo2max*, ftpW, lthr*, thresholdSpeedMs); never on a daily reading.
  - `vo2maxMlKgMin` object[], nullable, required: VO2max from running or a general estimate, ml/kg/min, to 0.1. Newest first; days without a value are absent. Null when not requested.
    - `date` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
    - `value` number, required: The value Body Lab resolved for the day, in the unit the series' name carries.
    - `source` string, nullable, required: Where this value came from; null where Body Lab didn't record which, for older values. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `carriedForward` boolean, required: True for a test result or weigh-in dated before `from` and still the latest at `from`: the value in effect when the range begins, kept so a marker last measured before the range isn't read as missing. Only ever on the oldest entry of a marker series (weightKg, vo2max*, ftpW, lthr*, thresholdSpeedMs); never on a daily reading.
  - `vo2maxCyclingMlKgMin` object[], nullable, required: Cycling VO2max, ml/kg/min, to 0.1. Newest first; days without a value are absent. Null when not requested.
    - `date` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
    - `value` number, required: The value Body Lab resolved for the day, in the unit the series' name carries.
    - `source` string, nullable, required: Where this value came from; null where Body Lab didn't record which, for older values. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `carriedForward` boolean, required: True for a test result or weigh-in dated before `from` and still the latest at `from`: the value in effect when the range begins, kept so a marker last measured before the range isn't read as missing. Only ever on the oldest entry of a marker series (weightKg, vo2max*, ftpW, lthr*, thresholdSpeedMs); never on a daily reading.
  - `ftpW` object[], nullable, required: Functional threshold power, watts. Newest first; days without a value are absent. Null when not requested.
    - `date` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
    - `value` number, required: The value Body Lab resolved for the day, in the unit the series' name carries.
    - `source` string, nullable, required: Where this value came from; null where Body Lab didn't record which, for older values. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `carriedForward` boolean, required: True for a test result or weigh-in dated before `from` and still the latest at `from`: the value in effect when the range begins, kept so a marker last measured before the range isn't read as missing. Only ever on the oldest entry of a marker series (weightKg, vo2max*, ftpW, lthr*, thresholdSpeedMs); never on a daily reading.
  - `lthrBpm` object[], nullable, required: Lactate threshold heart rate, beats per minute. Newest first; days without a value are absent. Null when not requested.
    - `date` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
    - `value` number, required: The value Body Lab resolved for the day, in the unit the series' name carries.
    - `source` string, nullable, required: Where this value came from; null where Body Lab didn't record which, for older values. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `carriedForward` boolean, required: True for a test result or weigh-in dated before `from` and still the latest at `from`: the value in effect when the range begins, kept so a marker last measured before the range isn't read as missing. Only ever on the oldest entry of a marker series (weightKg, vo2max*, ftpW, lthr*, thresholdSpeedMs); never on a daily reading.
  - `lthrCyclingBpm` object[], nullable, required: Cycling lactate threshold heart rate, beats per minute. Newest first; days without a value are absent. Null when not requested.
    - `date` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
    - `value` number, required: The value Body Lab resolved for the day, in the unit the series' name carries.
    - `source` string, nullable, required: Where this value came from; null where Body Lab didn't record which, for older values. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `carriedForward` boolean, required: True for a test result or weigh-in dated before `from` and still the latest at `from`: the value in effect when the range begins, kept so a marker last measured before the range isn't read as missing. Only ever on the oldest entry of a marker series (weightKg, vo2max*, ftpW, lthr*, thresholdSpeedMs); never on a daily reading.
  - `thresholdSpeedMs` object[], nullable, required: Running threshold speed, metres per second, to 0.01. Newest first; days without a value are absent. Null when not requested.
    - `date` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
    - `value` number, required: The value Body Lab resolved for the day, in the unit the series' name carries.
    - `source` string, nullable, required: Where this value came from; null where Body Lab didn't record which, for older values. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `carriedForward` boolean, required: True for a test result or weigh-in dated before `from` and still the latest at `from`: the value in effect when the range begins, kept so a marker last measured before the range isn't read as missing. Only ever on the oldest entry of a marker series (weightKg, vo2max*, ftpW, lthr*, thresholdSpeedMs); never on a daily reading.
  - `feelScore` object[], nullable, required: How the athlete said they felt in the morning's Daily Update, 1 (Wrecked) to 5 (Ready to go): their own rating, not a reading. Newest first; days without a value are absent. Null when not requested.
    - `date` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
    - `value` number, required: The value Body Lab resolved for the day, in the unit the series' name carries.
    - `source` string, nullable, required: Where this value came from; null where Body Lab didn't record which, for older values. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `carriedForward` boolean, required: True for a test result or weigh-in dated before `from` and still the latest at `from`: the value in effect when the range begins, kept so a marker last measured before the range isn't read as missing. Only ever on the oldest entry of a marker series (weightKg, vo2max*, ftpW, lthr*, thresholdSpeedMs); never on a daily reading.
  - `bloodPressure` object[], nullable, required: Every blood pressure the athlete measured, grouped into sittings (readings from one source within 15 minutes of each other), newest first, each with its readings. Measurements and nothing more: Body Lab attaches no category, threshold or judgement to them, and nothing it prescribes reads them. Null when not requested.
    - `date` string, date, required: The athlete's day the sitting began on, in their time zone.
    - `at` string, date-time, required: When the sitting's first reading was taken.
    - `systolicMmHg` integer, required: The sitting's average upper number, rounded to a whole mmHg.
    - `diastolicMmHg` integer, required: The sitting's average lower number, rounded to a whole mmHg.
    - `pulseBpm` integer, nullable, required: The average pulse of the readings that have one; null when none do.
    - `source` string, required: Where the readings came from. A sitting never mixes sources. manual (typed in) is Body Lab's own; any other value is the service the athlete synced it from.
    - `readings` object[], required: Every reading in the sitting, earliest first, exactly as measured. A lone reading is a sitting of one.
      - `at` string, date-time, required: When the cuff read.
      - `systolicMmHg` integer, required
      - `diastolicMmHg` integer, required
      - `pulseBpm` integer, nullable, required

## Other responses

- `401`: Error: UNAUTHORIZED.
- `422`: Error: INVALID_RANGE.

---

[API](https://skmtc.dev/bodylab/apis/body-lab-api.md) · [All operations](https://skmtc.dev/bodylab/apis/body-lab-api/llms.txt) · [OpenAPI document](https://skmtc.dev/bodylab/apis/body-lab-api/revisions/544c201eaf88?raw)
