Google Health API を使用してワークアウト エクスペリエンスを開発する

Google Health API は、exercise セッション データタイプを使用して、ユーザーのワークアウト セッションとエクササイズ履歴を追跡します。セッションは、アクティビティのメタデータ、一時停止イベントと再開イベント、ラップまたはスプリット、概要指標をバンドルするコンテナとして機能します。

アプリでワークアウトを読み取り、書き込み、構造化して、ユーザーに最適なエクスペリエンスを提供する方法を理解します。

サポートされるデータタイプ

この API は、ワークアウトとアクティビティ セッションをトラッキングするための次のデータタイプをサポートしています。

表: Google Health API のワークアウト データタイプ
データ型 利用可能な
オペレーション
スコープ
エクササイズ
dataType: exercise
filter parameter: exercise
レコードタイプ: セッション

対応デバイス

list、get、reconcile、create、update、batchDelete .activity_and_fitness.readonly
.activity_and_fitness.writeonly

ワークアウト セッションでは exercise データ型をコンテナとして使用しますが、ウェアラブル デバイスはセッション中に詳細な高頻度テレメトリーも記録します。Google Health API では、これらの詳細なイントラデイ テレメトリー データタイプは読み取り専用であり、独自の REST エンドポイントを介して直接作成または変更することはできません。REST API を介してワークアウト セッションを書き込む場合は、exercise データポイントの metricsSummary オブジェクト内でワークアウトの集計指標を渡します。

次の表は、exercise.metricsSummary 内のサマリー フィールドを、そのワークアウトの時間枠でクエリできる、対応する読み取り専用のイントラデイ テレメトリー データ型にマッピングしたものです。

概要フィールド(metricsSummary) イントラデイ テレメトリー データタイプの名前 API テレメトリー データタイプ ID(読み取り専用) フィルタ フィールド(?filter=) 必要な読み取り OAuth スコープ
caloriesKcal アクティブ消費カロリー active-energy-burned active_energy_burned.interval.start_time activity_and_fitness.readonly
distanceMillimeters 距離 distance distance.interval.start_time activity_and_fitness.readonly
steps 手順 steps steps.interval.start_time activity_and_fitness.readonly
averageHeartRateBeatsPerMinute 心拍数 heart-rate heart_rate.sample_time.physical_time health_metrics_and_measurements.readonly
activeZoneMinutes アクティブ ゾーン時間 active-zone-minutes active_zone_minutes.interval.start_time activity_and_fitness.readonly

以降のセクションでは、REST 表現の例、GPS ルートの処理、統合ガイドラインなど、exercise データ型の技術的な詳細について説明します。

ワークアウト セッション

毎日のアクティビティやワークアウトを exercise セッションのデータポイントとして書き込みます。各データポイントは、セッション全体を記述し、イベント間隔(一時停止や再開アクションなど)を詳細に示し、要約指標(全体的な距離、歩数、平均心拍数など)を提供します。

セッション属性

エクササイズのデータポイントを構成する際は、次のコア コンポーネントを確認してください。

  • セッション時間(interval): ワークアウト セッション全体の開始時間と終了時間、およびその時点で有効なタイムゾーン オフセット。
  • アクティビティ タイプ(exerciseType): 実行されたアクティビティのカテゴリ(RUNNING、WALKING、BIKING、AEROBIC_WORKOUT など)。身体トレーニングの正確なタイプを指定します。
  • 表示名(displayName): ワークアウト セッションのユーザー フレンドリーな名前。REST API を介して作成されると、サーバーは exerciseType のローカライズされた表示名(RUNNING の "Run" など)を入力します。
  • アクティブな時間(activeDuration): ワークアウトの実際のアクティブな時間。一時停止の間隔は除きます。標準の形式では Duration 形式(例: "1800s")が使用されます。サーバーでは、activeDuration はセッション interval から exerciseEvents の PAUSE / RESUME または AUTO_PAUSE / AUTO_RESUME の間隔を引いて計算されます。

サマリー指標

