Apple Healthのデータをwebhookに送る
Apple HealthにはウェブAPIがないため、データがwebhookに届くのは、iPhoneのアプリが送ったときだけです。Marrow Healthなら無料でそれができます。オートメーションが、健康指標、ワークアウト、筋トレのセット、食事日記、症状と気分を、任意のURLにJSONまたはCSVでPOSTします。スケジュールは自由に選べて、アプリを閉じていても動きます。以下に、セットアップ、ペイロード、n8n、Home Assistant、シンプルなサーバー用の動作する受信側を紹介します。Marrowは私たちが作っています。
オートメーションを設定する
- Marrow Healthでエクスポートタブを開き、自動、新規オートメーションの順にタップします.
- webhookのURLを貼り付けます(HTTPSを使ってください)。受信側が確認するヘッダー(
Authorizationのベアラートークンや、n8nのヘッダー認証キーなど)があれば追加します。 - データの種類を選びます。健康指標、ワークアウト、筋トレログ、栄養日記、症状と気分のいずれかです。1つのオートメーションで送れるのは1種類で、最大10個まで作れます。
- JSONかCSV、日付の範囲(デフォルトは前回の実行以降)、実行の頻度(分、時間、日単位)を選びます。
- オンにして今すぐ実行をタップすると、受信側を見ながら最初のペイロードを送れます。
各リクエストは、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で受け取る
- Webhookノードを追加します。HTTP Methodを
POSTにし、apple-healthのようなパスを付けます。. - シークレットを使うなら、AuthenticationをHeader Authにして、同じヘッダー名と値をMarrowのオートメーションにも追加します。
- Listen for test eventをクリックし、2分以内にMarrowで今すぐ実行をタップします。ペイロードがエディタに表示されます。
- ワークフローを公開し、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 }}
- Marrowは
Content-Type: application/jsonを送るため、JSONの本文はtrigger.jsonに入ります. local_onlyはデフォルトでオンで、自宅のネットワークかNabu CasaのクラウドwebhookのURLからの送信だけを受け付けます。iPhoneがインターネット経由で自分のHTTPSアドレスに送る場合は、falseにします。- webhook IDが唯一の秘密なので、長くランダムな値にしてください。
(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つのルール
- 最新のものを優先する。各値を指標と日付をキーにして保存し、同じ値が来たら上書きします。前回の実行以降は、直近2日分をあえて再送します。Apple Healthは、日が終わった後もデータを補い続けるためです。
- 先に生の本文を保存する。その後でパースします。パースの不具合でデータを失ってはいけません。
- すばやく応答する。Marrowは設定したタイムアウト(デフォルトは60秒)まで待ち、失敗した実行は、次の機会に最後に成功した範囲から再試行します。
いつ実行されますか?
iOSがMarrowの実行を許可したときです。具体的には、Apple Healthとの同期後、アプリを開いたとき、バックグラウンド更新のときで、選んだ間隔が過ぎていれば実行されます。バックグラウンド更新のタイミングはiOSが決めるので、1日中ロックしたままのiPhoneは、次にロックを解除したときに送信し、前回の実行以降がその間を埋めます。
ほかの方法
- Health Auto ExportもApple Healthのデータをwebhookに送れます。その指標のJSONはMarrowと同じ構造です。オートメーションにはPremiumプランが必要です。
- Appleのショートカットは、ヘルスケアのサンプルを読み取り、Get Contents of URLで送信できます。決まった時刻の個人用オートメーションで動かします。無料ですが、iPhoneのロックが解除されている間しかヘルスケアのデータを読めず、指標ごとに自分で作って保守する必要があります。
- Appleのexport.zipは1回限りのフルバックアップで、継続的に届くフィードではありません。CSVに変換するには、ブラウザ上のコンバーターをお使いください.