Marrow Health
JA
ダウンロード

Apple Healthのデータをwebhookに送る

Apple HealthにはウェブAPIがないため、データがwebhookに届くのは、iPhoneのアプリが送ったときだけです。Marrow Healthなら無料でそれができます。オートメーションが、健康指標、ワークアウト、筋トレのセット、食事日記、症状と気分を、任意のURLにJSONまたはCSVでPOSTします。スケジュールは自由に選べて、アプリを閉じていても動きます。以下に、セットアップ、ペイロード、n8n、Home Assistant、シンプルなサーバー用の動作する受信側を紹介します。Marrowは私たちが作っています。

オートメーションを設定する

  1. Marrow Healthでエクスポートタブを開き、自動、新規オートメーションの順にタップします.
  2. webhookのURLを貼り付けます(HTTPSを使ってください)。受信側が確認するヘッダー(Authorizationのベアラートークンや、n8nのヘッダー認証キーなど)があれば追加します。
  3. データの種類を選びます。健康指標、ワークアウト、筋トレログ、栄養日記、症状と気分のいずれかです。1つのオートメーションで送れるのは1種類で、最大10個まで作れます。
  4. JSONかCSV、日付の範囲(デフォルトは前回の実行以降)、実行の頻度(分、時間、日単位)を選びます。
  5. オンにして今すぐ実行をタップすると、受信側を見ながら最初のペイロードを送れます。

各リクエストは、Content-Type: application/json(またはtext/csv)とあなたのヘッダーを付けたPOSTです。レスポンスコードを含むすべての実行は、アプリ内のオートメーションの履歴に表示されます。

届く内容

健康指標は日ごとの合計として、unitsに書かれた単位で届きます。心拍数はその日の平均、最小、最大で、睡眠は夜ごとのステージ付きで、時間単位で届きます:

{"data": {"metrics": [
  {"name": "body_mass", "units": "kg",
   "data": [{"date": "2026-09-11", "qty": 81.3}]},
  {"name": "step_count", "units": "count",
   "data": [{"date": "2026-09-11", "qty": 8746}]},
  {"name": "heart_rate", "units": "bpm",
   "data": [{"date": "2026-09-11", "Avg": 71, "Min": 52, "Max": 148}]},
  {"name": "sleep_analysis", "units": "h",
   "data": [{"date": "2026-09-11", "totalSleep": 7.2, "asleep": 7.2, "deep": 1.1, "rem": 1.6, "core": 4.3, "awake": 0.2,
             "sleepStart": "2026-09-10 23:36:00 -0400", "sleepEnd": "2026-09-11 07:02:00 -0400"}]}
]}}

ワークアウト、筋トレ、栄養、気分のペイロード、日ごとの合計ではなく生サンプルを送る場合、CSVのレイアウトは、オートメーションのリファレンスにあります.

n8nで受け取る

  1. Webhookノードを追加します。HTTP MethodをPOSTにし、apple-healthのようなパスを付けます。.
  2. シークレットを使うなら、AuthenticationをHeader Authにして、同じヘッダー名と値をMarrowのオートメーションにも追加します。
  3. Listen for test eventをクリックし、2分以内にMarrowで今すぐ実行をタップします。ペイロードがエディタに表示されます。
  4. ワークフローを公開し、Marrowの送信先をProduction URL(/webhook-test/ではなく/webhook/のほう)にします。テスト用URLは、テストの後は受信しなくなります。

ペイロードはbodyの下にあるので、今日の歩数は、式では{{ $json.body.data.metrics.find(m => m.name === 'step_count').data.at(-1).qty }}になります。各指標を個別のアイテムとして扱うには、body.data.metricsにSplit Outノードを追加します。n8nはデフォルトで16 MBまでのペイロードを受け付けるので、何年分もの日次合計を扱えます。本番の実行は、エディタではなくExecutionsに表示されます。(n8n Webhookのドキュメント)

Home Assistantで受け取る

webhookトリガーは、/api/webhook/<webhook_id>でPOSTを受け取ります。このオートメーションは、最新の歩数をinput_number.steps_todayというnumberヘルパーに保存します(先に作成しておき、最大値は自己ベストの日より大きくしてください):

automation:
  - alias: "Apple Health from Marrow"
    triggers:
      - trigger: webhook
        webhook_id: "pick-a-long-random-id"
        allowed_methods:
          - POST
        local_only: false
    actions:
      - action: input_number.set_value
        target:
          entity_id: input_number.steps_today
        data:
          value: >-
            {{ ((trigger.json.data.metrics
                 | selectattr('name', 'eq', 'step_count') | first).data
                 | last).qty }}

(Home Assistantのwebhookトリガーのドキュメント)

自分のサーバーで受け取る

HTTPSのPOSTを受け付けて2xxを返すエンドポイントなら、何でも使えます。次の例は、すべてのペイロードをファイルに保存します:

from http.server import BaseHTTPRequestHandler, HTTPServer
import time

class H(BaseHTTPRequestHandler):
    def do_POST(self):
        body = self.rfile.read(int(self.headers.get("Content-Length", 0)))
        with open(f"marrow-{int(time.time())}.json", "wb") as f:
            f.write(body)
        self.send_response(200)
        self.end_headers()

HTTPServer(("0.0.0.0", 8798), H).serve_forever()

Cloudflare Tunnel、Tailscale Funnel、リバースプロキシのいずれかで、HTTPSの背後に置きます。ファイルの束ではなく、クエリできるデータベースが欲しいなら、Marrowのセルフホスト版ミラーが、すでに書かれた受信側そのものです。AIエージェントからもクエリできます。

データを失わない受信側のための3つのルール

いつ実行されますか?

iOSがMarrowの実行を許可したときです。具体的には、Apple Healthとの同期後、アプリを開いたとき、バックグラウンド更新のときで、選んだ間隔が過ぎていれば実行されます。バックグラウンド更新のタイミングはiOSが決めるので、1日中ロックしたままのiPhoneは、次にロックを解除したときに送信し、前回の実行以降がその間を埋めます。

ほかの方法