metricsSummary ネストされたオブジェクトには、エクササイズ セッションの全期間にわたって計算された合計指標と平均指標が含まれます。

  • caloriesKcal: ワークアウト中の総アクティブ消費カロリー。キロカロリー(kcal)単位で測定されます。
  • distanceMillimeters: 走行した合計距離。単位間で高い精度を維持するため、ミリメートル単位で測定されます。
  • steps: エクササイズ中の合計歩数。
  • averageHeartRateBeatsPerMinute: セッションのアクティブな時間(分)におけるユーザーの平均心拍数。
  • activeZoneMinutes: ワークアウト中に獲得したアクティブ ゾーン時間の累計。
  • averageSpeedMillimetersPerSecond: 平均移動速度(ミリメートル/秒)。
  • averagePaceSecondsPerMeter: セッションのアクティブな時間(分)の平均ペース(秒/メートル)。
  • elevationGainMillimeters: セッション中の合計獲得標高。

ラップとスプリット

サポートされているデバイスから同期されたラップ(トラックランやプールスイミングなど)を含むワークアウトの場合、splitSummaries はセッションをラップまたはスプリットごとに分割します。

各スプリットには次のものが含まれます。

  • 特定の startTime と endTime。
  • 実際のラップタイムを表す activeDuration。
  • そのセグメントのみを対象とする metricsSummary。
  • スプリットの境界を定義する splitType(DISTANCE、DURATION、MANUAL など)。

エクササイズ イベント

アクティブな時間を正確に計算するには、exerciseEvents を使用して状態遷移(手動または自動の一時停止イベントなど)を追跡します。

各イベントには、タイムスタンプ(eventTime)とタイプが含まれます。

  • START / STOP: ユーザーが明示的に記録を開始または停止したときの境界タイムスタンプを示します。
  • PAUSE / RESUME: セッションが手動で一時停止または再開された日時を示します。
  • AUTO_PAUSE / AUTO_RESUME: センサーによる自動一時停止 / 再開を示します。

ワークアウト セッションを書き込む

ワークアウト セッションを作成、更新、インポートするには、exercise データ型コレクションにデータポイントを書き込みます。create dataPoints エンドポイントを使用します。

REST 表現の例

次の例は、POST メソッドを使用してワークアウト セッションを書き込む方法を示しています。

リクエスト

POST https://health.googleapis.com/v4/users/me/dataTypes/exercise/dataPoints
Authorization: Bearer access-token
Content-Type: application/json

{
  "dataSource": {
    "recordingMethod": "ACTIVELY_MEASURED",
    "platform": "GOOGLE_WEB_API"
  },
  "exercise": {
    "interval": {
      "startTime": "2026-04-20T08:00:00Z",
      "startUtcOffset": "0s",
      "endTime": "2026-04-20T08:35:00Z",
      "endUtcOffset": "0s"
    },
    "exerciseType": "RUNNING",
    "activeDuration": "1800s",
    "metricsSummary": {
      "caloriesKcal": 380.0,
      "distanceMillimeters": 5000000.0,
      "steps": "6200",
      "averageHeartRateBeatsPerMinute": "148",
      "averagePaceSecondsPerMeter": 0.36
    },
    "exerciseEvents": [
      {
        "eventTime": "2026-04-20T08:15:00Z",
        "eventUtcOffset": "0s",
        "exerciseEventType": "PAUSE"
      },
      {
        "eventTime": "2026-04-20T08:20:00Z",
        "eventUtcOffset": "0s",
        "exerciseEventType": "RESUME"
      }
    ]
  }
}

レスポンス

