---
title: "Say what a device permission has been read for"
method: POST
path: "/integrations/{provider}/coverage"
tags: ["Connections"]
---

# Say what a device permission has been read for

`POST /integrations/{provider}/coverage`

## Request

- Base URL: `https://bodylab.lol/api/v1`
- URL: `https://bodylab.lol/api/v1/integrations/{provider}/coverage`
- Auth: HTTP bearer

For a service whose connect shape is native_permission (Apple Health, Health Connect). The permission is the device's, so nothing on the server knows how far such a service has been read: this is the last-synced time it otherwise has none of. Send it after a read that finished, naming the stretch of time the device asked about and got an answer for, including an answer of nothing at all — that is what tells a week the athlete rested from a week Body Lab never saw. Send the stretch the service was willing to show, not the stretch you asked for: a permission limited to recent data returns nothing for last spring because it was never shown it, and vouching for those days would report sessions as skipped that nobody could have seen. A read that failed or was refused covers nothing and must not be reported. No sample count is sent because none is read: how far back an anchored query's answer reaches is a property of the anchor, not of how many samples came back. The stored stretch only widens; a narrower or older report leaves it alone. observedThrough is clamped to the server's clock.

## Path parameters

- `provider` string, required: Which device integration a batch ingest item came from. Known values: apple_health, health_connect. Treat unknown values as "other".

## Headers

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

## Request body

- object
  - `observedFrom` string, date-time, required: The start of the stretch that was read: the oldest instant the service was willing to show, not the oldest asked for.
  - `observedThrough` string, date-time, required: The end of the stretch that was read. Anything after the server's own clock is clamped to it.

## Response `200`

OK

- object
  - `observedFrom` string, date-time, nullable, required: An instant: ISO-8601 with offset, e.g. 2026-09-13T06:30:00Z.
  - `observedThrough` string, date-time, nullable, required: An instant: ISO-8601 with offset, e.g. 2026-09-13T06:30:00Z.

## Other responses

- `401`: Error: UNAUTHORIZED.
- `409`: Error: NOT_OFFERED.
- `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)
