Apple Health-gegevens naar een webhook sturen
Apple Health heeft geen web-API, dus je gegevens komen alleen bij een webhook als een app op je iPhone ze verstuurt. Marrow Health doet dat gratis: een automatisering POST je gezondheidsstatistieken, work-outs, krachtsets, voedingsdagboek, of symptomen en stemming als JSON of CSV naar elke URL, volgens het schema dat jij kiest, ook als de app gesloten is. Hieronder staan de instelling, de payload en werkende ontvangers voor n8n, Home Assistant en een gewone server. Wij maken Marrow.
De automatisering instellen
- Open in Marrow Health het tabblad Exporteer, dan Geautomatiseerd, dan Nieuwe automatisering.
- Plak de URL van je webhook (gebruik HTTPS). Voeg alle kopteksten toe die je ontvanger controleert, zoals een
Authorization-bearertoken of een header-auth-sleutel van n8n. - Kies het soort gegevens: Gezondheidsstatistieken, Work-outs, Krachtlogboek, Voedingsdagboek of Symptomen en stemming. Eén automatisering verstuurt één soort, en je kunt er maximaal tien hebben.
- Kies JSON of CSV, het datumbereik (Sinds laatste run is de standaard) en hoe vaak het draait, in minuten, uren of dagen.
- Zet hem aan en tik op Nu uitvoeren om een eerste payload te sturen terwijl je de ontvanger in de gaten houdt.
Elk verzoek is een POST met Content-Type: application/json (of text/csv) en jouw kopteksten. Elke run, met de bijbehorende responscode, staat in de geschiedenis van de automatisering in de app.
Wat er aankomt
Gezondheidsstatistieken komen aan als dagtotalen, in de eenheid die in units staat. Hartslag komt per dag als gemiddelde, minimum en maximum, en slaap per nacht met de fases, in uren:
{"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"}]}
]}}
De payloads voor work-outs, kracht, voeding en stemming, ruwe samples in plaats van dagtotalen en de CSV-indeling staan in de referentie voor automatiseringen.
Ontvangen in n8n
- Voeg een Webhook-node toe. Zet HTTP Method op
POSTen geef hem een pad, zoalsapple-health. - Wil je een geheim, zet dan Authentication op Header Auth en voeg dezelfde headernaam en waarde toe aan de Marrow-automatisering.
- Klik op Listen for test event en tik binnen twee minuten in Marrow op Nu uitvoeren. De payload verschijnt in de editor.
- Publiceer de workflow en wijs Marrow naar de Production URL (die met
/webhook/, niet met/webhook-test/). De test-URL stopt na een test met luisteren.
De payload staat onder body, dus de stappen van vandaag zijn {{ $json.body.data.metrics.find(m => m.name === 'step_count').data.at(-1).qty }} in een expressie. Voeg een Split Out-node toe op body.data.metrics om elke meetwaarde als eigen item te verwerken. n8n accepteert standaard payloads tot 16 MB, genoeg voor jaren aan dagtotalen. Productieruns zie je onder Executions, niet in de editor. (n8n Webhook-documentatie)
Ontvangen in Home Assistant
Een webhook-trigger ontvangt de POST op /api/webhook/<webhook_id>. Deze automatisering bewaart het laatste stappental in een getalhelper genaamd input_number.steps_today (maak die eerst aan, met een maximum boven je beste 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 }}
- De JSON-body staat in
trigger.json, omdat MarrowContent-Type: application/jsonmeestuurt. local_onlystaat standaard aan, waardoor alleen posts vanaf je thuisnetwerk of via een Nabu Casa cloud-webhook-URL worden geaccepteerd. Zet het opfalseals de telefoon via internet naar je eigen HTTPS-adres post.- De webhook-ID is het enige geheim, dus maak hem lang en willekeurig.
(Documentatie over webhook-triggers in Home Assistant)
Ontvangen op je eigen server
Elk eindpunt dat een HTTPS-POST accepteert en met 2xx antwoordt, werkt. Dit voorbeeld archiveert elke payload in een bestand:
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()
Zet het achter HTTPS met een Cloudflare Tunnel, Tailscale Funnel of een reverse proxy. Heb je liever een database die je kunt bevragen dan een map met bestanden, dan is de zelfgehoste mirror van Marrow die ontvanger al, kant-en-klaar, en AI-agents kunnen hem ook bevragen.
Drie regels voor een ontvanger die nooit gegevens kwijtraakt
- De laatste wint. Sla elke waarde op per meetwaarde en dag en overschrijf bij herhaling. Sinds laatste run stuurt de laatste twee dagen met opzet opnieuw, omdat Apple Health een dag nog aanvult nadat hij voorbij is.
- Bewaar eerst de ruwe body, en verwerk hem daarna. Door een fout in het verwerken mag je nooit gegevens kwijtraken.
- Antwoord snel. Marrow wacht tot de time-out die je instelt (standaard 60 seconden) en probeert een mislukte run bij de volgende beurt opnieuw vanaf het laatste geslaagde venster.
Wanneer draait het?
Telkens wanneer iOS Marrow laat draaien: na het synchroniseren met Apple Health, als je de app opent en tijdens het verversen op de achtergrond, zodra het interval dat je koos voorbij is. iOS bepaalt wanneer verversen op de achtergrond gebeurt, dus een telefoon die de hele dag op slot blijft, verstuurt pas bij de volgende keer ontgrendelen, en Sinds laatste run vult het gat.
Andere manieren
- Health Auto Export post Apple Health-gegevens ook naar webhooks, en de metrics-JSON heeft dezelfde structuur als die van Marrow. De automatiseringen vragen om de Premium-variant.
- Apple Opdrachten kan gezondheidssamples lezen en versturen met Get Contents of URL, in een persoonlijke automatisering op een vast tijdstip. Het is gratis, het kan Gezondheid-gegevens alleen lezen terwijl de telefoon ontgrendeld is, en je bouwt en onderhoudt elke meetwaarde zelf.
- De export.zip van Apple is een eenmalige volledige back-up, geen feed. Gebruik onze converter in de browser om er CSV van te maken.