Automatiseringen: je gegevens, volgens een schema verstuurd
Marrow kan een bestand met je gezondheidsgegevens rechtstreeks vanaf de telefoon POSTen naar elke URL die je kiest, met de cadans die jij kiest. Deze pagina is de referentie: hoe je er een instelt, hoe elke payload eruitziet en hoe je iets schrijft dat hem ontvangt.
Kant-en-klare opstellingen voor n8n, Zapier, Make, Home Assistant, Google Sheets en InfluxDB staan onder verbindingen.
Alle handleidingen van Marrow: MCP · Zelfgehoste mirror · Automatiseringen · Bestanden · Ondersteuning
Wat een automatisering is
Een opgeslagen taak onder Exporteer, Geautomatiseerd: één soort gegevens, één formaat, één datumbereik, één URL, één cadans. Marrow bouwt het bestand uit zijn geverifieerde opslag en POST het naar de URL, ook met de app gesloten, na elke synchronisatie en bij elke verversing op de achtergrond, zodra de cadans verstreken is. Er gaat niets via ons: de telefoon praat rechtstreeks met jouw eindpunt.
Een automatisering instellen
- Tabblad Exporteer, Geautomatiseerd: zet het aan en kies dan Nieuwe automatisering. Maak je hem vanaf de pagina van een tool (n8n, Zapier, Home Assistant en de rest onder verbindingen), dan krijgt de automatisering de naam van die tool en staat bij elk veld wat de tool daar verwacht.
- Adres: de https-URL waarnaar hij POST. Kopteksten: alles wat je ontvanger nodig heeft (een
Authorization-bearertoken, eenX-Gitlab-Token, wat dan ook). Heeft de tool er geen nodig, dan staat Koptekst toevoegen onder Meer opties. - Gegevens: Gezondheidsstatistieken, Work-outs, Krachtlogboek, Voedingsdagboek, of Symptomen en stemming, als JSON of CSV. Eén automatisering verstuurt één soort, dus maak er één per soort die je wilt. Elke die aanstaat telt als een verbinding: Gratis houdt 1 verbinding tegelijk aan, Marrow Pro maximaal 10, AI's en servers meegerekend.
- Cadans: om de zoveel minuten, uren of dagen. Het datumbereik, de aggregatie en de time-out staan onder Meer opties.
- Nu uitvoeren verstuurt een eerste payload, zodat je de ontvanger kunt controleren voordat het schema aan de beurt is.
Datumbereiken
- Sinds laatste run (standaard): alles sinds de laatste geslaagde run, min een overlap van twee dagen. HealthKit vult een dag nog aan nadat hij voorbij is, dus de overlap verstuurt recent afgesloten dagen opnieuw. Bewaar aan jouw kant per meetwaarde en dag de nieuwste waarde, dan zijn herhalingen onschuldig. Een ontvanger die een tijdje uit de lucht was, krijgt bij de eerste run die slaagt elke gemiste dag.
- Vandaag, Afgelopen 7 / 30 / 90 dagen, Afgelopen jaar: vaste lopende bereiken, bij elke run helemaal opnieuw verstuurd. Kies deze als je liever een zichzelf herstellende momentopname hebt dan alleen het verschil.
Vormen van de payload
Gezondheidsstatistieken (dagtotalen, JSON)
Dezelfde structuur als de metrics van Health Auto Export (een lijst metrics met name, units en data met qty), dus een ontvanger die voor die app is geschreven, heeft maar kleine aanpassingen nodig: datums zijn hier gewone dagen, geen tijdstempels, en de payloads voor work-outs en kracht hieronder zijn van Marrow zelf. Waarden staan in de opgeslagen eenheid uit units (kg, m, mL, degC, kcal, count). Hartslag komt per dag als Avg, Min en Max in bpm, en slaap per nacht met de fases in uren. Reken aan jouw kant om als je imperiale eenheden wilt.
{"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"}]}
]}}
Ruwe samples (de groepering Ruwe samples) verstuurt elke sample met begin- en eindtijd in plaats van een dagtotaal. CSV-metrics komen als de brede tabel die op de bestandenpagina staat beschreven.
Work-outs
{"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"}
]}}
Krachtlogboek
Elke werkset (opwarmsets blijven weg), plus de voortgang per oefening en het volume per spiergroep. Gewichten staan in de eenheid die je koos bij Instellingen, Eenheden. Het veld unit zegt welke. De set_type van elke set is work, failure of drop, en een set bevat ook rir als je herhalingen in reserve hebt gelogd. set_credits telt de sets die aan een spiergroep worden toegerekend, in breuken als een oefening meerdere groepen werkt.
{"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}]
}}
Voedingsdagboek
{"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}}
]}
]}}
Een ontvanger schrijven
Alles wat een HTTPS-POST accepteert en met 2xx antwoordt, werkt: een webhookdienst, een serverless functie, een script op een thuisserver. Drie regels houden het robuust:
- De laatste wint. Sla waarden op per (meetwaarde, dag) of op de eigen identiteit van het item en overschrijf bij herhaling. Periodes overlappen met opzet.
- Archiveer eerst de ruwe body. Verwerk daarna. Door een fout in de parser mag je nooit gegevens kwijtraken.
- Antwoord snel. Marrow wacht tot de time-out die je instelt (standaard 60 s) en markeert de run anders als mislukt. Mislukte runs worden bij de volgende tik van de cadans opnieuw geprobeerd, vanaf het laatste geslaagde venster.
Een Python-ontvanger van twaalf regels die elke post archiveert:
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 hem achter HTTPS (een Cloudflare Tunnel, Tailscale Funnel of een reverse proxy) en wijs de automatisering ernaartoe. Wil je een kopie die je kunt bevragen in plaats van een map met bestanden, dan is de zelfgehoste mirror die ontvanger al, kant-en-klaar.
Goed om te weten
- Automatiseringen draaien alleen als iOS de app laat draaien: na een synchronisatie, bij verversen op de voorgrond en tijdens verversen op de achtergrond. Een telefoon die de hele dag op slot blijft, verstuurt pas bij de volgende keer ontgrendelen. Het venster sinds de laatste run vult het gat.
- Elke run staat met zijn resultaat in het Activiteitenlog van de automatisering (Meer opties), dus een verkeerd ingestelde URL zie je in de app, niet alleen op je server.
- Dupliceer een automatisering om zijn kopteksten te hergebruiken voor een ander soort gegevens.
Problemen oplossen
Test met Nu uitvoeren. De regel eronder zegt wat er gebeurde, en Meer opties, Activiteitenlog bewaart de laatste 30 runs met dezelfde regel. Zet Meld bij uitvoeren aan (Meer opties) voor een melding bij elke run terwijl je controleert.
| Wat Marrow toont | Wat je kunt doen |
|---|---|
Een samenvatting van wat is verstuurd, zoals 12 diary entries | Afgeleverd: de ontvanger antwoordde met 2xx. Zie je aan zijn kant niets, kijk dan naar de laatste rijen hieronder. |
Server answered 401 of 403 | De ontvanger wil een header, of die van jou klopt niet. Controleer de naam en waarde, inclusief Bearer en de spatie erachter. |
Server answered 404 | Verkeerd adres, of de ontvanger luistert niet. Gebruik in n8n de Production URL en activeer de workflow. Kijk of er aan het eind geen pad ontbreekt. |
Server answered 405 | Het adres accepteert geen POST. Wijs het naar het eindpunt dat voor binnenkomende gegevens bedoeld is. |
Server answered 413 | De payload is te groot voor de ontvanger. Kies een korter datumbereik, minder meetwaarden of Dagtotalen in plaats van Ruwe samples. |
Server answered 500 of een andere 5xx | De ontvanger faalde bij het verwerken. Kijk in zijn eigen log. Archiveer eerst de ruwe body en verwerk daarna. |
| De aanvraag is verlopen | De ontvanger deed er langer over dan de time-out. Antwoord eerst en werk daarna, of verhoog Time-out onder Meer opties (tot 300 s). |
| De App Transport Security-beleidsregel vereist het gebruik van een beveiligde verbinding | Het adres is onbeveiligd http op internet. Gebruik https. iOS staat gewone http voor Marrow alleen toe op je eigen netwerk. |
| Er kan geen server met de opgegeven hostnaam worden gevonden | Een typefout in het adres, of een naam die alleen je thuisnetwerk kent. Controleer het in Safari op de telefoon. |
No valid URL - set an https endpoint first | Het adres is leeg of begint niet met https:// (of http:// op je eigen netwerk). |
Nothing to export in this range | Geen gegevens van dat soort in het datumbereik. Kies onder Meer opties een langer bereik, of log eerst iets. |
- Afgeleverd, maar er komt niets aan. Sommige ontvangers antwoorden 200, ook als ze de gegevens weggooien. Home Assistant doet dat bij een verkeerde webhook-ID, en het Apps Script-recept bij een verkeerde
?key=. Zapier en Make tonen niets totdat je in hun editor een voorbeeld laadt. Bekijk de eigen geschiedenis of het log van de ontvanger. - Runs komen laat of helemaal niet. iOS kiest het moment voor runs op de achtergrond: na een synchronisatie, als je Marrow opent en tijdens verversen op de achtergrond. Laat Ververs op achtergrond aan staan voor Marrow (Instellingen, Algemeen, Ververs op achtergrond). Energiebesparing houdt runs op de achtergrond tegen, en een telefoon die op slot blijft, verstuurt pas bij de volgende keer ontgrendelen. Sinds laatste run haalt het in bij de volgende run die slaagt.
- Een ontvanger op je thuisnetwerk. Marrow heeft toegang tot Lokaal netwerk nodig om erbij te kunnen: Instellingen, Privacy en beveiliging, Lokaal netwerk. Tik één keer op Nu uitvoeren terwijl Marrow open is, zodat iOS het kan vragen. Op de achtergrond weigert iOS zonder te vragen totdat je hebt geantwoord.
- Weggeveegd. Als je Marrow in de appkiezer wegveegt, wekt iOS de app mogelijk niet op de achtergrond totdat je hem weer opent.
- Dezelfde dagen komen twee keer binnen. Met opzet: Sinds laatste run verstuurt de laatste twee dagen opnieuw, omdat Apple Health ze nog aanvult. Bewaar de nieuwste waarde per meetwaarde en dag.
- Hij gaat niet aan. Elke automatisering die aanstaat, telt als een verbinding. Gratis houdt 1 verbinding tegelijk aan, Marrow Pro maximaal 10: AI's, servers en automatiseringen samen. Zet eerst een andere uit.
- Eenheden kloppen niet. Meetwaarden komen binnen in de opgeslagen eenheden uit
units(kg, m, mL, degC, kcal). Krachtsets volgen Instellingen, Eenheden, en het veldunitzegt welke.
Oplossingen per tool staan op de pagina van die tool: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, elke URL.