History for one device
Get the reading history for one device. Each reading is the average of a 5-minute window. Newest first, up to 1000 readings per call.
Picking a time range
The simplest way is ?last=:
?last=24hfor the last 24 hours?last=7dfor the last week?last=30dfor the last 30 days
Or set ?from=...&to=... with ISO 8601 UTC timestamps for an
explicit range. If you only set from, to defaults to “now”.
Skip all three to get the last 24 hours by default.
Maximum range is 90 days. For longer pulls, split into chunks.
For multiple devices, use /v1/readings.csv instead.
One request is much faster than looping /readings per
device and uses one rate-limit slot instead of many.
Long ranges
At most 1000 readings come back per call. If your range has
more, the response includes a next_cursor value at the end.
Send it back as ?cursor=... on your next call to get the
next batch, and keep going until next_cursor is null.
For a worked example, see Paging through long lists.
Documentation Index
Fetch the complete documentation index at: https://dev.1st.app/llms.txt
Use this file to discover all available pages before exploring further.
Authorizations
Your API key. Create one at dashboard.1st.app/integrations/api-keys.
Path Parameters
The UUID of the device you want. You get a device's ID from
GET /v1/devices (look at the device_id field) or by
copying it from the dashboard URL.
"8a72a1c7-3c91-4f5b-b39e-1d2c4e3f5a7b"
Query Parameters
Optional. The earliest time you want readings from. Format:
ISO 8601 UTC like 2026-05-10T00:00:00Z (the Z means UTC).
If you leave this off, the default range is the last 24
hours. To pull a different range, either set from and
to, or use the simpler ?last=... shorthand below.
If your team thinks in local time, convert to UTC first.
"2026-05-10T00:00:00Z"
Optional. The end time. Defaults to "now" if you set from
and leave this off, so "everything from May 10 onwards" is
just ?from=2026-05-10T00:00:00Z.
Same format as from: 2026-05-11T00:00:00Z.
Must be later than from. The total range can't be more
than 90 days.
"2026-05-11T00:00:00Z"
Shorthand for "the last N minutes / hours / days, up to
right now". Use this instead of from and to when you
don't want to compute timestamps yourself.
Format: a number followed by m (minutes), h (hours), or
d (days). Examples:
last=15m— last 15 minuteslast=24h— last 24 hourslast=7d— last 7 dayslast=30d— last 30 days
Maximum 90 days. If you pass last, any from / to you
also sent are ignored.
"30d"
Optional. Scope readings to a single assignment's period
(when that athlete owned the device, when that room used it).
Get IDs from GET /v1/devices/{device_id}/assignments.
With this set, the time window defaults to the assignment's
[started_at, ended_at). If you also pass ?from/?to/
?last, the result is the intersection of your range and
the assignment's window — a from outside the assignment
period is valid but returns an empty page.
Returns assignment_not_found (404) if the ID isn't visible
to your team or belongs to a different device on your
team than the one in the URL. (The two cases are
intentionally not distinguished — the response shape can't
be used to enumerate which UUIDs map to which sensors within
your team.)
"f4e9b8d2-1c3a-4f5b-9d6e-2a8b1c4d5e6f"
For long time ranges that return more than 1000 readings.
On your first call, leave this empty. If the response
includes a next_cursor value, there are more readings
waiting. Send that value back here on your next call to
get the next batch. Repeat until next_cursor comes back
as null.
Like a bookmark for the API: save your place, pick up where you left off. You don't need to understand the value itself, just send it back as-is.
"eyJ0ZWFtX2lkIjoiOWIzYTNi..."