Marrow Health
IT
Scarica

Invia i dati di Apple Health a un webhook

Apple Health non ha un'API web, quindi i tuoi dati arrivano a un webhook solo quando un'app sul tuo iPhone li invia. Marrow Health lo fa gratis: un'automazione invia in POST le tue metriche di salute, gli allenamenti, le serie di forza, il diario alimentare, o sintomi e umore a qualsiasi URL, in JSON o CSV, con la cadenza che scegli e con l'app chiusa. Qui sotto trovi la configurazione, il payload e dei ricevitori funzionanti per n8n, Home Assistant e un semplice server. Marrow lo facciamo noi.

Configura l'automazione

  1. In Marrow Health apri la scheda Esporta, poi Automatico, poi Nuova automazione.
  2. Incolla l'URL del tuo webhook (usa HTTPS). Aggiungi le intestazioni che il tuo ricevitore controlla, come un token bearer Authorization o una chiave header-auth di n8n.
  3. Scegli il tipo di dati: Metriche di salute, Allenamenti, Registro forza, Diario alimentare oppure Sintomi e umore. Un'automazione invia un solo tipo, e puoi averne fino a dieci.
  4. Scegli JSON o CSV, l'intervallo di date (Dall'ultima esecuzione è quello predefinito) e la frequenza, in minuti, ore o giorni.
  5. Attivala e tocca Esegui ora per inviare un primo payload mentre guardi il ricevitore.

Ogni richiesta è una POST con Content-Type: application/json (o text/csv) e le tue intestazioni. Ogni esecuzione, con il suo codice di risposta, compare nella cronologia dell'automazione nell'app.

Che cosa arriva

Le metriche di salute arrivano come totali giornalieri, nell'unità indicata in units. La frequenza cardiaca arriva come media, minimo e massimo di ogni giorno, e il sonno come ogni notte con le sue fasi, in ore:

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

I payload di allenamenti, forza, alimentazione e umore, i campioni grezzi al posto dei totali giornalieri e il formato CSV sono nel riferimento delle automazioni.

Riceverlo in n8n

  1. Aggiungi un nodo Webhook. Imposta HTTP Method su POST e dagli un percorso, per esempio apple-health.
  2. Per un segreto, imposta Authentication su Header Auth e aggiungi lo stesso nome e valore di intestazione all'automazione di Marrow.
  3. Clicca Listen for test event, poi tocca Esegui ora in Marrow entro due minuti. Il payload compare nell'editor.
  4. Pubblica il workflow e punta Marrow sul Production URL (quello con /webhook/, non /webhook-test/). L'URL di test smette di ascoltare dopo un test.

Il payload è sotto body, quindi i passi di oggi sono {{ $json.body.data.metrics.find(m => m.name === 'step_count').data.at(-1).qty }} in un'espressione. Aggiungi un nodo Split Out su body.data.metrics per trattare ogni metrica come un elemento a sé. n8n accetta di default payload fino a 16 MB, sufficienti per anni di totali giornalieri. Le esecuzioni in produzione compaiono in Executions, non nell'editor. (documentazione del Webhook di n8n)

Riceverlo in Home Assistant

Un trigger webhook riceve la POST su /api/webhook/<webhook_id>. Questa automazione salva l'ultimo conteggio dei passi in un helper numerico chiamato input_number.steps_today (crealo prima, con un massimo superiore al tuo giorno migliore):

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 }}

(Documentazione dei trigger webhook di Home Assistant)

Riceverlo sul tuo server

Va bene qualsiasi endpoint che accetti una POST HTTPS e risponda 2xx. Questo archivia ogni payload in un file:

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

Mettilo dietro HTTPS con un Cloudflare Tunnel, Tailscale Funnel o un reverse proxy. Se preferisci un database interrogabile a una cartella di file, il mirror self-hosted di Marrow è proprio quel ricevitore già pronto, e gli agenti IA possono interrogarlo.

Tre regole per un ricevitore che non perde mai dati

Quando viene eseguita?

Ogni volta che iOS lascia girare Marrow: dopo la sincronizzazione con Apple Health, quando lo apri e durante l'aggiornamento in background, una volta trascorso l'intervallo che hai scelto. È iOS a decidere quando avviene l'aggiornamento in background, quindi un telefono lasciato bloccato tutto il giorno invia al successivo sblocco, e Dall'ultima esecuzione copre il vuoto.

Altri modi per farlo