На этой странице представлен обзор соглашений REST API, а также указатель распространенных задач Google Health API и примеры их выполнения.
Соглашения REST API
API Google Health соответствует стандартам Google API Improvement Proposals (AIP) , в частности AIP-127 (транскодирование HTTP и gRPC) и AIP-131–AIP-135 (стандартные методы). Эти стандарты определяют, как данные сопоставляются из протосообщения с HTTP-запросом.
Параметры запроса
Параметры запроса используются, когда данные являются частью URL-адреса. Это в основном относится к запросам GET (получение ресурса) или запросам LIST (фильтрация/пагинация), но также используется для операций DELETE .
- Размещение : Добавляется к URL-адресу после знака вопроса (
?. - Синтаксис : Пары ключ-значение, разделенные символом
&. - Сопоставление : Каждое поле в сообщении запроса, не являющееся частью шаблона пути URL, сопоставляется с параметром запроса.
- Лучше всего подходит для : простых типов данных (строки, целые числа, перечисления) и повторяющихся полей.
Пример синтаксиса:
GET https://health.googleapis.com/v4/users/me/dataTypes/data-type/dataPoints?page_size=10&filter=data_type.interval.start_time >= "2025-10-01T00:00:00Z"
Текст запроса
Тело запроса используется, когда данные изменяют состояние ресурса или слишком велики для URL-адреса. Обычно тело представляет собой JSON-представление самого ресурса. Как правило, используется для операций POST , PATCH и PUT .
- Размещение : Внутри HTTP-запроса (не виден в URL).
- Синтаксис : Отформатировано как JSON-объект.
- Сопоставление : определено в аннотации
google.api.http.-
body: "*"означает, что всё сообщение является его содержанием. -
body: "resource_name"означает, что только определенное поле в протоколе является телом.
-
- Наилучшее применение : сложные объекты, вложенные сообщения и конфиденциальные данные.
Пример синтаксиса:
POST https://health.googleapis.com/v4/users/me/dataTypes/data-type/dataPoints:rollUp
Content-Type: application/json
{
"range": {
"startTime": "2025-11-05T00:00:00Z",
"endTime": "2025-11-13T00:00:00Z"
},
"windowSize": "3600s"
}Гибридный случай
В методе Update соответствующем стандарту AIP-134, или в операции PATCH используются оба подхода. URL-адрес содержит имя ресурса, тело запроса содержит обновленные данные ресурса, а параметр запроса (обычно update_mask ) указывает, какие поля следует изменить.
PATCH https://health.googleapis.com/v4/projects/project-id/subscribers/subscriber-id
Content-Type: application/json
{
"endpointUri": "https://myapp.com/new-webhooks/health"
}
Основные отличия с первого взгляда
| Особенность | Параметры запроса | Текст запроса |
|---|---|---|
| Руководство AIP | Используется для поиска, фильтрации и операций чтения. | Используется для операций записи. |
| Видимость | Видно в истории браузера и журналах сервера. | Скрыто в URL-адресе. |
| Сложность | Ограничено плоскими или повторяющимися структурами. | Поддерживает глубоко вложенные JSON-объекты. |
| Кодирование | Необходимо закодировать в формате URL (например, пробелы становятся %20 ). | Стандартное кодирование JSON. |
Даты
Все даты в API Google Health отображаются в формате YYYY-MM-DD . API Nutrition поддерживает стандарт ISO-8601 для значений дат при соблюдении следующих условий:
- Четырехзначный год
YYYY - Годовые значения находятся в диапазоне 0000-9999
- Не применяется ограничение дат начала, предусмотренное стандартом ISO-8601 или другими эпохами.
Заголовки
Для выполнения запросов к API Google Health необходимо использовать соответствующие заголовки и токен доступа. Для запросов GET и POST рекомендуется использовать следующий заголовок:
Authorization: Bearer access-token Accept: application/json
индекс задач API
В этом разделе представлен указатель распространенных задач API Google Health и примеры выполнения каждой из них.
Получите идентификатор пользователя Fitbit или Google.
После того, как пользователь дает согласие через Google OAuth 2.0, ответ с токеном не содержит идентификатор пользователя Fitbit или Google. Чтобы получить идентификатор пользователя, вызовите конечную точку getIdentity . getIdentity возвращает как устаревший идентификатор пользователя Fitbit, так и идентификатор пользователя Google.
Мы рекомендуем, чтобы сразу после получения согласия нового пользователя через OAuth, вы вызывали конечную точку getIdentity и сохраняли оба идентификатора пользователя. Это обеспечит обратную и прямую совместимость вашей интеграции.
Например:
Запрос
GET https://health.googleapis.com/v4/users/me/identity Authorization: Bearer access-token Accept: application/json
Ответ
{
"name": "users/me/identity",
"legacyUserId": "A1B2C3",
"healthUserId": "111111256096816351"
}Получайте внутридневные или подробные данные, собранные в течение дня.
Используйте конечную точку list для определенного типа данных, чтобы получить внутридневные или подробные данные, собранные в течение дня с поддерживаемыми интервалами для этого типа данных.
Например:
Запрос
GET https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints Authorization: Bearer access-token Accept: application/json
Ответ
{
"dataPoints": [
{
"dataSource": {
"recordingMethod": "PASSIVELY_MEASURED",
"device": {
"manufacturer": "",
"displayName": "Charge 6"
},
"platform": "FITBIT"
},
"steps": {
"interval": {
"startTime": "2026-03-04T07:05:00Z",
"startUtcOffset": "0s",
"endTime": "2026-03-04T07:06:00Z",
"endUtcOffset": "0s",
"civilStartTime": {
"date": {
"year": 2026,
"month": 3,
"day": 4
},
"time": {
"hours": 7,
"minutes": 5
}
},
"civilEndTime": {
"date": {
"year": 2026,
"month": 3,
"day": 4
},
"time": {
"hours": 7,
"minutes": 6
}
}
},
"count": "40"
}
},
...
],
"nextPageToken": "Xm5h-6L0viZxIlRuWjx5bmvy98zj85uG34tuMn16mu2pntsnZI32iqhq"
}Фильтрация данных по интервалу времени начала гражданских работ.
Используйте конечную точку list с параметром filter для фильтрации данных по гражданскому времени или интервалу.
Например:
Запрос
GET https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints?filter=steps.interval.civil_start_time >= "2026-03-04T00:00:00" Authorization: Bearer access-token Accept: application/json
Ответ
{
"dataPoints": [
{
"dataSource": {
"recordingMethod": "PASSIVELY_MEASURED",
"device": {
"manufacturer": "",
"displayName": "Charge 6"
},
"platform": "FITBIT"
},
"steps": {
"interval": {
"startTime": "2026-03-04T07:05:00Z",
"startUtcOffset": "0s",
"endTime": "2026-03-04T07:06:00Z",
"endUtcOffset": "0s",
"civilStartTime": {
"date": {
"year": 2026,
"month": 3,
"day": 4
},
"time": {
"hours": 7,
"minutes": 5
}
},
"civilEndTime": {
"date": {
"year": 2026,
"month": 3,
"day": 4
},
"time": {
"hours": 7,
"minutes": 6
}
}
},
"count": "40"
}
...
],
"nextPageToken": "Xm5h-6L0viZxIlRuQjp5bml1bZ4ve2dhNmZvMnt4Yn7qIGQhbHN3YQ"
}Фильтрация данных по времени наблюдения выборки
Используйте конечную точку list с параметром filter для фильтрации данных по времени наблюдения образца.
Например:
Запрос
GET https://health.googleapis.com/v4/users/me/dataTypes/body-fat/dataPoints?filter=body_fat.sample_time.physical_time >= "2026-03-01T00:00:00Z" Authorization: Bearer access-token Accept: application/json
Ответ
{
"dataPoints": [
{
"name": "users/2515055256096816351/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": ""
}Фильтрация данных по источникам данных, таким как носимые устройства.
Используйте конечную точку reconcile , чтобы получить данные по "семейству источников данных" в согласованном потоке.
Вот пример фильтрации только данных о сне, записанных трекером за сутки после 03.03.2026:
Запрос
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
Ответ
{
"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": ""
}Сводные данные за определенный период времени.
Используйте конечную точку rollUp для возврата агрегированных данных за временной интервал в секундах, в диапазоне datetime , соответствующем физическому времени пользователя (в формате UTC).
При вызове конечной точки rollUp необходимо указать в теле запроса требуемый диапазон дат в гражданском времени пользователя. Например:
Запрос
POST https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints:rollUp
Authorization: Bearer access-token
Accept: application/json
{
"range": {
"startTime": "2026-02-17T17:00:00Z",
"endTime": "2026-02-17T17:59:59Z"
},
"windowSize": "30s"
}Ответ
{
"rollupDataPoints": [
{
"startTime": "2026-02-17T17:55:00Z",
"endTime": "2026-02-17T17:55:30Z",
"steps": {
"countSum": "41"
}
},
{
"startTime": "2026-02-17T17:54:00Z",
"endTime": "2026-02-17T17:54:30Z",
"steps": {
"countSum": "31"
}
},
...
]
}Агрегировать данные за один или несколько дней.
Конечная точка dailyRollUp используется, когда необходимо агрегировать данные за один или несколько дней ( windowSize ). В теле запроса укажите диапазон закрытого и открытого гражданского времени для требуемого интервала. В зависимости от типа данных вы получите либо сумму, либо среднее значение за интервал.
Например:
Запрос
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": 2,
"day": 26
},
"time": {
"hours": 0,
"minutes": 0,
"seconds": 0,
"nanos": 0
}
},
"end": {
"date": {
"year": 2026,
"month": 2,
"day": 26
},
"time": {
"hours": 23,
"minutes": 59,
"seconds": 59,
"nanos": 0
}
}
},
"windowSizeDays": 1
}Ответ
{
"rollupDataPoints": [
{
"civilStartTime": {
"date": {
"year": 2026,
"month": 2,
"day": 26
},
"time": {}
},
"civilEndTime": {
"date": {
"year": 2026,
"month": 2,
"day": 26
},
"time": {
"hours": 23,
"minutes": 59,
"seconds": 59
}
},
"steps": {
"countSum": "3822"
}
}
]
}Вставить или обновить данные о здоровье пользователя
Используйте конечную точку patch для добавления или обновления данных пользователя в приложении Fitbit.
Вот пример, когда пользователь зафиксировал процент жира в организме на весах "HumanScale" от компании "Scales R Us". Новое показание процента жира в организме пользователя составляет 20% на 10 марта 2026 года.
Запрос
PATCH https://health.googleapis.com/v4/users/me/dataTypes/body-fat/dataPoints/1234567890
Authorization: Bearer access-token
content-length: 329
{
"name": "bodyFatName",
"dataSource": {
"recordingMethod": "ACTIVELY_MEASURED",
"device": {
"formFactor": "SCALE",
"manufacturer": "Scales R Us",
"displayName": "HumanScale"
}
},
"bodyFat": {
"sampleTime": {
"physicalTime": "2026-03-10T10:00:00Z"
},
"percentage": 20
}
}Ответ
{
"done": true,
"response": {
"@type": "type.googleapis.com/google.devicesandservices.health.v4main.DataPoint",
"name": "users/2515055256096816351/dataTypes/body-fat/dataPoints/1234567890",
"dataSource": {
"recordingMethod": "ACTIVELY_MEASURED",
"device": {
"formFactor": "SCALE",
"manufacturer": "Scales R Us",
"displayName": "HumanScale"
},
"application": {
"googleWebClientId": "618308034039.apps.googleusercontent.com"
},
"platform": "GOOGLE_WEB_API"
},
"bodyFat": {
"sampleTime": {
"physicalTime": "2026-03-10T10:00:00Z"
},
"percentage": 20
}
}
}Удаление данных о состоянии здоровья пользователя
Используйте конечную точку batchDelete для удаления массива данных пользователя из приложения Fitbit.
Вот пример, когда пользователь ранее зафиксировал процент жира в организме на весах, но хочет удалить эту запись. Используя user-id и data-point-id из исходного действия вставки:
Запрос
POST https://health.googleapis.com/v4/users/me/dataTypes/body-fat/dataPoints:batchDelete
Authorization: Bearer access-token
Accept: application/json
content-length: 93
{
"names": [
"users/2515055256096816351/dataTypes/body-fat/dataPoints/1234567890"
]
}Ответ
{
"done": true,
"response": {
"@type": "type.googleapis.com/google.devicesandservices.health.v4main.BatchDeleteDataPointsResponse"
}
}