Wysyłanie danych z Apple Health do webhooka
Apple Health nie ma webowego API, więc dane trafiają do webhooka tylko wtedy, gdy wyśle je aplikacja na Twoim iPhonie. Marrow Health robi to bezpłatnie: automatyzacja wysyła metodą POST Twoje wskaźniki zdrowia, treningi, serie treningu siłowego, dziennik jedzenia albo objawy i nastrój na dowolny adres URL, jako JSON lub CSV, według wybranego harmonogramu, przy zamkniętej aplikacji. Poniżej znajdziesz konfigurację, strukturę danych oraz działające odbiorniki dla n8n, Home Assistant i zwykłego serwera. To my tworzymy Marrow.
Skonfiguruj automatyzację
- W Marrow Health otwórz kartę Eksportuj, potem Automatyczne, a następnie Nowa automatyzacja.
- Wklej adres URL webhooka (użyj HTTPS). Dodaj nagłówki, które sprawdza Twój odbiornik, na przykład token
Authorizationtypu bearer albo klucz header-auth z n8n. - Wybierz rodzaj danych: Wskaźniki zdrowia, Treningi, Dziennik treningu siłowego, Dziennik odżywiania lub Objawy i nastrój. Jedna automatyzacja wysyła jeden rodzaj, a możesz mieć ich do dziesięciu.
- Wybierz JSON lub CSV, zakres dat (domyślnie Od ostatniego uruchomienia) oraz częstotliwość uruchamiania w minutach, godzinach lub dniach.
- Włącz ją i stuknij Uruchom teraz, aby wysłać pierwszy pakiet danych, obserwując odbiornik.
Każde żądanie to POST z Content-Type: application/json (lub text/csv) i Twoimi nagłówkami. Każde uruchomienie wraz z kodem odpowiedzi jest wypisane w historii automatyzacji w aplikacji.
Co przychodzi
Wskaźniki zdrowia przychodzą jako sumy dzienne, w jednostce podanej w units. Tętno przychodzi jako średnia, minimum i maksimum z każdego dnia, a sen jako każda noc z podziałem na fazy, w godzinach:
{"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"}]}
]}}
Dane treningów, treningu siłowego, odżywiania i nastroju, surowe próbki zamiast sum dziennych oraz układ CSV znajdziesz w opisie automatyzacji.
Odbieranie w n8n
- Dodaj węzeł Webhook. Ustaw HTTP Method na
POSTi nadaj mu ścieżkę, na przykładapple-health. - Aby użyć sekretu, ustaw Authentication na Header Auth i dodaj tę samą nazwę oraz wartość nagłówka do automatyzacji w Marrow.
- Kliknij Listen for test event, a potem w ciągu dwóch minut stuknij Uruchom teraz w Marrow. Dane pojawią się w edytorze.
- Opublikuj przepływ i wskaż w Marrow adres Production URL (ten z
/webhook/, a nie z/webhook-test/). Adres testowy przestaje nasłuchiwać po teście.
Dane są w body, więc dzisiejsze kroki to {{ $json.body.data.metrics.find(m => m.name === 'step_count').data.at(-1).qty }} w wyrażeniu. Dodaj węzeł Split Out na body.data.metrics, aby obsłużyć każdy wskaźnik jako osobny element. n8n domyślnie przyjmuje dane do 16 MB, co wystarcza na lata sum dziennych. Uruchomienia produkcyjne widać w sekcji Executions, a nie w edytorze. (dokumentacja n8n Webhook)
Odbieranie w Home Assistant
Wyzwalacz webhooka przyjmuje żądanie POST pod adresem /api/webhook/<webhook_id>. Ta automatyzacja zapisuje najnowszą liczbę kroków w pomocniku liczbowym o nazwie input_number.steps_today (najpierw go utwórz, z maksimum wyższym niż Twój najlepszy dzień):
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 }}
- Treść JSON jest w
trigger.json, ponieważ Marrow wysyłaContent-Type: application/json. local_onlyjest domyślnie włączone, co oznacza, że przyjmowane są żądania tylko z Twojej sieci domowej lub z adresu webhooka w chmurze Nabu Casa. Ustawfalse, gdy telefon wysyła dane przez internet na Twój własny adres HTTPS.- Identyfikator webhooka jest jedynym sekretem, więc niech będzie długi i losowy.
(Dokumentacja wyzwalacza webhooka w Home Assistant)
Odbieranie na własnym serwerze
Działa każdy punkt końcowy, który przyjmuje żądanie POST przez HTTPS i odpowiada kodem 2xx. Ten archiwizuje każdy pakiet danych do pliku:
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()
Udostępnij go przez HTTPS za pomocą Cloudflare Tunnel, Tailscale Funnel lub reverse proxy. Jeśli wolisz bazę danych, którą można odpytywać, zamiast folderu z plikami, samodzielnie hostowana kopia lustrzana Marrow to gotowy, napisany odbiornik, który mogą też odpytywać agenci AI.
Trzy zasady odbiornika, który nigdy nie gubi danych
- Wygrywa najnowsza wartość. Zapisuj każdą wartość pod kluczem złożonym ze wskaźnika i dnia i nadpisuj ją przy powtórzeniu. Od ostatniego uruchomienia celowo wysyła ponownie ostatnie dwa dni, bo Apple Health uzupełnia dane dnia jeszcze po jego zakończeniu.
- Najpierw zapisz surową treść, a dopiero potem ją przetwarzaj. Błąd w parsowaniu nigdy nie powinien kosztować Cię danych.
- Odpowiadaj szybko. Marrow czeka do ustawionego limitu czasu (domyślnie 60 sekund), a nieudane uruchomienie ponawia przy następnej okazji, od ostatniego udanego okna.
Kiedy się uruchamia?
Za każdym razem, gdy iOS pozwoli Marrow działać: po synchronizacji z Apple Health, po otwarciu aplikacji i podczas odświeżania w tle, gdy minie wybrany interwał. To iOS decyduje, kiedy następuje odświeżanie w tle, więc telefon zablokowany przez cały dzień wyśle dane po następnym odblokowaniu, a Od ostatniego uruchomienia uzupełni lukę.
Inne sposoby
- Health Auto Export też wysyła dane z Apple Health do webhooków, a jego JSON ze wskaźnikami ma taką samą strukturę jak w Marrow. Jego automatyzacje wymagają poziomu Premium.
- Skróty Apple potrafią odczytywać próbki zdrowotne i wysyłać je akcją Get Contents of URL w automatyzacji osobistej o ustalonej godzinie. To bezpłatne, ale dane z aplikacji Zdrowie można odczytać tylko przy odblokowanym telefonie, a każdy wskaźnik budujesz i utrzymujesz samodzielnie.
- Plik export.zip od Apple to jednorazowa pełna kopia zapasowa, a nie strumień danych. Aby zamienić go na CSV, użyj naszego konwertera w przeglądarce.