Download one user's intra-day detail data
curl --request GET \
--url https://web-api.dev.soxai.site/api/DailyDetailData/{query_uid} \
--header 'Authorization: Bearer <token>'import requests
url = "https://web-api.dev.soxai.site/api/DailyDetailData/{query_uid}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://web-api.dev.soxai.site/api/DailyDetailData/{query_uid}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));[
{
"_time": "2026-01-01T00:00:00+00:00",
"uid": "user123",
"health_hr_mean": 66,
"health_spo2_100": 98,
"sleep_stage": 1
}
]{
"error": "bad-request",
"error_msg": "Invalid start_time. Use a duration such as '-30d', an RFC3339 timestamp such as '2026-01-01T00:00:00Z', a date such as '2026-01-01', unix seconds, or 'now()'."
}{
"error": "http-error",
"error_msg": "Invalid authentication credentials. <reason>"
}{
"error": "forbidden",
"error_msg": "Not enough permission"
}{
"error": "not-found",
"error_msg": "User '<uid>' not found"
}{
"error": "unprocessable-entity",
"error_msg": "body.<field>: <validation message>"
}{
"error": "rate-limited",
"error_msg": "Rate limit exceeded. Retry after <n> seconds."
}{
"error": "internal-server-error",
"error_msg": "Failed to fetch data: <error_message>"
}Data (v1)
Download one user's intra-day detail data
Download intra-day detail records (SX_Detail_Prod) for one user, as
CSV or JSON.
These are the within-day measurements behind the daily summary. Field names are the raw
database names; /api/v2/DailyDetailData/{query_uid} returns the same data with standardized
names.
Parameters
query_uid(path, required) - the user whose records are read.start_time/stop_time(query, optional) - range bounds. Each accepts a Flux duration (-30d), an RFC3339 timestamp, a date (2026-01-01), unix seconds, ornow(). When omitted they followpage.page(query, optional, default0) - selects a 30-day window counted back from now.format(query, optional) -csv(default) returns a file download;jsonreturns the records inline.
Response
200with the records sorted by_timeascending, or{"msg": "No data found"}when the range holds none.
Errors
| Status | Condition |
|---|---|
| 400 | start_time or stop_time is not a form Flux reads as a range |
| 403 | The caller is asking for somebody else’s data without a role that allows it, or is a PartnerAdmin and query_uid is not registered under its company |
| 404 | query_uid belongs to no SOXAI account |
Authorization
- Scheme:
Authorization: Bearer <idToken>orsoxai-api-key: <api key>. - Reading one’s own
query_uidneeds no role. - Otherwise
AdminorPartnerAdmin, and aPartnerAdminreaches only the users registered under its own company.OrgAdminis not accepted here;/api/v2/DailyDetailData/{query_uid}does accept it.
Response fields
Common fields
| Field | Unit | Description |
|---|---|---|
_time | datetime | Time: Data timestamp |
_measurement | string | Measurement Type: Type of measurement data |
uid | string | User ID: User identifier |
cal_record | string | Calorie Record: Calorie record data |
table | count | Table: Table number |
SX_Detail_Prod
| Field | Unit | Description |
|---|---|---|
activity_act_mlc | category | Activity - Edge Processing Data: Edge processing data (act_mlc) |
activity_actigraph | count | Activity - Actigraph: Measured activity count |
activity_calorie | kcal | Activity - Calories Burned: Calories burned |
activity_steps | count | Activity - Steps: Number of steps |
activity_METs | METs | Activity - METs: Physical activity intensity in multiples of the resting metabolic rate |
health_T | °C | Health - Skin Temperature: Skin temperature |
health_hr_mean | bpm | Health - Heart Rate: Average heart rate |
health_hrv_mean | ms | Health - Heart Rate Variability: Heart rate variability (RMSSD) |
health_spo2_100 | % | Health - Blood Oxygen Saturation: Blood oxygen saturation |
health_stress | pt | Health - Stress Level: Stress level |
sleep_ahi | index | Sleep - ODI: 3% oxygen desaturation index (ODI) |
sleep_hr_mean | bpm | Sleep - Heart Rate: Heart rate during sleep |
sleep_hrv_mean | ms | Sleep - Heart Rate Variability: Heart rate variability during sleep (RMSSD) |
sleep_respiration | breath/min | Sleep - Respiratory Rate: Respiratory rate |
sleep_sleep | category | Sleep - Stage (5 Categories): Sleep stage (-1: awake, 0: REM, 1: N1, 2: N2, 3: N3) |
sleep_stage | category | Sleep - Stage (4 Categories): Sleep stage (0: deep sleep, 1: light sleep, 2: REM, 3: awake or undetermined) |
sleep_sleep_1min | category | Sleep - 1-Minute Stage (5 Categories): Sleep stage for each minute, one digit per minute joined into an integer (0: REM, 1: N1, 2: N2, 3: N3, 4: awake, 5: undetermined) |
sleep_stage_1min | category | Sleep - 1-Minute Stage (4 Categories): Sleep stage for each minute, one digit per minute joined into an integer (0: deep sleep, 1: light sleep, 2: REM, 3: awake or undetermined) |
user_valid | flag | User - Validity Flag: Data validity flag (1: valid, 0: invalid) |
user_wear | flag | User - Wear Flag: Wear flag (1: worn, 0: not worn) |
utc_offset_mins | mins | UTC Offset: Time difference from UTC in minutes |
activity_confirm | flag | Activity - Confirmation Flag: Data confirmation flag (1: confirmed, 0: unconfirmed) |
activity_type | category | Activity - Type: Activity type (0: resting, 1: walking, 2: running, 3: other, 9: unknown) |
activity_strength | ratio | Activity - Intensity: Index of activity intensity |
GET
/
api
/
DailyDetailData
/
{query_uid}
Download one user's intra-day detail data
curl --request GET \
--url https://web-api.dev.soxai.site/api/DailyDetailData/{query_uid} \
--header 'Authorization: Bearer <token>'import requests
url = "https://web-api.dev.soxai.site/api/DailyDetailData/{query_uid}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://web-api.dev.soxai.site/api/DailyDetailData/{query_uid}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));[
{
"_time": "2026-01-01T00:00:00+00:00",
"uid": "user123",
"health_hr_mean": 66,
"health_spo2_100": 98,
"sleep_stage": 1
}
]{
"error": "bad-request",
"error_msg": "Invalid start_time. Use a duration such as '-30d', an RFC3339 timestamp such as '2026-01-01T00:00:00Z', a date such as '2026-01-01', unix seconds, or 'now()'."
}{
"error": "http-error",
"error_msg": "Invalid authentication credentials. <reason>"
}{
"error": "forbidden",
"error_msg": "Not enough permission"
}{
"error": "not-found",
"error_msg": "User '<uid>' not found"
}{
"error": "unprocessable-entity",
"error_msg": "body.<field>: <validation message>"
}{
"error": "rate-limited",
"error_msg": "Rate limit exceeded. Retry after <n> seconds."
}{
"error": "internal-server-error",
"error_msg": "Failed to fetch data: <error_message>"
}Authorizations
HTTPBearerSoxaiApiKey
Query Parameters
Response
The intra-day detail records under their stored field names, sorted by _time ascending. A range holding no rows answers with the No data found message rather than an empty array.