オートメーション:スケジュールでデータをプッシュ
Marrowは、あなたが選んだURLに、あなたが選んだ頻度で、iPhoneから直接、健康データのファイルをPOSTできます。このページはそのリファレンスです。設定方法、各ペイロードの形、それを受け取る仕組みの作り方を説明します。
n8n、Zapier、Make、Home Assistant、Google Sheets、InfluxDB向けの設定済みの手順は、接続にあります.
Marrowのガイド一覧: MCP · セルフホスト版ミラー · オートメーション · ファイル · サポート
オートメーションとは
エクスポート、自動に保存されるジョブです。データの種類、形式、日付の範囲、URL、頻度を1つずつ指定します。Marrowは検証済みのストアからファイルを作り、アプリを閉じたままでもURLにPOSTします。同期のコミットのたびと、バックグラウンド更新のたびに、頻度の間隔が過ぎていれば実行されます。私たちのサーバーを経由することはありません。iPhoneがあなたのエンドポイントに直接送ります。
設定方法
- エクスポートタブで自動をオンにし、新規オートメーションをタップします。ツールのページ(接続にあるn8n、Zapier、Home Assistantなど)から作ると、オートメーションにそのツールの名前が付き、各項目の横にそのツールが必要とする内容が表示されます。
- アドレス:POST先のhttpsのURL。ヘッダー:受信側が必要とするもの(
Authorizationのベアラートークン、X-Gitlab-Tokenなど、何でも)。ツールが何も必要としない場合は、「ヘッダーを追加」が「その他のオプション」の中にあります。 - データ:健康指標、ワークアウト、筋トレログ、栄養日記、症状と気分のいずれかを、JSONかCSVで。1つのオートメーションで送れるのは1種類なので、必要な種類ごとに作ります。オンにしたものはそれぞれ接続として数えられます。無料プランでは同時に1つ、Marrow Proでは最大10個までオンにでき、AIとサーバーも含まれます。
- ケイデンス:何分、何時間、何日ごとに送るか。日付の範囲、集計、タイムアウトはその他のオプションの中にあります.
- 今すぐ実行で最初のペイロードを送れるので、スケジュールを待たずに受信側を確認できます。
日付の範囲
- 前回の実行以降(デフォルト):前回の成功した実行の2日前から、現在までのすべてです。HealthKitは日が終わった後もデータを補い続けるため、重なった分で、最近終わった日を再送します。指標と日付ごとに最新の値だけを保持しておけば、重複は問題になりません。しばらく停止していた受信側には、最初に成功した実行で、取りこぼした日がすべて届きます。
- 今日、過去7日間 / 30日間 / 90日間、過去1年:固定のローリング期間で、実行のたびにすべてを再送します。差分よりも、自己修復するスナップショットが欲しいときに選びます。
ペイロードの形
健康指標(日ごとの合計、JSON)
Health Auto Exportの指標と同じ構造です(name、units、qtyを持つdataから成るmetricsリスト)。そのアプリ用に書いた受信側も、少し変えるだけで使えます。ここでの日付はタイムスタンプではなく日単位で、後述のワークアウトと筋トレのペイロードはMarrow独自のものです。値はunitsに書かれた保存単位(kg、m、mL、degC、kcal、count)です。心拍数は各日のAvg、Min、Maxをbpmで、睡眠は夜ごとのステージ付きで時間単位で届きます。ヤード・ポンド法で使いたい場合は、受信側で変換してください。
{"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の指標は、ファイルのページで説明している横長の表で届きます.
ワークアウト
{"data": {"workouts": [
{"activity": "Running", "start": "2026-09-11T18:43:41Z", "end": "2026-09-11T19:13:53Z",
"duration_min": 30.2, "kcal": 512, "distance_mi": 3.06, "avg_hr": 174, "source": "Apple Watch"}
]}}
筋トレログ
すべてのワーキングセット(ウォームアップは除く)と、種目ごとの進捗、筋群ごとのボリュームです。重量は設定、単位で選んだ単位で、どちらかはunitフィールドでわかります。各セットのset_typeはwork、failure、dropのいずれかで、余力の回数(RIR)を記録した場合はrirも付きます。set_creditsは筋群ごとに割り当てたセット数で、1つの種目が複数の筋群を鍛える場合は小数になります。
{"data": {"unit": "lb",
"sets": [{"time": "2026-09-11T17:02:00Z", "session": "Push day", "exercise": "Bench Press",
"set": 1, "weight": 185, "reps": 8, "est_1rm": 229.6, "set_type": "work"}],
"exercises": [{"exercise": "Bench Press", "best_est_1rm": 229.6,
"sessions": [{"date": "2026-09-11T17:02:00Z", "sets": 3, "top_weight": 185, "top_reps": 8, "est_1rm": 229.6, "volume": 3885}]}],
"muscle_groups": [{"group": "Chest", "volume": 3108.0, "set_credits": 2.4}]
}}
栄養日記
{"data": {"days": [
{"day": "2026-09-11", "entries": [
{"meal": "breakfast", "name": "Oatmeal", "grams": 250, "kcal": 300,
"protein_g": 10, "carbs_g": 54, "fat_g": 5, "logged_at": "2026-09-11T12:10:00Z",
"nutrients": {"dietary_fiber": 8.0, "dietary_sugar": 1.2}}
]}
]}}
受信側を作る
HTTPSのPOSTを受け付けて2xxを返すものなら何でも使えます。webhookサービス、サーバーレス関数、ホームサーバー上のスクリプトなどです。次の3つのルールで堅牢になります:
- 最新のものを優先する。値は(指標、日付)か、エントリ自体の識別子をキーにして保存し、同じ値が来たら上書きします。期間は意図的に重なっています。
- 先に生の本文をアーカイブする。それからパースします。パーサーの不具合でデータを失ってはいけません。
- すばやく応答する。Marrowは設定したタイムアウト(デフォルトは60秒)まで待ち、それを超えると実行を失敗としてマークします。失敗した実行は、次のケイデンスのタイミングで、最後に成功した範囲から再試行されます。
すべての送信をアーカイブする12行のPython受信側:
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()
HTTPS(Cloudflare Tunnel、Tailscale Funnel、任意のリバースプロキシ)の背後に置いて、オートメーションの送信先に指定します。ファイルの束ではなく、クエリできるコピーが欲しいなら、セルフホスト版ミラーが、すでに書かれた受信側です。
知っておくと便利なこと
- オートメーションが実行されるのは、iOSがアプリの実行を許可したときだけです。つまり、同期のコミット後、フォアグラウンドでの更新時、バックグラウンド更新中です。1日中ロックされたままのiPhoneは、次にロック解除されたときに送信します。「前回の実行以降」の範囲が、その間を埋めます。
- すべての実行は、オートメーションのアクティビティログ(その他のオプション)に結果付きで記録されるので、URLの設定ミスは、サーバー側だけでなくアプリ内でも確認できます。
- オートメーションを複製すると、そのヘッダーを別の種類で再利用できます。
トラブルシューティング
今すぐ実行でテストします。その下の行に結果が表示され、その他のオプション、アクティビティログには同じ行が直近30回分残ります。確認している間は実行時に通知(その他のオプション)をオンにすると、実行のたびに通知が届きます。
| Marrowの表示 | 対処法 |
|---|---|
送信した内容の概要(たとえば12 diary entries) | 送信済み:受信側が2xxを返しました。受信側で何も表示されない場合は、下の最後の行を見てください。 |
Server answered 401または403 | 受信側がヘッダーを必要としているか、追加したヘッダーが間違っています。名前と値を確認してください。Bearerとその後ろのスペースも含みます。 |
Server answered 404 | アドレスが違うか、受信側が待ち受けていません。n8nでは、Production URLを使い、ワークフローを有効にしてください。末尾のパスが抜けていないかも確認してください。 |
Server answered 405 | このアドレスはPOSTを受け付けません。受信データ用のエンドポイントを指定してください。 |
Server answered 413 | ペイロードが受信側には大きすぎます。日付の範囲を短くするか、指標を減らすか、生サンプルではなく日ごとの合計にしてください。 |
Server answered 500または他の5xx | 受信側が処理中に失敗しました。受信側のログを確認してください。先に生の本文をアーカイブしてから、パースしてください。 |
| リクエストがタイムアウトになりました | 受信側の応答がタイムアウトより長くかかりました。先に応答してから処理するか、その他のオプションのタイムアウトを上げてください(最大300秒)。 |
| App Transport Securityのポリシーにより、安全な接続を使用する必要があります | アドレスが、インターネット上のhttp(暗号化なし)になっています。httpsを使ってください。iOSがMarrowに暗号化なしのhttpを許可するのは、自分のネットワーク内だけです。 |
| 指定されたホスト名のサーバが見つかりませんでした | アドレスの打ち間違いか、自宅のネットワークだけが知っている名前です。iPhoneのSafariで開いて確認してください。 |
No valid URL - set an https endpoint first | アドレスが空か、https://で始まっていません(自分のネットワーク内ならhttp://でも可)。 |
Nothing to export in this range | その期間には、その種類のデータがありません。その他のオプションで期間を長くするか、先に何か記録してください。 |
- 送信済みなのに何も届かない。データを捨てても200を返す受信側があります。Home Assistantはwebhook IDが違うとそうなり、Apps Scriptのレシピは
?key=が違うとそうなります。ZapierとMakeは、エディタでサンプルを読み込むまで何も表示しません。受信側自身の履歴かログを確認してください。 - 実行が遅れる、またはまったく実行されない。バックグラウンドでの実行のタイミングはiOSが決めます。同期の後、Marrowを開いたとき、バックグラウンド更新中です。MarrowのAppのバックグラウンド更新をオンにしておいてください(設定、一般、Appのバックグラウンド更新)。低電力モードではバックグラウンドの実行が控えられ、ロックされたままのiPhoneは、次にロック解除されたときに送信します。前回の実行以降は、次に成功した実行で追いつきます。
- 自宅ネットワーク上の受信側。Marrowが到達するには、ローカルネットワークへのアクセスが必要です:設定、プライバシーとセキュリティ、ローカルネットワーク。Marrowを開いた状態で「今すぐ実行」を一度タップすると、iOSが許可を尋ねます。バックグラウンドでは、回答するまで、iOSは尋ねずに拒否します。
- スワイプで終了した。AppスイッチャーでMarrowをスワイプして終了すると、もう一度開くまで、iOSがバックグラウンドで起動しないことがあります。
- 同じ日が2回届く。意図的なものです。前回の実行以降は直近2日分を再送します。Apple Healthがその日のデータを補い続けるためです。指標と日付ごとに最新の値を保持してください。
- オンにできない。オンにしたオートメーションはそれぞれ接続として数えられます。無料プランでは同時に1つ、Marrow Proでは最大10個で、AI、サーバー、オートメーションの合計です。先に別のものをオフにしてください。
- 単位がおかしい。指標は、
unitsに書かれた保存単位(kg、m、mL、degC、kcal)で届きます。筋トレのセットは設定の単位に従い、unitフィールドでどちらかがわかります。
ツールごとの対処法は、それぞれのページにあります:n8n、Zapier、Make、Home Assistant、Google Sheets、InfluxDB、任意のURL.