エンドポイント

このページでは、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 表現です。通常、POSTPATCHPUT オペレーションに使用されます。

  • 配置: 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 エンドポイントまたは reconcile エンドポイントを使用します。

詳細なガイドライン、フォーマット ルール、検証エラー、クエリ の例については、データをフィルタするガイドをご覧ください。

データソース ファミリーでフィルタする

特定タイプのソース(物理的なウェアラブル デバイスと手動入力など)のデータを分離または集計するには、dataSourceFamily パラメータを使用します。

reconcilerollUpdailyRollUp の詳細なガイドライン、サポートされているファミリー、リクエストとレスポンスの例については、データをフィルタするガイドのデータソース ファミリーでフィルタするをご覧ください。

間隔の開始時刻でデータをフィルタする

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/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": ""
}

データソース ファミリーでフィルタして集計する

データソース ファミリー は、データソース(スマートウォッチ、モバイルアプリ、手動入力など)の論理グループです。これにより、特定タイプのソース(物理的なウェアラブル デバイスと手動入力など)のデータを分離または集計できます。

reconcilerollUpdailyRollUp エンドポイントはすべて dataSourceFamily パラメータをサポートしています。渡すメカニズムはエンドポイントによって異なります。

エンドポイント(HTTP メソッド) メカニズム
reconcile(GET) dataSourceFamily を URL クエリ パラメータとして渡します。
rollUp(POST) dataSourceFamily を JSON リクエストの本文のフィールドとして渡します。
dailyRollUp(POST) dataSourceFamily を JSON リクエストの本文のフィールドとして渡します。

サポートされているデータソース ファミリー

次の表に、サポートされている dataSourceFamily の値を示します。

オプション 説明
users/me/dataSourceFamilies/all-sources デフォルト値。 登録されているすべてのファースト パーティ(1P)とサードパーティ(3P)のデータソースで調整されたデータポイントを返します。このオプションを指定すると、サードパーティ製アプリのアプリデータ(スマートウォッチの歩数 + サードパーティ製アプリの歩数 + モバイルの歩数 + 手動入力の歩数など)が返されます。
users/me/dataSourceFamilies/google-wearables Google と Fitbit トラッカー デバイス(Fitbit ウェアラブル トラッカーや Pixel Watch など)で記録されたデータが含まれます。手動で記録されたデータと、スマートフォンで推定されたデータは除外されます。統合で、ウェアラブル ハードウェアで直接記録された未加工のセンサー テレメトリーが必要な場合は、このオプションを使用します。
users/me/dataSourceFamilies/google-sources Google と Fitbit のファースト パーティのソースが含まれます。これには、物理的なトラッカー デバイスの記録、ヘルスコネクトのデータ、ファースト パーティ アプリ(Fitbit アプリや Google Fit など)で記録された手動入力が含まれます。

特定のデータソース ファミリーから調整されたデータ ストリームを取得するには、dataSourceFamily クエリ パラメータを指定して reconcile エンドポイントを呼び出します。

たとえば、次の GET リクエストは、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 エンドポイントを呼び出し、JSON リクエストの本文に dataSourceFamily フィールドを渡します。

次の POST リクエストは、ウェアラブル デバイスからのみ集計された、1 時間間隔(3600s)の日中の歩数をクエリします。

リクエスト

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

レスポンス

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

特定のソース ファミリーの日次データポイントを集計するには、dailyRollUp エンドポイントを呼び出し、リクエストの本文に dataSourceFamily フィールドを渡します。

たとえば、次のリクエストは、すべてのファースト パーティの Google と Fitbit のソース(ウェアラブル + 手動入力)を含む、ユーザーの歩数の日次ロールアップを計算します。

リクエスト

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

レスポンス

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

一定期間のデータポイントを集計する

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 日または複数日にわたってデータを集計する

windowSize と呼ばれる 1 日または複数日にわたってデータを集計する場合は、dailyRollUp エンドポイントを使用する必要があります。リクエストの本文に必要な間隔の半開区間の時刻範囲を指定します。データ型に応じて、間隔の合計または平均が返されます。

次に例を示します。

リクエスト

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

範囲がウィンドウ サイズの倍数でない場合のバケット化

リクエストされた範囲が windowSize(または windowSizeDays)の正確な倍数でない場合、最後のバケットは範囲の上限で切り捨てられ、ウィンドウ サイズよりも短い期間になります。API はリクエストをそのまま受け入れ、丸め、時間シフト、データ補間は行いません。

リクエストされた範囲全体をカバーするために、API は切り上げ除算を使用して集計ウィンドウの合計数を計算します。

Number of windows = ceiling(Range duration / Window size)

すべてのバケットは、範囲の先頭から順番に開始されます。別のフルサイズのウィンドウを追加すると、リクエストされた終了時刻を超える場合、最後のウィンドウは範囲の終了時刻で切り捨てられます。

バケット化の仕組み

割り切れない範囲でロールアップをリクエストすると、API は次のルールを適用します。

  • バケット化は、リクエストされた範囲の先頭 (range.startTime または range.start)から始まり、ウィンドウ サイズ(windowSize または windowSizeDays)ずつ進みます。
  • 最後のバケットは、リクエストされた 範囲(range.endTime または range.end)の末尾で切り捨てられます。つまり、リクエストされたウィンドウ サイズよりも短い 期間になります。
  • 返される RollupDataPoint オブジェクトまたは DailyRollupDataPoint オブジェクトは、独自の開始タイムスタンプと終了タイムスタンプを明示的に指定します。これを使用して、切り捨てられたバケットの実際の期間を確認できます。
  • API はロールアップ データを新しい順に返すため、最後のバケット(切り捨てられたバケット)は、返されたリストの最初の要素(index 0)として表示されます。

