Marrow Health
DA
Hent

Send Apple Health-data til en webhook

Apple Health har ingen web-API, så dine data når kun en webhook, når en app på din iPhone sender dem. Marrow Health gør det gratis: en automatisering sender dine sundhedsmålinger, træninger, styrkesæt, kostdagbog eller symptomer og humør med POST til en hvilken som helst URL, som JSON eller CSV, efter den tidsplan du vælger, mens appen er lukket. Nedenfor finder du opsætningen, indholdet og fungerende modtagere til n8n, Home Assistant og en almindelig server. Vi laver Marrow.

Opsæt automatiseringen

  1. Åbn fanen Eksporter i Marrow Health, derefter Automatiseret og så Ny automatisering.
  2. Indsæt din webhook-URL (brug HTTPS). Tilføj de headers, din modtager tjekker, fx et bearer-token i Authorization eller en n8n-nøgle til header-godkendelse.
  3. Vælg slags data: Sundhedsmålinger, Træninger, Styrkelog, Kostdagbog eller Symptomer og humør. Én automatisering sender én slags, og du kan have op til ti.
  4. Vælg JSON eller CSV, datointervallet (Siden seneste kørsel er standard), og hvor ofte den kører, i minutter, timer eller dage.
  5. Slå den til, og tryk på Kør nu for at sende det første indhold, mens du holder øje med modtageren.

Hver anmodning er en POST med Content-Type: application/json (eller text/csv) og dine headers. Hver kørsel med sin svarkode står i automatiseringens historik i appen.

Hvad der kommer frem

Sundhedsmålinger kommer som daglige totaler i den enhed, der står i units. Puls kommer som hver dags gennemsnit, minimum og maksimum, og søvn som hver nat med sine faser, i timer:

{"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"}]}
]}}

Indholdet for træning, styrke, ernæring og humør, rå prøver i stedet for daglige totaler og CSV-opbygningen står i referencen til automatiseringer.

Modtag det i n8n

  1. Tilføj en Webhook-node. Sæt HTTP Method til POST, og giv den en sti, fx apple-health.
  2. Til en hemmelighed sætter du Authentication til Header Auth og tilføjer samme headernavn og værdi i Marrow-automatiseringen.
  3. Klik på Listen for test event, og tryk derefter på Kør nu i Marrow inden for to minutter. Indholdet vises i editoren.
  4. Udgiv workflowet, og peg Marrow på Production URL (den med /webhook/, ikke /webhook-test/). Test-URL'en holder op med at lytte efter en test.

Indholdet ligger under body, så dagens skridt er {{ $json.body.data.metrics.find(m => m.name === 'step_count').data.at(-1).qty }} i et udtryk. Tilføj en Split Out-node på body.data.metrics for at behandle hver måling som sit eget element. n8n tager som standard imod indhold op til 16 MB, hvilket rummer flere års daglige totaler. Kørsler i produktion vises under Executions, ikke i editoren. (n8n Webhook docs)

Modtag det i Home Assistant

En webhook-trigger tager imod POST på /api/webhook/<webhook_id>. Denne automatisering gemmer det seneste skridttal i en talhjælper kaldet input_number.steps_today (opret den først med et maksimum over din bedste dag):

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 til webhook-trigger i Home Assistant)

Modtag det på din egen server

Ethvert endpoint, der tager imod en HTTPS POST og svarer med 2xx, virker. Dette her arkiverer alt indhold i en fil:

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()

Sæt den bag HTTPS med en Cloudflare Tunnel, Tailscale Funnel eller en reverse proxy. Hvis du hellere vil have en database, du kan forespørge, end en mappe med filer, er Marrows selvhostede spejl netop den modtager, allerede skrevet, og AI-agenter kan også forespørge den.

Tre regler for en modtager, der aldrig mister data

Hvornår kører den?

Når som helst iOS lader Marrow køre: efter synkronisering med Apple Health, når du åbner den, og under opdatering i baggrunden, så snart det valgte interval er gået. iOS bestemmer, hvornår opdatering i baggrunden sker, så en telefon, der ligger låst hele dagen, sender, næste gang den låses op, og Siden seneste kørsel dækker hullet.

Andre måder at gøre det på