このページでは、REST API の規約の概要と、一般的な Google Health API タスクのインデックス、各タスクの例について説明します。
REST API の規約
Google Health API は、Google API Improvement Proposals (AIP) 標準、具体的には AIP-127(HTTP と gRPC のトランスコーディング)と AIP-131 ~ AIP-135(標準メソッド)に準拠しています。これらの標準では、proto メッセージから 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"は、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"
}間隔の民事上の開始時刻でデータをフィルタする
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
エンドポイントを使用して、特定の「データソース ファミリー」のデータを取得します。これを行うには、dataSourceFamily パラメータをクエリ パラメータとして指定します。
次の表に、サポートされている dataSourceFamily オプションを示します。
| オプション | 説明 |
|---|---|
users/me/dataSourceFamilies/all-sources |
デフォルト値。 利用可能なすべてのデータソースのデータが含まれます。 |
users/me/dataSourceFamilies/google-wearables |
Google と Fitbit のトラッカー デバイス(Fitbit トラッカーや Google Pixel Watch など)のデータが含まれます。手動で記録されたデータは除外されます。 |
users/me/dataSourceFamilies/google-sources |
トラッカー デバイスのデータや手動で記録されたデータなど、Google のファーストパーティ データが含まれます。 |
2026-03-03 以降のトラッカーで記録された睡眠のみをフィルタする例を次に示します。
リクエスト
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
エンドポイントは、
1 日または複数日にわたってデータを集計する場合に
使用します。これは 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 アプリデータを挿入または
更新します。
ユーザーが「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
}
}
}食品を記録する
食品を記録するには、nutrition-log データポイント エンドポイントに POST リクエストを送信します。リクエストの本文には、nutritionLog オブジェクトを含む DataPoint が含まれます。
詳細については、栄養に関するガイドをご覧ください。
次に例を示します。
リクエスト
POST https://health.googleapis.com/v4/users/me/dataTypes/nutrition-log/dataPoints
Authorization: Bearer access-token
Content-Type: application/json
{
"nutritionLog": {
"interval": {
"startTime": "2026-06-16T12:00:00Z",
"endTime": "2026-06-16T12:30:00Z"
},
"foodDisplayName": "Banana",
"mealType": "LUNCH",
"energy": {
"kcal": 105
},
"totalCarbohydrate": {
"grams": 27
},
"totalFat": {
"grams": 0.3
}
}
}レスポンス
{
"done": true,
"response": {
"@type": "type.googleapis.com/google.devicesandservices.health.v4.DataPoint",
"name": "users/2515055256096816351/dataTypes/nutrition-log/dataPoints/567890",
"dataSource": {
"recordingMethod": "ACTIVELY_MEASURED",
"platform": "GOOGLE_WEB_API"
},
"nutritionLog": {
"interval": {
"startTime": "2026-06-16T12:00:00Z",
"startUtcOffset": "0s",
"endTime": "2026-06-16T12:30:00Z",
"endUtcOffset": "0s"
},
"energy": {
"kcal": 105
},
"totalCarbohydrate": {
"grams": 27
},
"totalFat": {
"grams": 0.3
},
"mealType": "LUNCH",
"foodDisplayName": "Banana"
}
}
}ユーザーの健康に関するデータを削除する
batchDelete
endpoint を使用して、ユーザーの 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"
}
}デバイス情報を確認する
list エンドポイントを使用して、ユーザーのアカウントにペア設定されているデバイスのリストを
取得します。これには、デバイスのモデル情報(deviceVersion)と、Google Health モバイルアプリと最後に同期した時刻(lastSyncTime)が含まれます。
リスト構成と同期情報は、同期の問題のトラブルシューティングや、最後の同期時刻以降の過去のデータの取得に役立ちます。
次に例を示します。
リクエスト
GET https://health.googleapis.com/v4/users/me/pairedDevices Authorization: Bearer access-token Accept: application/json
レスポンス
{
"pairedDevices": [
{
"name": "users/me/pairedDevices/123456",
"deviceType": "TRACKER",
"batteryStatus": "High",
"batteryLevel": 88,
"lastSyncTime": "2026-03-04T07:05:00Z",
"deviceVersion": "Charge 6",
"macAddress": "00:11:22:33:44:55",
"features": [
"STEPS",
"HEART_RATE"
]
}
]
}過去のデータにクエリを実行する
Google Health API の主なメリットの 1 つは、ユーザーのパフォーマンスを追跡し、健康状態を長期間にわたってモニタリングできることです。 ユーザーのデータは、記録されている限り遡ってクエリできます。API では、アプリケーションが使用できる過去のデータ量に制限はありません。
ただし、過去のデータのクエリは標準の レート制限の対象となります。これらの制限に対する API 呼び出しの数を減らすため、Google Health API では、日付範囲にわたるデータのクエリがサポートされています。ページネーションとリクエストの境界は次のとおりです。
- 各エンドポイントは、ページごとに最大 10,000 個のデータポイントを返します。
- クエリの日付範囲は、リクエストごとに 14 ~ 90 日に制限されます。
アプリケーションに必要な過去のデータ量によっては、データセット全体を取得するために複数の連続したリクエストが必要となり、追加の時間がかかることがあります。 アプリケーションのデータ同期プロセスを設計する際は、この点に注意してください。
最適なパフォーマンスを確保し、API エラーを回避するには、過去のデータをクエリする際に次のガイドラインに従ってください。
段階的なデータ同期(ホットロードとコールド スタートの読み込み)
- 初期の「ホット」ロード: プライマリ ロード シーケンス中に、過去 7 ~ 14 日間の最新データのみを取得してレンダリングします。これにより、長時間実行されるクエリを待つことなく、ユーザーにデータをすぐに表示できます。
- バックグラウンドでの「コールド」ロード: プライマリ UI のレンダリング後に、古い過去のデータの取得を非同期の低優先度キューまたはバックグラウンド プロセスに委任します。
時間ベースのクエリのチャンク分割
- 1 回の API 呼び出しで複数年または複数月の期間をリクエストしないでください。 大規模な過去のクエリを、より小さな連続した間隔 (リクエストごとに 1 週間など)に分割します。
- これらのサブクエリを安全にバッチ処理またはシーケンス処理して、同時実行の上限を守り UI の進行状況インジケーターを安定させます。
事前集計されたロールアップを活用する
事前集計された概要エンドポイント(DailyRollUpDataPoints など)を使用するように、概要ダッシュボードとトレンドグラフを再構築します。これにより、バックエンドのコンピューティング オーバーヘッドとクライアントへのネットワーク転送時間が大幅に短縮されます。
復元力のあるエラー処理(スマート再試行)
- レート制限(
429 Too Many Requests)とサーバー ゲートウェイ タイムアウト(504 Gateway Timeout)が発生した場合は、厳密な指数バックオフ処理を実装します。失敗した大きなペイロードをすぐに再試行しないでください。すぐに再試行すると、バックエンドの輻輳が増加し、 システムの劣化が加速します。 - クエリが繰り返しタイムアウトする場合は、より小さい 時間枠に自動的にフォールバックします(たとえば、1 週間のチャンクを 3 日に短縮します)。