シナリオ: 5 分間のウィンドウで 12 分間の範囲

クライアントが 5 分間の windowSize で 12 分間の範囲のロールアップをリクエストするとします。

  • range.startTime: 10:00:00
  • range.endTime: 10:12:00(合計時間: 12 分)
  • windowSize: 5 minutes

12 分は 5 分の倍数ではないため(12 = 5 * 2 + 2)、API はリクエストを受け入れ、ウィンドウの数を ceiling(12 / 5) = 3 として計算します。

これにより、次の 3 つのバケットが生成されます。

  1. バケット 1: [10:00:00, 10:05:00) - 期間: 5 分(フルウィンドウ)
  2. バケット 2: [10:05:00, 10:10:00) - 期間: 5 分(フルウィンドウ)
  3. バケット 3(切り捨て): [10:10:00, 10:12:00) - 期間: 2 分(range.endTime で切り捨て)

集計値への影響

最後のウィンドウの期間が短いため、加算指標(歩数の合計やカウントなど)は、時間トラックが短いため、切り捨てられたバケットで低くなります。

ユーザーがこの 12 分間の範囲全体で 1 分あたり 100 歩のペースで歩いている場合:

  • バケット 1(10:00 ~ 10:05): 500 歩(5 分 × 100 歩/分)
  • バケット 2(10:05 ~ 10:10): 500 歩(5 分 × 100 歩/分)
  • バケット 3(10:10 ~ 10:12): 200 歩(2 分 × 100 歩/分)

順序を示す API レスポンスの例

API は結果を新しい順に返すため、切り捨てられたバケットは返されたリストの最初の要素として表示されます。

{
  "rollupDataPoints": [
    {
      "startTime": "2026-08-20T10:10:00Z",
      "endTime": "2026-08-20T10:12:00Z",
      "steps": {
        "countSum": "200"
      }
    },
    {
      "startTime": "2026-08-20T10:05:00Z",
      "endTime": "2026-08-20T10:10:00Z",
      "steps": {
        "countSum": "500"
      }
    },
    {
      "startTime": "2026-08-20T10:00:00Z",
      "endTime": "2026-08-20T10:05:00Z",
      "steps": {
        "countSum": "500"
      }
    }
  ]
}

ユーザーの健康に関するデータを更新する

patch エンドポイントを使用して、 ユーザーの健康に関するデータを更新します。

patch エンドポイントは、リクエスト URL で指定された識別子に基づいて既存のレコードを更新します。以前に挿入されたデータポイントの識別子を指定します。API は既存のレコードを上書きします。

データポイント識別子を使用する場合

データポイント識別子は、次のシナリオで不可欠です。

  • ターゲットを絞った更新: 特定の測定値を更新するには、patch リクエストでその識別子を指定します。
  • 削除: 識別子を保持すると、アプリケーションはレコードを削除できます 後で batchDelete エンドポイントを使用して。

次に、ユーザーが「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-Type: application/json

{
  "name": "users/me/dataTypes/body-fat/dataPoints/1234567890",
  "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/123456789/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/123456789/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-iddata-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/123456789/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 です。 ただし、exercisesleep などの特定のデータ型では、 デフォルトのページサイズと最大ページサイズは 25 に制限されます。たとえば、クライアントが 過去 10 年間のすべての睡眠データをリクエストした場合でも、API は最初のページに 25 件の睡眠セッション のみを返します。
  • ロールアップの日付範囲の制限: データロールアップ エンドポイントと集計エンドポイント (rollUpdailyRollUp など)の場合、クエリの日付範囲はデータ型に基づいて制限されます。
    • calories-in-heart-rate-zoneheart-rateactive-minutestotal-calories の最大範囲は 14 日です。
    • 他のすべてのロールアップ データ型の最大範囲は 90 日です。

アプリケーションに必要な過去のデータ量に応じて、データセット全体を取得するには、ページを順番にページネーションする必要があります。 アプリケーションのデータ同期プロセスを設計する際は、この点に注意してください。

最適なパフォーマンスを確保し、API エラーを回避するには、過去のデータをクエリする際に次のガイドラインに従ってください。

段階的なデータ同期(ホットロードとコールド スタートの読み込み)

  • 最初の「ホット」ロード: プライマリ ロード シーケンス中に、過去 7 ~ 14 日間の最新のデータのみを取得してレンダリングします。これにより、ユーザーは長時間実行されるクエリを待つことなく、すぐにデータを確認できます。
  • バックグラウンドでの「コールド」ロード: プライマリ UI がレンダリングされたら、古い過去のデータの取得を非同期の低優先度キューまたはバックグラウンド プロセスに委任します。

集計のためのクエリのチャンク分割

  • ロールアップ エンドポイントと日次ロールアップ エンドポイントでは、最大日付範囲の制限(データ型に応じて 14 日または 90 日)が適用されるため、大規模な過去の集計クエリを、これらの制限内の小さな連続した間隔に分割する必要があります。
  • これらのサブクエリをバッチ処理またはシーケンス処理して、同時実行の上限を守り UI の進行状況インジケーターを安定させます。

事前集計されたロールアップを活用する

事前集計された概要エンドポイント(DailyRollUpDataPoints など)を使用するように、概要ダッシュボードとトレンドグラフを再構築します。これにより、バックエンドのコンピューティング オーバーヘッドとクライアントへのネットワーク転送時間が大幅に短縮されます。

復元力のあるエラー処理(スマート再試行)

  • レート制限(429 Too Many Requests)とサーバー ゲートウェイ タイムアウト(504 Gateway Timeout)が発生した場合は、厳密な指数バックオフ処理を実装します。失敗した大きなペイロードをすぐに再試行しないでください。すぐに再試行すると、バックエンドの輻輳が増加し、 システムの劣化が加速します。