このページでは、REST API の規約の概要と、一般的な Google Health API タスクのインデックス、各タスクの例について説明します。
REST API の規則
Google Health API は、Google API 改善提案(AIP)標準(特に AIP-127(HTTP と gRPC のコード変換)と AIP-131 ~ AIP-135(標準メソッド))に準拠しています。これらの標準は、proto メッセージから HTTP リクエストへのデータのマッピング方法を定義します。
クエリ パラメータ
クエリ パラメータは、データが URL の一部である場合に使用されます。これは主に GET リクエスト(リソースの取得)または LIST リクエスト(フィルタリング/ページネーション)に使用されますが、DELETE オペレーションにも使用されます。
- プレースメント:
?の後に URL に追加されます。 - 構文:
&で区切られた Key-Value ペア。 - マッピング: 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"は、proto の特定のフィールドのみが本文であることを意味します。
- 最適な用途: 複雑なオブジェクト、ネストされたメッセージ、センシティブ データ。
構文の例:
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"
}ハイブリッド ケース
AIP-134 準拠の Update メソッドまたは 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 エンコード。 |
日付
Google Health API の日付はすべて YYYY-MM-DD 形式で表示されます。Nutrition API は、次の条件で日付値の ISO-8601 標準をサポートしています。
- 4 桁の年
YYYY - 0000 ~ 9999 の範囲内の年値
- ISO-8601 標準または他のエポックで示される開始日の制限は適用されません
ヘッダー
Google Health API エンドポイントを実行するには、適切なヘッダーとアクセス トークンを使用する必要があります。GET リクエストと POST リクエストの両方で、次のヘッダーを使用することをおすすめします。
Authorization: Bearer access-token Accept: application/json
API タスク インデックス
このセクションでは、一般的な Google Health API タスクのインデックスと、各タスクの例を示します。
Fitbit または Google のユーザー ID を取得する
ユーザーが Google OAuth 2.0 を通じて同意した後、トークン レスポンスに Fitbit または Google のユーザー ID が含まれていません。ユーザー ID を取得するには、getIdentity エンドポイントを呼び出します。getIdentity は、Fitbit の以前のユーザー ID と Google ユーザー ID の両方を返します。
新しいユーザーが OAuth を通じて同意したらすぐに getIdentity エンドポイントを呼び出し、両方のユーザー ID を保存することをおすすめします。これにより、統合で下位互換性と上位互換性が提供されます。
次に例を示します。
リクエスト
GET https://health.googleapis.com/v4/users/me/identity Authorization: Bearer access-token Accept: application/json
レスポンス
{
"name": "users/me/identity",
"legacyUserId": "A1B2C3",
"healthUserId": "111111256096816351"
}1 日を通して収集されたイントラデイまたは詳細データを取得する
特定のデータ型の list エンドポイントを使用すると、そのデータ型でサポートされている間隔で、1 日を通して収集された詳細なデータや日中のデータを取得できます。
次に例を示します。
リクエスト
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"
}間隔の民事訴訟開始時刻でデータをフィルタする
filter パラメータを指定した list エンドポイントを使用して、民法上の時間または間隔でデータをフィルタします。
次に例を示します。
リクエスト
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"
}サンプル観測の物理時間でデータをフィルタする
filter パラメータを指定して list エンドポイントを使用すると、サンプル観測の物理時間でデータをフィルタできます。
次に例を示します。
リクエスト
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 エンドポイントを使用して、調整されたストリーム内の「データソース ファミリー」ごとにデータを取得します。
2026 年 3 月 3 日以降のトラッカーで記録された睡眠のみをフィルタリングする例を次に示します。
リクエスト
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 エンドポイントを使用して、ユーザーの物理時間(UTC)に基づく datetime 範囲で、秒単位のウィンドウに基づいてデータポイントの集計を返します。
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"
}
},
...
]
}1 日または複数日のデータを集計する
dailyRollUp エンドポイントは、windowSize と呼ばれる 1 日または複数日にわたってデータを集計する場合に使用します。リクエスト本文で、必要な間隔の閉区間 / 開区間の民事時間範囲を指定します。データ型に応じて、間隔の合計または平均が返されます。
次に例を示します。
リクエスト
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 アプリデータを挿入または更新します。
たとえば、ユーザーが「Scales R Us」社の「HumanScale」という体重計で体脂肪率を記録したとします。ユーザーの新しい体脂肪率は 2026 年 3 月 10 日時点で 20% です。
リクエスト
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"
}
}