このページでは、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 dataPoints エンドポイントに 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
メソッドを使用して、ユーザーの 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 には、アプリケーションが使用できる過去のデータ量に制限はありません。
ただし、過去のデータのクエリは、標準の レート制限に則って行われます。システムの安定性を管理し、過剰なペイロードを防ぐため、Google Health API では、エンドポイント固有のページサイズで自動ページネーションを使用します。次の境界と動作に注意してください。
- 自動ページネーション: 長い期間のデータをクエリすると、API はそのエンドポイントのページサイズの上限までの結果の最初のページと
nextPageTokenのみを返します。nextPageTokenを使用して、後続のページをリクエストする必要があります。 - 可変ページサイズ: 上限はエンドポイント
とデータ型によって異なります。ほとんどのデータ型では、ページサイズの上限は 10,000 です。
ただし、
exerciseやsleepなどの特定のデータ型では、 デフォルトのページサイズと最大ページサイズの上限は 25 です。たとえば、クライアントが 過去 10 年間のすべての睡眠データをリクエストした場合でも、API は最初のページに 25 件の睡眠セッション のみを返します。 - ロールアップの日付範囲の制限: データ ロールアップ エンドポイントと集計エンドポイント
(
rollUpやdailyRollUpなど)の場合、クエリの日付範囲はデータ型に基づいて制限されます。calories-in-heart-rate-zone、heart-rate、active-minutes、total-caloriesの最大範囲は 14 日です。- 他のすべてのロールアップ データ型の最大範囲は 90 日です。
アプリケーションに必要な過去のデータ量に応じて、データセット全体を取得するには、ページを順番にページネーションする必要があります。 アプリケーションのデータ同期プロセスを設計する際は、この点に注意してください。
最適なパフォーマンスを確保し、API エラーを回避するには、過去のデータをクエリする際に次のガイドラインに従ってください。
段階的なデータ同期(ホットロードとコールド スタートの読み込み)
- 初期の「ホット」ロード: プライマリ ロード シーケンス中に、過去 7 ~ 14 日間の最新のデータのみを取得してレンダリングします。これにより、長時間実行されるクエリを待つことなく、ユーザーにデータをすぐに表示できます。
- バックグラウンドでの「コールド」ロード: プライマリ UI のレンダリング後に、古い過去のデータの取得を非同期の低優先度キューまたはバックグラウンド プロセスに委任します。
集計のためのクエリのチャンク化
- ロールアップ エンドポイントと日次ロールアップ エンドポイントでは、最大日付範囲の上限(データ型に応じて 14 日または 90 日)が適用されるため、大規模な過去の集計クエリを、これらの制限内のより小さな連続した間隔に分割する必要があります。
- これらのサブクエリをバッチ処理またはシーケンス処理して、同時実行の上限を尊重し UI の進行状況インジケーターを安定させます。
事前集計されたロールアップを活用する
事前集計された概要エンドポイント(DailyRollUpDataPoints など)を使用するように、概要ダッシュボードとトレンドグラフを再構築します。これにより、バックエンドのコンピューティング オーバーヘッドとクライアントへのネットワーク転送時間を大幅に削減できます。
復元力のあるエラー処理(スマート再試行)
- レート制限(
429 Too Many Requests)とサーバー ゲートウェイ タイムアウト(504 Gateway Timeout)が発生した場合は、厳密な指数バックオフ処理を実装します。失敗した大規模なペイロードをすぐに再試行しないでください。即時の再試行は、バックエンドの輻輳を増やし、システムのパフォーマンスを低下させます。