Marrow Health
IT
Scarica

Automazioni: i tuoi dati, inviati a intervalli regolari

Marrow può inviare in POST un file con i tuoi dati di salute a qualsiasi URL tu scelga, con la cadenza che scegli, direttamente dal telefono. Questa pagina è il riferimento: come configurarne una, che aspetto ha ogni payload e come scrivere qualcosa che lo riceva.

Le configurazioni già pronte per n8n, Zapier, Make, Home Assistant, Google Sheets e InfluxDB sono in connessioni.

Tutte le guide di Marrow: MCP · Mirror self-hosted · Automazioni · File · Assistenza

Che cos'è un'automazione

Un lavoro salvato in Esporta, Automatico: un tipo di dati, un formato, un intervallo di date, un URL, una cadenza. Marrow crea il file dal suo archivio verificato e lo invia in POST all'URL con l'app chiusa, dopo ogni sincronizzazione e a ogni aggiornamento in background, ogni volta che la cadenza è trascorsa. Niente passa da noi: il telefono parla direttamente con il tuo endpoint.

Come configurarne una

  1. Scheda Esporta, Automatico: attivalo, poi Nuova automazione. Se creata dalla pagina di uno strumento (n8n, Zapier, Home Assistant e gli altri in connessioni), l'automazione porta il nome di quello strumento e accanto a ogni campo indica che cosa lo strumento vuole lì.
  2. Indirizzo: l'URL https a cui inviare in POST. Intestazioni: quelle che servono al tuo ricevitore (un token bearer Authorization, un X-Gitlab-Token, qualsiasi cosa). Quando lo strumento non ne richiede, Aggiungi intestazione si trova in Altre opzioni.
  3. Dati: Metriche di salute, Allenamenti, Registro forza, Diario alimentare, oppure Sintomi e umore, in JSON o CSV. Un'automazione porta un solo tipo, quindi ne crei una per ogni tipo che vuoi. Ognuna attiva conta come una connessione: il piano gratuito ne tiene attiva 1 alla volta, Marrow Pro fino a 10, IA e server compresi.
  4. Cadenza: ogni tot minuti, ore o giorni. L'intervallo di date, l'aggregazione e il timeout si trovano in Altre opzioni.
  5. Esegui ora invia un primo payload, così puoi controllare il ricevitore senza aspettare la pianificazione.

Intervalli di date

Forme dei payload

Metriche di salute (totali giornalieri, JSON)

La stessa struttura delle metriche di Health Auto Export (un elenco metrics di name, units e data con qty), quindi un ricevitore scritto per quell'app richiede solo piccole modifiche: qui le date sono semplici giorni, non timestamp, e i payload di allenamenti e forza qui sotto sono propri di Marrow. I valori sono nell'unità salvata indicata in units (kg, m, mL, degC, kcal, count). La frequenza cardiaca arriva come Avg, Min e Max di ogni giorno in bpm, e il sonno come ogni notte con le sue fasi in ore. Se vuoi le unità imperiali, converti da parte tua.

{"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 campioni grezzi (il raggruppamento Campioni grezzi) inviano ogni campione con l'ora di inizio e di fine al posto di un totale giornaliero. Le metriche in CSV arrivano come la tabella larga descritta nella pagina dei file.

Allenamenti

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

Registro forza

Ogni serie di lavoro (il riscaldamento è escluso), più i progressi per esercizio e il volume per gruppo muscolare. I pesi sono nell'unità scelta in Impostazioni, Unità di misura. Il campo unit dice quale. Il set_type di ogni serie è work, failure o drop, e una serie porta anche rir quando hai registrato le ripetizioni in riserva. set_credits conta le serie attribuite a un gruppo muscolare, in frazioni quando un esercizio lavora più gruppi.

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

Diario alimentare

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

Scrivere un ricevitore

Va bene tutto ciò che accetta una POST HTTPS e risponde 2xx: un servizio webhook, una funzione serverless, uno script su un server di casa. Tre regole lo rendono robusto:

Un ricevitore Python di dodici righe che archivia ogni invio:

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 (un Cloudflare Tunnel, Tailscale Funnel o qualsiasi reverse proxy) e punta l'automazione su di esso. Se quello che vuoi è una copia interrogabile e non una cartella di file, il mirror self-hosted è proprio quel ricevitore già scritto.

Da sapere

Risoluzione dei problemi

Prova con Esegui ora. La riga sotto dice che cosa è successo, e Altre opzioni, Registro attività conserva le ultime 30 esecuzioni con la stessa riga. Attiva Notifica all'esecuzione (Altre opzioni) per ricevere una notifica a ogni esecuzione mentre controlli.

Che cosa mostra MarrowChe cosa fare
Un riepilogo di ciò che è stato inviato, come 12 diary entriesConsegnato: il ricevitore ha risposto 2xx. Se dalla sua parte non compare niente, vedi le ultime righe qui sotto.
Server answered 401 o 403Il ricevitore vuole un'intestazione, oppure quella che hai aggiunto è sbagliata. Controlla nome e valore, compreso Bearer e lo spazio dopo.
Server answered 404Indirizzo sbagliato, oppure il ricevitore non è in ascolto. In n8n usa il Production URL e attiva il workflow. Controlla che non manchi un percorso in fondo.
Server answered 405L'indirizzo non accetta una POST. Puntalo sull'endpoint pensato per i dati in ingresso.
Server answered 413Il payload è troppo grande per il ricevitore. Scegli un intervallo di date più breve, meno metriche, oppure Totali giornalieri al posto di Campioni grezzi.
Server answered 500 o un altro 5xxIl ricevitore è andato in errore durante l'elaborazione. Guarda il suo registro. Archivia prima il corpo grezzo, poi analizzalo.
La richiesta è scadutaIl ricevitore ha impiegato più del timeout. Rispondi prima e lavora dopo, oppure alza Timeout in Altre opzioni (fino a 300 s).
Il criterio App Transport Security richiede l'uso di una connessione sicuraL'indirizzo è in semplice http su internet. Usa https. iOS lascia usare a Marrow l'http semplice solo sulla tua rete.
Impossibile trovare un server con il nome host specificatoUn errore di battitura nell'indirizzo, oppure un nome che conosce solo la tua rete di casa. Controllalo in Safari sul telefono.
No valid URL - set an https endpoint firstL'indirizzo è vuoto o non inizia con https:// (o http:// sulla tua rete).
Nothing to export in this rangeNessun dato di quel tipo nell'intervallo di date. Scegli un intervallo più lungo in Altre opzioni, o registra prima qualcosa.

Le soluzioni per ogni singolo strumento sono nella sua pagina: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, qualsiasi URL.