Lọc dữ liệu

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:

  • list endpoints (điểm cuối ): truy vấn các điểm dữ liệu thô.
  • reconcile endpoints: 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_time
Ngủ: 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ố dataSourceFamily rõ ràng hoặc có dataSourceFamily được đặt thành users/me/dataSourceFamilies/self-sources sẽ bị hạn chế ngầm định đối với self-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-wearables hoặc google-sources) chỉ với phạm vi ghi sẽ gặp lỗi 403 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 dataSourceFamily một cách rõ ràng trên list cho sleep, food hoặc food-measurement-unit sẽ không thành công với lỗi 400 Bad Request (INVALID_ARGUMENT).
  • Việc gọi list cho các loại dữ liệu này khi chỉ được cấp phạm vi ghi (trong đó hạn chế đối với self-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ỗi 403 Forbidden (PERMISSION_DENIED).
  • Để lọc các điểm dữ liệu sleep theo dataSourceFamily, hãy sử dụng điểm cuối reconcile.

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"
      }
    }
  ]
}