{
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.devicesandservices.health.v4.DataPoint",
    "name": "users/999298779973222220/dataTypes/exercise/dataPoints/3054085373369111216",
    "dataSource": {
      "recordingMethod": "ACTIVELY_MEASURED",
      "application": {
        "googleWebClientId": "438076457939-example.apps.googleusercontent.com"
      },
      "platform": "GOOGLE_WEB_API"
    },
    "exercise": {
      "interval": {
        "startTime": "2026-04-20T08:00:00Z",
        "startUtcOffset": "0s",
        "endTime": "2026-04-20T08:35:00Z",
        "endUtcOffset": "0s"
      },
      "exerciseType": "RUNNING",
      "metricsSummary": {
        "caloriesKcal": 380,
        "distanceMillimeters": 5000000,
        "steps": "6200",
        "averagePaceSecondsPerMeter": 0.36,
        "averageHeartRateBeatsPerMinute": "148"
      },
      "exerciseMetadata": {},
      "displayName": "Run",
      "activeDuration": "1800s",
      "exerciseEvents": [
        {
          "eventTime": "2026-04-20T08:15:00Z",
          "eventUtcOffset": "0s",
          "exerciseEventType": "PAUSE"
        },
        {
          "eventTime": "2026-04-20T08:20:00Z",
          "eventUtcOffset": "0s",
          "exerciseEventType": "RESUME"
        }
      ],
      "updateTime": "2026-04-20T08:35:10.123456Z",
      "createTime": "2026-04-20T08:35:10.123456Z"
    }
  }
}

GPS ルートと位置情報の追跡

この API は、基本的なセッションの概要を exercise データポイント内に直接保存しますが、詳細な位置情報の履歴と GPS ルート座標は別のストリームとして処理します。

屋外セッションの詳細なルートデータをダウンロードするには、exportExerciseTcx カスタム メソッドを呼び出します。このエンドポイントは、業界標準の Training Center XML(TCX)形式でルートを返します。

GPS ルートをエクスポートする

リクエスト

GET https://health.googleapis.com/v4/users/me/dataTypes/exercise/dataPoints/exercise-data-point-id:exportExerciseTcx?alt=media
Authorization: Bearer access-token

レスポンス

Content-Type: application/tcx+xml と、ファイルを保存するようブラウザに指示するヘッダーを含む HTTP ペイロード。

<?xml version="1.0" encoding="UTF-8"?>
<TrainingCenterDatabase xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2">
  <Activities>
    <Activity Sport="Running">
      <Id>2026-04-20T08:00:00Z</Id>
      <Lap StartTime="2026-04-20T08:00:00Z">
        <TotalTimeSeconds>1800</TotalTimeSeconds>
        <DistanceMeters>5000</DistanceMeters>
        <Calories>380</Calories>
        <Intensity>Active</Intensity>
        <TriggerMethod>Manual</TriggerMethod>
        <Track>
          <Trackpoint>
            <Time>2026-04-20T08:00:00Z</Time>
            <Position>
              <LatitudeDegrees>37.7749</LatitudeDegrees>
              <LongitudeDegrees>-122.4194</LongitudeDegrees>
            </Position>
            <AltitudeMeters>15.0</AltitudeMeters>
            <DistanceMeters>0.0</DistanceMeters>
          </Trackpoint>
        </Track>
      </Lap>
    </Activity>
  </Activities>
</TrainingCenterDatabase>

必要なスコープとロケーション

GPS ルートと位置情報のトラッキング機能を使用するには、アプリで次の OAuth スコープをリクエストする必要があります。

  • 読み取り: https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly
  • 書き込み: https://www.googleapis.com/auth/googlehealth.activity_and_fitness.writeonly
  • 読み取り: https://www.googleapis.com/auth/googlehealth.location.readonly

ガイドライン

ワークアウト トラッキングをアプリに統合する際は、以下の設計と実装のガイドラインに沿ってください。

アクティブな時間と合計時間

速度またはペースの指標を計算するには、startTime と endTime の差ではなく、常に activeDuration を使用します。これにより、一時停止した間隔が指標に影響することを防ぎます。

たとえば、ユーザーが 8:00 にワークアウトを開始し、8:35 に終了した場合、ワークアウトの合計経過時間は 2,100 秒になります。ユーザーがワークアウトを 5 分間(300 秒)一時停止し、exerciseEvents に PAUSE イベントと RESUME イベントを含めた場合、アクティブな時間は "1800s"(2,100 - 300)です。API は、アクティブな時間を使用して平均を計算し、合計距離を 2,100 ではなく 1,800 秒で割ります。

