Apple-Health-Daten an einen Webhook senden
Apple Health hat keine Web-API, deshalb erreichen deine Daten einen Webhook nur, wenn eine App auf deinem iPhone sie sendet. Marrow Health macht das kostenlos: Eine Automation schickt deine Gesundheitsmetriken, Trainings, Kraftsätze, dein Ernährungstagebuch oder Symptome und Stimmung per POST an eine beliebige URL, als JSON oder CSV, nach dem Zeitplan, den du wählst, auch bei geschlossener App. Unten findest du die Einrichtung, die Payload und funktionierende Empfänger für n8n, Home Assistant und einen einfachen Server. Wir machen Marrow.
Die Automation einrichten
- Öffne in Marrow Health den Tab „Exportieren“, dann Automatisiert, dann Neue Automation.
- Füge deine Webhook-URL ein (nutze HTTPS). Ergänze alle Header, die dein Empfänger prüft, etwa ein
Authorization-Bearer-Token oder einen Header-Auth-Schlüssel von n8n. - Wähle die Art der Daten: Gesundheitsmetriken, Trainings, Kraft-Protokoll, Ernährungstagebuch oder Symptome und Stimmung. Eine Automation sendet eine Art, und du kannst bis zu zehn haben.
- Wähle JSON oder CSV, den Zeitraum (Seit dem letzten Lauf ist der Standard) und wie oft sie läuft, in Minuten, Stunden oder Tagen.
- Schalte sie ein und tippe auf Jetzt ausführen, um eine erste Payload zu senden, während du den Empfänger beobachtest.
Jede Anfrage ist ein POST mit Content-Type: application/json (oder text/csv) und deinen Headern. Jeder Lauf mit seinem Antwortcode steht im Verlauf der Automation in der App.
Was ankommt
Gesundheitsmetriken kommen als Tagessummen an, in der Einheit aus units. Die Herzfrequenz kommt als Durchschnitt, Minimum und Maximum jedes Tages, der Schlaf als jede Nacht mit ihren Phasen, in Stunden:
{"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"}]}
]}}
Die Payloads für Trainings, Kraft, Ernährung und Stimmung, Rohdaten statt Tagessummen und das CSV-Layout stehen in der Automations-Referenz.
In n8n empfangen
- Füge einen Webhook-Node hinzu. Setze HTTP Method auf
POSTund vergib einen Pfad, etwaapple-health. - Zur Absicherung setze Authentication auf Header Auth und trage denselben Header-Namen und -Wert in die Marrow-Automation ein.
- Klicke auf Listen for test event und tippe dann innerhalb von zwei Minuten in Marrow auf Jetzt ausführen. Die Payload erscheint im Editor.
- Veröffentliche den Workflow und richte Marrow auf die Production URL aus (die mit
/webhook/, nicht/webhook-test/). Die Test-URL hört nach einem Test nicht mehr zu.
Die Payload liegt unter body, die heutigen Schritte sind in einem Ausdruck also {{ $json.body.data.metrics.find(m => m.name === 'step_count').data.at(-1).qty }}. Füge einen Split Out-Node auf body.data.metrics hinzu, um jede Metrik als eigenes Element zu verarbeiten. n8n akzeptiert standardmäßig Payloads bis 16 MB, das reicht für Jahre an Tagessummen. Produktionsläufe erscheinen unter Executions, nicht im Editor. (n8n-Webhook-Dokumentation)
In Home Assistant empfangen
Ein Webhook-Trigger nimmt den POST unter /api/webhook/<webhook_id> entgegen. Diese Automation speichert die letzte Schrittzahl in einem Zahlenhelfer namens input_number.steps_today (lege ihn zuerst an, mit einem Maximum über deinem besten Tag):
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 }}
- Der JSON-Body steht in
trigger.json, weil MarrowContent-Type: application/jsonsendet. local_onlyist standardmäßig an und akzeptiert nur Posts aus deinem Heimnetz oder von einer Nabu-Casa-Cloud-Webhook-URL. Setze es auffalse, wenn das Handy über das Internet an deine eigene HTTPS-Adresse postet.- Die Webhook-ID ist das einzige Geheimnis, also wähle sie lang und zufällig.
(Dokumentation zum Webhook-Trigger von Home Assistant)
Auf deinem eigenen Server empfangen
Jeder Endpunkt, der einen HTTPS-POST akzeptiert und mit 2xx antwortet, funktioniert. Dieser hier archiviert jede Payload in einer Datei:
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()
Stelle ihn mit einem Cloudflare Tunnel, Tailscale Funnel oder einem Reverse-Proxy hinter HTTPS. Wenn du lieber eine abfragbare Datenbank als einen Ordner voller Dateien hättest: Der selbst gehostete Spiegel von Marrow ist genau dieser Empfänger, schon fertig geschrieben, und auch KI-Agenten können ihn abfragen.
Drei Regeln für einen Empfänger, der nie Daten verliert
- Der neueste Wert gewinnt. Speichere jeden Wert mit Metrik und Tag als Schlüssel und überschreibe ihn bei Wiederholung. Seit dem letzten Lauf sendet absichtlich die letzten zwei Tage erneut, denn Apple Health füllt einen Tag auch nach seinem Ende noch weiter auf.
- Speichere zuerst den rohen Body, dann parse ihn. Ein Fehler beim Parsen sollte dich nie Daten kosten.
- Antworte schnell. Marrow wartet bis zum eingestellten Timeout (standardmäßig 60 Sekunden) und wiederholt einen fehlgeschlagenen Lauf beim nächsten Mal ab dem letzten erfolgreichen Zeitfenster.
Wann läuft sie?
Immer wenn iOS Marrow laufen lässt: nach der Synchronisierung mit Apple Health, wenn du die App öffnest, und bei der Hintergrundaktualisierung, sobald das gewählte Intervall vergangen ist. iOS entscheidet, wann die Hintergrundaktualisierung stattfindet. Ein Handy, das den ganzen Tag gesperrt liegt, sendet deshalb beim nächsten Entsperren, und Seit dem letzten Lauf deckt die Lücke ab.
Andere Möglichkeiten
- Health Auto Export sendet Apple-Health-Daten ebenfalls an Webhooks, und sein Metrik-JSON hat dieselbe Struktur wie das von Marrow. Seine Automationen setzen die Premium-Stufe voraus.
- Apple Kurzbefehle können Gesundheitsdaten lesen und mit Get Contents of URL senden, in einer persönlichen Automation zu einer festen Uhrzeit. Das ist kostenlos, Gesundheitsdaten lassen sich aber nur lesen, solange das Handy entsperrt ist, und du baust und pflegst jede Metrik selbst.
- Apples export.zip ist ein einmaliges vollständiges Backup, kein Feed. Um daraus CSV zu machen, nutze unseren Konverter im Browser.