Google Health API dựa vào các biểu thức bộ lọc để hạn chế các điểm dữ liệu được trả về khi gọi các phương thức truy xuất tiêu chuẩn. Cụ thể, bộ lọc được dùng với:
listendpoints (điểm cuối ): truy vấn các điểm dữ liệu thô.reconcileendpoints: truy vấn các điểm dữ liệu luồng được đối chiếu.
Hướng dẫn này giải thích cách triển khai tính năng lọc, cú pháp và quy ước, đồng thời có ví dụ cho từng loại bản ghi.
Quy ước lọc
Google Health API triển khai các bộ lọc theo tiêu chuẩn Đề xuất cải tiến API của Google (AIP-160).
Tham số truy vấn
Bộ lọc được truyền bằng chuỗi truy vấn URL trong tham số filter.
Vì bộ lọc chứa các ký tự đặc biệt (chẳng hạn như <, >= và dấu ngoặc kép), nên bộ lọc phải được mã hoá URL khi được truyền trong yêu cầu HTTP.
Ví dụ: yêu cầu có bộ lọc steps.interval.civil_start_time >= "2026-03-04T00:00:00" phải được mã hoá thành:
GET https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints ?filter=steps.interval.civil_start_time%20%3E%3D%20%222026-03-04T00%3A00%3A00%22
Định dạng đặt tên
Nếu một loại dữ liệu có nhiều từ, thì định dạng của giá trị nhận dạng sẽ khác nhau giữa đường dẫn tài nguyên và bộ lọc:
- Đường dẫn điểm cuối: sử dụng dấu gạch ngang (ví dụ:
/dataTypes/body-fat). - Chuỗi bộ lọc: sử dụng dấu gạch dưới (ví dụ:
body_fat).
Nếu bạn dùng dấu gạch ngang trong giá trị nhận dạng bộ lọc, API sẽ trả về một 400 Bad Request kèm theo lý do lỗi INVALID_DATA_POINT_FILTER.
Các loại và trường bộ lọc
Các trường bạn sử dụng trong bộ lọc phụ thuộc vào loại bản ghi của loại dữ liệu mà bạn đang truy vấn. Bảng sau đây mô tả các trường được hỗ trợ cho từng loại bản ghi:
| Loại bản ghi | Mô tả | Các trường bộ lọc được hỗ trợ |
|---|---|---|
| Khoảng thời gian | Điểm dữ liệu được ghi lại trong một khoảng thời gian (ví dụ: steps, distance, calories). |
{dataType}.interval.start_time{dataType}.interval.civil_start_time
Ví dụ: steps.interval.civil_start_time
|
| Mẫu | Các quan sát tức thời hoặc các phép đo ngắn (ví dụ: weight, body-fat, blood-glucose). |
{dataType}.sample_time.physical_time{dataType}.sample_time.civil_time
Ví dụ: body_fat.sample_time.physical_time
|
| Hằng ngày | Chỉ số và thông tin tóm tắt hằng ngày (ví dụ: daily-heart-rate-variability). |
{dataType}.date
Ví dụ: daily_heart_rate_variability.date
|
| Phiên | Phiên người dùng kéo dài với các quy tắc tính thời gian chuyên biệt. |
Tập thể dục: {dataType}.interval.civil_start_timeNgủ: sleep.interval.end_time, sleep.interval.civil_end_timeĐiện tâm đồ: electrocardiogram.interval.start_time
Ví dụ: sleep.interval.civil_end_time
|
Các toán tử và quy tắc định dạng được hỗ trợ
Biểu thức bộ lọc phải tuân thủ các quy tắc định dạng sau:
Toán tử so sánh
Chỉ có hai toán tử so sánh được hỗ trợ:
| Đơn vị tổ chức | Mô tả |
|---|---|
>= |
Giới hạn dưới (bao gồm cả giới hạn này). |
< |
Giới hạn trên (không bao gồm). |
Việc sử dụng các toán tử so sánh khác (chẳng hạn như >, <= hoặc =) sẽ trả về một 400 Bad Request có INVALID_DATA_POINT_FILTER_RESTRICTION_COMPARATOR.
Toán tử logic
| Đơn vị tổ chức | Hỗ trợ |
|---|---|
AND |
Toán tử mặc định và duy nhất được hỗ trợ. Được dùng để kết hợp ranh giới bắt đầu và ranh giới kết thúc. |
OR |
Không được hỗ trợ. Việc sử dụng OR sẽ trả về 400 Bad Request với lý do lỗi INVALID_DATA_POINT_FILTER_EXPRESSION_STRUCTURE ("Bộ lọc phải là một liên từ hoặc chuỗi các hạn chế. Đã tìm thấy: DISJUNCTION"). |
Giá trị cố định thời gian
Các giá trị cố định về thời gian trong biểu thức bộ lọc phải sử dụng các định dạng sau:
| Loại thời gian | Yêu cầu | Ví dụ |
|---|---|---|
| Thời gian thực | Định dạng RFC 3339, kết thúc bằng Z hoặc độ lệch so với giờ UTC. Biểu thị các sự kiện trong thế giới thực theo giờ UTC. |
Đúng: "2026-03-01T00:00:00Z", "2026-03-01T00:00:00-08:00"Sai: "2026-03-01" |
| Giờ dân sự | Định dạng ISO 8601: YYYY-MM-DD[THH:mm:ss]. Biểu thị thời gian trên đồng hồ của người dùng, không phụ thuộc vào vị trí hoặc độ lệch múi giờ. |
Đúng: "2026-03-01", "2026-03-01T08:30:00" |
Lọc quy tắc xác thực
Bộ lọc tuân theo các quy tắc sau:
| Quy tắc | Mô tả | Ví dụ |
|---|---|---|
| Không có các loại thời gian hỗn hợp | Không kết hợp ranh giới thời gian thực tế và ranh giới thời gian dân sự. | Không hợp lệ: steps.interval.start_time >= "2026-03-01T00:00:00Z" AND steps.interval.civil_start_time < "2026-03-02"Lỗi: INVALID_DATA_POINT_FILTER_MIXED_TIME_RESTRICTIONS ("Bộ lọc không thể chứa cả phạm vi thời gian thực tế và phạm vi thời gian dân sự") |
| Không có loại dữ liệu hỗn hợp | Sử dụng các trường thuộc loại dữ liệu trong đường dẫn yêu cầu. | Không hợp lệ: Đường dẫn /users/.../dataTypes/steps/... có bộ lọc distance.interval.start_time >= "..."Lỗi: INVALID_DATA_POINT_FILTER_COLLECTION_MISMATCH ("Loại dữ liệu trong bộ lọc không khớp với bộ sưu tập loại dữ liệu mẹ") |
| Logic sắp xếp theo thời gian | Ranh giới trên phải lớn hơn ranh giới dưới. | Không hợp lệ: steps.interval.start_time >= "2026-03-02T00:00:00Z" AND steps.interval.start_time < "2026-03-01T00:00:00Z"Lỗi: INVALID_TIME_RANGE ("Thời gian kết thúc của truy vấn phải lớn hơn thời gian bắt đầu") |
| Định dạng hộp đựng | Sử dụng snake case khớp với tên loại dữ liệu. | Không hợp lệ: body-fat.sample_time.physical_time >= "..."Lỗi: INVALID_DATA_POINT_FILTER ("Bộ lọc không hợp lệ") |
API này trả về HTTP 400 Bad Request cho các bộ lọc không hợp lệ. Kiểm tra error.details[].metadata.detailedReasons để biết mã lý do gây ra lỗi.
Phạm vi OAuth bắt buộc
Để truy vấn các điểm dữ liệu bằng bộ lọc, người dùng được uỷ quyền phải cấp phạm vi OAuth có liên quan cho loại dữ liệu đó. Nếu thiếu phạm vi bắt buộc, API sẽ trả về trạng thái 403 Forbidden với MISSING_OAUTH_SCOPE.
Bảng sau đây liên kết các phạm vi OAuth với các loại dữ liệu mà chúng cấp quyền đọc. Bảng này hiển thị các phạm vi ở định dạng tương đối (ví dụ: .activity_and_fitness.readonly biểu thị https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly):
| Phạm vi OAuth bắt buộc | Loại dữ liệu |
|---|---|
.activity_and_fitness.readonly |
active-energy-burned, active-minutes, active-zone-minutes, activity-level, altitude, calories-in-heart-rate-zone, daily-vo2-max, distance, exercise, floors, run-vo2-max, sedentary-period, steps, swim-lengths-data, time-in-heart-rate-zone, total-calories, vo2-max |
.ecg.readonly |
điện tâm đồ |
.health_metrics_and_measurements.readonly |
đường huyết, lượng mỡ trong cơ thể, nhiệt độ cơ thể, sự thay đổi tần số tim hằng ngày, vùng tần số tim hằng ngày, độ bão hoà oxy hằng ngày, nhịp thở hằng ngày, tần số tim lúc nghỉ ngơi hằng ngày, các chỉ số nhiệt độ giấc ngủ hằng ngày, tần số tim, sự thay đổi tần số tim, chiều cao, độ bão hoà oxy, nhịp thở trong bản tóm tắt giấc ngủ, cảm biến nhiệt độ trên da, cân nặng |
.irn.readonly |
irregular-rhythm-notification |
.nutrition.readonly |
food, food-measurement-unit, hydration-log, nutrition-log |
.sleep.readonly |
ngủ |
Nếu máy khách của bạn chỉ được cấp phạm vi ghi (chẳng hạn như .activity_and_fitness.writeonly) cho một kiểu dữ liệu được yêu cầu, thì bạn vẫn có thể truy vấn các điểm dữ liệu mà máy khách của riêng bạn đã ghi. Trong trường hợp này, các yêu cầu sẽ bị hạn chế ngầm đối với họ nguồn dữ liệu self-sources. Để biết thông tin chi tiết và các hạn chế về kiểu dữ liệu, hãy xem phần Lọc theo họ nguồn dữ liệu.
Trường hợp sử dụng và ví dụ
Các ví dụ sau đây minh hoạ cách tạo bộ lọc cho các trường hợp phổ biến:
Truy vấn các bước theo phạm vi thời gian thực tế
Các bước truy vấn được ghi lại trong khoảng thời gian từ 2026-03-01T00:00:00Z (bao gồm) đến 2026-03-02T00:00:00Z (không bao gồm):
GET https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints ?filter=steps.interval.start_time >= "2026-03-01T00:00:00Z" AND steps.interval.start_time < "2026-03-02T00:00:00Z"
Truy vấn các bước theo phạm vi thời gian dân sự
Các bước truy vấn cho cả ngày 4 tháng 3 năm 2026, so với đồng hồ địa phương của người dùng:
GET https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints ?filter=steps.interval.civil_start_time >= "2026-03-04" AND steps.interval.civil_start_time < "2026-03-05"
Truy vấn lượng mỡ trong cơ thể theo thời gian lấy mẫu thực tế
Truy vấn các số đo lượng mỡ trong cơ thể được ghi lại từ tháng 3 năm 2026 (theo giờ UTC):
GET https://health.googleapis.com/v4/users/me/dataTypes/body-fat/dataPoints ?filter=body_fat.sample_time.physical_time >= "2026-03-01T00:00:00Z"
Trọng số truy vấn theo thời gian lấy mẫu dân sự
Nhật ký trọng số truy vấn được ghi lại sau một giờ địa phương cụ thể:
GET https://health.googleapis.com/v4/users/me/dataTypes/weight/dataPoints ?filter=weight.sample_time.civil_time >= "2026-03-01T08:00:00"
Truy vấn thông tin tóm tắt hằng ngày về sự thay đổi tần số tim
Truy vấn thông tin tóm tắt hằng ngày về sự thay đổi tần số tim (HRV) được ghi lại trước một ngày cụ thể:
GET https://health.googleapis.com/v4/users/me/dataTypes/daily-heart-rate-variability/dataPoints ?filter=daily_heart_rate_variability.date < "2026-08-15"
Truy vấn các phiên tập thể dục theo thời gian bắt đầu dân sự
Truy vấn các phiên tập thể dục diễn ra trong một tuần cụ thể theo múi giờ địa phương của người dùng:
GET https://health.googleapis.com/v4/users/me/dataTypes/exercise/dataPoints ?filter=exercise.interval.civil_start_time >= "2026-03-01" AND exercise.interval.civil_start_time < "2026-03-08"
Truy vấn phiên giấc ngủ theo thời gian kết thúc theo lịch
Truy vấn các bản ghi giấc ngủ theo thời gian kết thúc của phiên:
GET https://health.googleapis.com/v4/users/me/dataTypes/sleep/dataPoints ?filter=sleep.interval.civil_end_time >= "2026-03-04T05:00:00" AND sleep.interval.civil_end_time < "2026-03-04T12:00:00"
Truy vấn điện tâm đồ theo thời gian bắt đầu
Truy vấn bản ghi ECG bắt đầu từ một thời điểm thực tế theo giờ UTC. Xin lưu ý rằng các truy vấn ECG chỉ hỗ trợ phép so sánh >= trên start_time:
GET https://health.googleapis.com/v4/users/me/dataTypes/electrocardiogram/dataPoints ?filter=electrocardiogram.interval.start_time >= "2026-03-10T12:00:00Z"
Lọc theo họ nguồn dữ liệu
Nhóm nguồn dữ liệu là một nhóm nguồn dữ liệu hợp lý (chẳng hạn như đồng hồ thông minh, ứng dụng di động hoặc mục nhập thủ công). Thao tác này cho phép bạn tách biệt hoặc tổng hợp dữ liệu từ các loại nguồn cụ thể (ví dụ: thiết bị đeo thực tế, mục nhập thủ công hoặc dữ liệu do chính ứng dụng của bạn ghi).
Các điểm cuối list, reconcile, rollUp và dailyRollUp đều hỗ trợ tham số dataSourceFamily. Cơ chế truyền phụ thuộc vào điểm cuối:
| Điểm cuối (phương thức HTTP) | Cơ chế |
|---|---|
list (GET) |
Truyền dataSourceFamily dưới dạng tham số truy vấn URL. |
reconcile (GET) |
Truyền dataSourceFamily dưới dạng tham số truy vấn URL. |
rollUp (POST) |
Truyền dataSourceFamily dưới dạng một trường trong nội dung yêu cầu JSON. |
dailyRollUp (POST) |
Truyền dataSourceFamily dưới dạng một trường trong nội dung yêu cầu JSON. |
Các nhóm nguồn dữ liệu được hỗ trợ
Bảng sau đây mô tả các giá trị dataSourceFamily được hỗ trợ:
| Phương thức | Mô tả |
|---|---|
users/me/dataSourceFamilies/all-sources |
Giá trị mặc định (khi được cấp phạm vi đọc). Bao gồm các điểm dữ liệu từ tất cả các nguồn dữ liệu có sẵn của bên thứ nhất (1P) và bên thứ ba (3P). Dữ liệu của ứng dụng bên thứ ba sẽ được trả về khi bạn chọn cách này (chẳng hạn như số bước trên đồng hồ thông minh + số bước trên ứng dụng bên thứ ba + số bước trên điện thoại di động + số bước được nhập thủ công). |
users/me/dataSourceFamilies/google-wearables |
Bao gồm dữ liệu do Google và các thiết bị theo dõi của Fitbit ghi lại (chẳng hạn như thiết bị theo dõi đeo được của Fitbit và Pixel Watch). Không bao gồm dữ liệu được ghi nhật ký theo cách thủ công và dữ liệu do điện thoại ước tính. Hãy sử dụng lựa chọn này khi quá trình tích hợp của bạn yêu cầu dữ liệu đo từ xa thô của cảm biến do phần cứng thiết bị đeo ghi lại trực tiếp. |
users/me/dataSourceFamilies/google-sources |
Bao gồm các nguồn của bên thứ nhất là Google và Fitbit. Dữ liệu này bao gồm hồ sơ thiết bị theo dõi thể chất, dữ liệu từ Health Connect và mọi mục nhập thủ công được ghi lại thông qua các ứng dụng của bên thứ nhất (chẳng hạn như ứng dụng Fitbit hoặc Google Fit). |
users/me/dataSourceFamilies/self-sources |
Chỉ bao gồm dữ liệu mà ứng dụng gọi đã ghi thông qua Google Health API (các điểm dữ liệu có nguồn dữ liệu được đăng ký thông qua API bằng cùng một mã ứng dụng OAuth như ứng dụng gọi). |
Nếu không có điểm dữ liệu nào khớp với họ nguồn dữ liệu được yêu cầu, thì phản hồi sẽ là một danh sách trống thay vì một lỗi.
Phạm vi chỉ ghi và nguồn tự tạo
Những đối tượng gọi chỉ được cấp phạm vi ghi (chẳng hạn như .activity_and_fitness.writeonly) cho các loại dữ liệu được yêu cầu có thể đọc dữ liệu mà họ tự ghi và chỉ dữ liệu đó.
- Những yêu cầu không có tham số
dataSourceFamilyrõ ràng hoặc códataSourceFamilyđược đặt thànhusers/me/dataSourceFamilies/self-sourcessẽ bị hạn chế ngầm định đối vớiself-sources. - Việc yêu cầu bất kỳ họ nguồn dữ liệu nào khác (chẳng hạn như
all-sources,google-wearableshoặcgoogle-sources) chỉ với phạm vi ghi sẽ gặp lỗi403 Forbidden(PERMISSION_DENIED).
Hạn chế về loại dữ liệu trên điểm cuối danh sách
Trên điểm cuối list (users.dataTypes.dataPoints.list), việc lọc theo dataSourceFamily không được hỗ trợ cho các kiểu dữ liệu sleep, food và food-measurement-unit:
- Việc đặt
dataSourceFamilymột cách rõ ràng trênlistchosleep,foodhoặcfood-measurement-unitsẽ không thành công với lỗi400 Bad Request(INVALID_ARGUMENT). - Việc gọi
listcho các loại dữ liệu này khi chỉ được cấp phạm vi ghi (trong đó hạn chế đối vớiself-sourcesđược ngụ ý theo phạm vi của phương thức gọi) sẽ không thành công với lỗi403 Forbidden(PERMISSION_DENIED). - Để lọc các điểm dữ liệu
sleeptheodataSourceFamily, hãy sử dụng điểm cuốireconcile.
Ví dụ về họ nguồn dữ liệu
Để liệt kê các điểm dữ liệu thô mà ứng dụng của riêng bạn đã ghi cho một người dùng, hãy gọi điểm cuối list với tham số truy vấn dataSourceFamily được đặt thành users/me/dataSourceFamilies/self-sources.
Ví dụ: yêu cầu GET sau đây liệt kê các phép đo body-fat thô do ứng dụng gọi ghi từ ngày 2026-03-01:
Yêu cầu
GET https://health.googleapis.com/v4/users/me/dataTypes/body-fat/dataPoints ?dataSourceFamily=users/me/dataSourceFamilies/self-sources &filter=body_fat.sample_time.physical_time >= "2026-03-01T00:00:00Z" Authorization: Bearer access-token Accept: application/json
Phản hồi
{
"dataPoints": [
{
"name": "users/123456789/dataTypes/body-fat/dataPoints/1234567890",
"dataSource": {
"recordingMethod": "UNKNOWN",
"application": {
"packageName": "",
"webClientId": "",
"googleWebClientId": "google-web-client-id"
},
"platform": "GOOGLE_WEB_API"
},
"bodyFat": {
"sampleTime": {
"physicalTime": "2026-03-10T10:00:00Z",
"utcOffset": "0s",
"civilTime": {
"date": {
"year": 2026,
"month": 3,
"day": 10
},
"time": {
"hours": 10
}
}
},
"percentage": 20
}
}
],
"nextPageToken": ""
}Để nhận một luồng dữ liệu đã đối chiếu từ một nhóm nguồn dữ liệu cụ thể, hãy gọi điểm cuối reconcile bằng tham số truy vấn dataSourceFamily.
Ví dụ: yêu cầu GET sau đây sẽ tìm nạp giấc ngủ được ghi lại bằng thiết bị theo dõi cho ngày sau ngày 2026-03-03:
Yêu cầu
GET https://health.googleapis.com/v4/users/me/dataTypes/sleep/dataPoints:reconcile ?dataSourceFamily=users/me/dataSourceFamilies/google-wearables &filter=sleep.interval.civil_end_time >= "2026-03-03" Authorization: Bearer access-token Accept: application/json
Phản hồi
{
"dataPoints": [
{
"name": "users/2515055256096816351/dataTypes/sleep/dataPoints/2724123844716220216",
"dataSource": {
"recordingMethod": "DERIVED",
"device": {
"displayName": "Charge 6"
},
"platform": "FITBIT"
},
"sleep": {
"interval": {
"startTime": "2026-03-03T20:57:30Z",
"startUtcOffset": "0s",
"endTime": "2026-03-04T04:41:30Z",
"endUtcOffset": "0s"
},
"type": "STAGES",
"stages": [
{
"startTime": "2026-03-03T20:57:30Z",
"startUtcOffset": "0s",
"endTime": "2026-03-03T20:59:30Z",
"endUtcOffset": "0s",
"type": "AWAKE",
"createTime": "2026-03-04T04:43:40.937183Z",
"updateTime": "2026-03-04T04:43:40.937183Z"
},
{
"startTime": "2026-03-04T04:07:30Z",
"startUtcOffset": "0s",
"endTime": "2026-03-04T04:41:30Z",
"endUtcOffset": "0s",
"type": "AWAKE",
"createTime": "2026-03-04T04:43:40.937183Z",
"updateTime": "2026-03-04T04:43:40.937183Z"
}
],
"metadata": {
"stagesStatus": "SUCCEEDED",
"processed": true,
"main": true
},
"summary": {
"minutesInSleepPeriod": "464",
"minutesAfterWakeUp": "0",
"minutesToFallAsleep": "0",
"minutesAsleep": "407",
"minutesAwake": "57",
"stagesSummary": [
{
"type": "AWAKE",
"minutes": "56",
"count": "12"
},
{
"type": "LIGHT",
"minutes": "198",
"count": "19"
},
{
"type": "DEEP",
"minutes": "114",
"count": "10"
},
{
"type": "REM",
"minutes": "94",
"count": "4"
}
]
},
"createTime": "2026-03-04T04:43:40.337983Z",
"updateTime": "2026-03-04T04:43:40.937183Z"
}
}
],
"nextPageToken": ""
}Để tổng hợp các điểm dữ liệu trong một kích thước cửa sổ cụ thể bị giới hạn ở một họ nguồn dữ liệu cụ thể, hãy gọi điểm cuối rollUp và truyền trường dataSourceFamily vào nội dung yêu cầu JSON.
Yêu cầu POST sau đây truy vấn số bước đi trong ngày theo khoảng thời gian hằng giờ (3600s), được tổng hợp riêng từ các thiết bị đeo:
Yêu cầu
POST https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints:rollUp
Authorization: Bearer access-token
Accept: application/json
{
"range": {
"startTime": "2026-07-29T00:00:00Z",
"endTime": "2026-07-29T23:59:59Z"
},
"windowSize": "3600s",
"dataSourceFamily": "users/me/dataSourceFamilies/google-wearables"
}Phản hồi
{
"rollupDataPoints": [
{
"startTime": "2026-07-29T08:00:00Z",
"endTime": "2026-07-29T09:00:00Z",
"steps": {
"countSum": "1200"
}
},
{
"startTime": "2026-07-29T09:00:00Z",
"endTime": "2026-07-29T10:00:00Z",
"steps": {
"countSum": "3450"
}
}
]
}Để tổng hợp các điểm dữ liệu hằng ngày cho một họ nguồn cụ thể, hãy gọi điểm cuối dailyRollUp và truyền trường dataSourceFamily vào nội dung yêu cầu.
Ví dụ: yêu cầu sau đây tính toán các bản tổng hợp hằng ngày cho số bước của người dùng, bao gồm tất cả các nguồn của Google và Fitbit (thiết bị đeo + mục nhập thủ công):
Yêu cầu
POST https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints:dailyRollUp
Authorization: Bearer access-token
Accept: application/json
{
"range": {
"start": {
"date": {
"year": 2026,
"month": 7,
"day": 28
},
"time": {
"hours": 0,
"minutes": 0,
"seconds": 0,
"nanos": 0
}
},
"end": {
"date": {
"year": 2026,
"month": 7,
"day": 30
},
"time": {
"hours": 0,
"minutes": 0,
"seconds": 0,
"nanos": 0
}
}
},
"windowSizeDays": 1,
"dataSourceFamily": "users/me/dataSourceFamilies/google-sources"
}Phản hồi
{
"rollupDataPoints": [
{
"civilStartTime": {
"date": {
"year": 2026,
"month": 7,
"day": 28
},
"time": {}
},
"civilEndTime": {
"date": {
"year": 2026,
"month": 7,
"day": 28
},
"time": {
"hours": 23,
"minutes": 59,
"seconds": 59
}
},
"steps": {
"countSum": "8430"
}
},
{
"civilStartTime": {
"date": {
"year": 2026,
"month": 7,
"day": 29
},
"time": {}
},
"civilEndTime": {
"date": {
"year": 2026,
"month": 7,
"day": 29
},
"time": {
"hours": 23,
"minutes": 59,
"seconds": 59
}
},
"steps": {
"countSum": "11245"
}
}
]
}