速度とペースの計算

Google Health API は、標準的な数式を使用して速度とペースを計算します。

  • 速度 = distance / time(hour)
  • ペース = time(seconds) / distance

リクエストで指定された Accept-Language ヘッダーによって、距離の単位が決まります。

位置情報を早めにリクエストする

アプリでワークアウトのルートをマッピングする場合は、アクティビティとフィットネスのスコープに加えて、位置情報の利用許可と Google Health の location スコープをリクエストします。GPS エクササイズを確認する際に、アプリが位置情報のスコープを必要とする理由をユーザーに説明します。

アプリが位置情報のスコープ(https://www.googleapis.com/auth/googlehealth.location.readonly)をリクエストすると、Google OAuth によってユーザーに同意プロンプトが表示されます。この権限は、ルート オーバーレイのレンダリングと GPS トラック ファイル(TCX)のエクスポートに必要であることをユーザーに説明します。ユーザーがアクティビティ スコープを付与し、位置情報の利用許可を拒否した場合、exportExerciseTcx は認可エラーを返します。ただし、metricsSummary のセッション集計にはアクセスできます。

ウェブフックを使用したリアルタイム同期

exercise データタイプに登録して、新しいワークアウト データが利用可能になったときに、Webhook を使用してバックエンドに通知します。これにより、ワークアウト後のエクスペリエンスをリアルタイムでトリガーできます。

サーバーが Webhook 通知を受信すると、更新されたワークアウトの healthUserId と常用時間間隔(civilIso8601TimeInterval)が含まれます。サーバーは、204 No Content を使用して通知をすぐに確認し、ペイロードを非同期で処理して、exercise.interval.civil_start_time フィルタを使用して調整済みの exercise エンドポイントをクエリする必要があります(exercise は civil_start_time によるフィルタリングのみをサポートしています)。

GET https://health.googleapis.com/v4/users/healthUserId/dataTypes/exercise/dataPoints:reconcile?filter=exercise.interval.civil_start_time >= "2026-04-20T08:00:00" AND exercise.interval.civil_start_time < "2026-04-20T10:00:00"

サブスクリプションの設定方法については、Webhook サブスクリプションをご覧ください。

一貫性のある指標を維持する

完全なワークアウト エクスペリエンスを提供するには、exercise セッションを書き込むときに概要指標を含め、詳細グラフをレンダリングするときに期間フィルタを使用して読み取り専用のテレメトリー エンドポイントをクエリします。

ワークアウトの概要指標を書き込む(書き込みパス)

完了したワークアウトを Google Health API にインポートまたは書き込む場合は、exercise データポイントの metricsSummary オブジェクト内に、ワークアウトの集計テレメトリー指標(steps、caloriesKcal、distanceMillimeters、averageHeartRateBeatsPerMinute、averagePaceSecondsPerMeter)を含めます。

  • POST https://health.googleapis.com/v4/users/me/dataTypes/exercise/dataPoints

グラフの詳細データをクエリする(読み取りパス)

特定のセッションのワークアウト ダッシュボードまたはグラフを作成するには、そのワークアウトの時間枠の調整済みテレメトリー エンドポイントをクエリします。

  1. civil_start_time フィルタを使用して exercise エンドポイントからワークアウト セッションを取得し、その interval と metricsSummary を取得します。

    GET https://health.googleapis.com/v4/users/me/dataTypes/exercise/dataPoints:reconcile?filter=exercise.interval.civil_start_time >= "2026-04-20T00:00:00" AND exercise.interval.civil_start_time < "2026-04-21T00:00:00"
  2. セッションの interval.startTime と interval.endTime を使用して、その物理的な時間枠のテレメトリー エンドポイントをクエリします。

  3. exerciseMetadata.hasGps が true の場合は、exportExerciseTcx を呼び出してルート座標をダウンロードします。