Marrow Health
DE
Download

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

  1. Öffne in Marrow Health den Tab „Exportieren“, dann Automatisiert, dann Neue Automation.
  2. 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.
  3. 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.
  4. 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.
  5. 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

  1. Füge einen Webhook-Node hinzu. Setze HTTP Method auf POST und vergib einen Pfad, etwa apple-health.
  2. Zur Absicherung setze Authentication auf Header Auth und trage denselben Header-Namen und -Wert in die Marrow-Automation ein.
  3. Klicke auf Listen for test event und tippe dann innerhalb von zwei Minuten in Marrow auf Jetzt ausführen. Die Payload erscheint im Editor.
  4. 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 }}

(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

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