Automatisations : vos données, envoyées selon un calendrier
Marrow peut envoyer en POST un fichier de vos données de santé vers n’importe quelle URL de votre choix, à la cadence de votre choix, directement depuis le téléphone. Cette page est la référence : comment en configurer une, à quoi ressemble chaque charge utile, et comment écrire ce qui la reçoit.
Des configurations prêtes à l’emploi pour n8n, Zapier, Make, Home Assistant, Google Sheets et InfluxDB se trouvent sous connexions.
Tous les guides Marrow: MCP · Miroir autohébergé · Automatisations · Fichiers · Assistance
Ce qu’est une automatisation
Une tâche enregistrée dans Exporter, Automatisé : un type de données, un format, une période, une URL, une cadence. Marrow construit le fichier à partir de son stock vérifié et l’envoie en POST à l’URL, app fermée, après chaque synchronisation validée et à chaque actualisation en arrière-plan, dès que la cadence est écoulée. Rien ne passe par nous : le téléphone parle directement à votre point de terminaison.
La configurer
- Onglet Exporter, Automatisé : activez-le, puis Nouvelle automatisation. Quand elle est créée depuis la page d’un outil (n8n, Zapier, Home Assistant et les autres sous connexions), l’automatisation porte le nom de cet outil et indique à côté de chaque champ ce que l’outil attend.
- Adresse : l’URL https vers laquelle envoyer le POST. En-têtes : ceux dont votre récepteur a besoin (un jeton bearer
Authorization, unX-Gitlab-Token, ce que vous voulez). Quand l’outil n’en demande aucun, Ajouter un en-tête se trouve sous Plus d’options. - Données : Mesures de santé, Entraînements, Journal de musculation, Journal alimentaire, ou Symptômes et humeur, en JSON ou CSV. Une automatisation porte un seul type, donc créez-en une par type voulu. Chacune qui est activée compte comme une connexion : Gratuit garde 1 connexion active à la fois, Marrow Pro jusqu’à 10, IA et serveurs compris.
- Cadence : toutes les X minutes, heures ou jours. La période, l’agrégation et le délai d’expiration se trouvent sous Plus d’options.
- Lancer maintenant envoie une première charge utile pour que vous puissiez vérifier le récepteur sans attendre le calendrier.
Périodes
- Depuis la dernière exécution (par défaut) : tout ce qui s’est passé depuis la dernière exécution réussie, moins un chevauchement de deux jours. HealthKit continue de compléter une journée après sa fin, donc le chevauchement renvoie les jours récemment terminés. Gardez de votre côté la dernière valeur par mesure et par jour et les répétitions sont sans effet. Un récepteur resté en panne un moment reçoit tous les jours manqués dès la première exécution réussie.
- Aujourd’hui, 7 / 30 / 90 derniers jours, Dernière année : des fenêtres glissantes fixes, renvoyées en entier à chaque exécution. Choisissez-les si vous préférez un instantané qui se corrige tout seul à un simple écart.
Forme des charges utiles
Mesures de santé (totaux quotidiens, JSON)
La même structure que les mesures de Health Auto Export (une liste metrics de name, units et data avec qty), si bien qu’un récepteur écrit pour cette app n’a besoin que de petites modifications : ici, les dates sont de simples jours, pas des horodatages, et les charges utiles des entraînements et de la musculation plus bas sont propres à Marrow. Les valeurs sont dans l’unité stockée indiquée dans units (kg, m, mL, degC, kcal, count). La fréquence cardiaque arrive avec les Avg, Min et Max de chaque jour en bpm, et le sommeil avec chaque nuit et ses phases en heures. Convertissez de votre côté si vous voulez des unités impériales.
{"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"}]}
]}}
Les échantillons bruts (le regroupement Échantillons bruts) envoient chaque échantillon avec ses heures de début et de fin au lieu d’un total quotidien. Les mesures en CSV arrivent sous la forme du tableau large décrit sur la page des fichiers.
Entraînements
{"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"}
]}}
Journal de musculation
Chaque série de travail (les échauffements sont exclus), plus la progression par exercice et le volume par groupe musculaire. Les poids sont dans l’unité choisie sous Réglages, Unités. Le champ unit l’indique. Le set_type de chaque série vaut work, failure ou drop, et une série porte aussi rir quand vous avez noté les répétitions en réserve. set_credits compte les séries attribuées à un groupe musculaire, en fractions quand un exercice sollicite plusieurs groupes.
{"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}]
}}
Journal alimentaire
{"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}}
]}
]}}
Écrire un récepteur
Tout ce qui accepte un POST HTTPS et répond en 2xx convient : un service de webhook, une fonction serverless, un script sur un serveur domestique. Trois règles le rendent robuste :
- Le dernier gagne. Stockez les valeurs avec (mesure, jour) ou l’identité propre de l’entrée pour clé, et écrasez en cas de répétition. Les fenêtres se chevauchent volontairement.
- Archivez d’abord le corps brut. Puis analysez-le. Un bogue d’analyse ne doit jamais vous coûter les données.
- Répondez vite. Marrow attend jusqu’au délai que vous avez réglé (60 s par défaut) et marque sinon l’exécution comme échouée. Les exécutions échouées sont relancées au prochain top de cadence, depuis la dernière période réussie.
Un récepteur Python de douze lignes qui archive chaque envoi :
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()
Placez-le derrière HTTPS (un Cloudflare Tunnel, Tailscale Funnel ou n’importe quel reverse proxy) et pointez l’automatisation vers lui. Si vous voulez une copie interrogeable plutôt qu’un dossier de fichiers, le miroir autohébergé est ce récepteur déjà écrit.
Bon à savoir
- Les automatisations ne s’exécutent que lorsqu’iOS laisse l’app tourner : après une synchronisation validée, à l’actualisation au premier plan et pendant l’actualisation en arrière-plan. Un téléphone qui reste verrouillé toute la journée envoie au prochain déverrouillage. La fenêtre « depuis la dernière exécution » comble l’écart.
- Chaque exécution est consignée dans l’Historique d’activité de l’automatisation (Plus d’options) avec son résultat : une URL mal configurée se voit donc dans l’app, pas seulement sur votre serveur.
- Dupliquez une automatisation pour réutiliser ses en-têtes pour un autre type de données.
Dépannage
Testez avec Lancer maintenant. La ligne en dessous dit ce qui s’est passé, et Plus d’options, Historique d’activité garde les 30 dernières exécutions avec la même ligne. Activez Avertir lors de l’exécution (Plus d’options) pour recevoir une notification à chaque exécution pendant vos vérifications.
| Ce que Marrow affiche | Que faire |
|---|---|
Un résumé de ce qui a été envoyé, par exemple 12 diary entries | Livré : le récepteur a répondu en 2xx. Si rien n’apparaît de son côté, voir les dernières lignes plus bas. |
Server answered 401 ou 403 | Le récepteur veut un en-tête, ou celui que vous avez ajouté est faux. Vérifiez son nom et sa valeur, y compris Bearer et l’espace qui le suit. |
Server answered 404 | Mauvaise adresse, ou le récepteur n’écoute pas. Dans n8n, utilisez la Production URL et activez le workflow. Vérifiez qu’il ne manque pas un chemin à la fin. |
Server answered 405 | L’adresse n’accepte pas de POST. Pointez vers le point de terminaison prévu pour les données entrantes. |
Server answered 413 | La charge utile est trop grosse pour le récepteur. Choisissez une période plus courte, moins de mesures, ou Totaux quotidiens à la place d’Échantillons bruts. |
Server answered 500 ou une autre erreur 5xx | Le récepteur a échoué en la traitant. Regardez son propre journal. Archivez d’abord le corps brut, puis analysez-le. |
| La requête a expiré | Le récepteur a mis plus longtemps que le délai. Répondez d’abord et travaillez ensuite, ou augmentez le Délai d’expiration sous Plus d’options (jusqu’à 300 s). |
| La politique App Transport Security exige l’utilisation d’une connexion sécurisée | L’adresse est en http simple sur internet. Utilisez https. iOS ne laisse Marrow utiliser http simple que sur votre propre réseau. |
| Impossible de trouver un serveur avec le nom d’hôte spécifié | Une faute de frappe dans l’adresse, ou un nom que seul votre réseau domestique connaît. Vérifiez-la dans Safari sur le téléphone. |
No valid URL - set an https endpoint first | L’adresse est vide ou ne commence pas par https:// (ou http:// sur votre propre réseau). |
Nothing to export in this range | Aucune donnée de ce type sur la période. Choisissez une période plus longue sous Plus d’options, ou enregistrez d’abord quelque chose. |
- Livré, mais rien n’arrive. Certains récepteurs répondent 200 même quand ils jettent les données. Home Assistant le fait avec un mauvais identifiant de webhook, et la recette Apps Script avec un mauvais
?key=. Zapier et Make n’affichent rien tant que vous n’avez pas chargé un échantillon dans leur éditeur. Consultez l’historique ou le journal du récepteur lui-même. - Les exécutions arrivent en retard, ou jamais. iOS choisit le moment des exécutions en arrière-plan : après une synchronisation, quand vous ouvrez Marrow et pendant l’actualisation en arrière-plan. Gardez l’actualisation en arrière-plan activée pour Marrow (Réglages, Général, Actualisation en arrière-plan). Le mode économie d’énergie retient les exécutions en arrière-plan, et un téléphone qui reste verrouillé envoie au prochain déverrouillage. Depuis la dernière exécution rattrape le retard à la prochaine exécution réussie.
- Un récepteur sur votre réseau domestique. Marrow a besoin de l’accès au réseau local pour l’atteindre : Réglages, Confidentialité et sécurité, Réseau local. Touchez Lancer maintenant une fois, Marrow ouvert, pour qu’iOS puisse poser la question. En arrière-plan, iOS refuse sans demander tant que vous n’avez pas répondu.
- App fermée d’un balayage. Après avoir fait glisser Marrow hors du sélecteur d’apps, iOS peut ne pas le réveiller en arrière-plan avant que vous ne le rouvriez.
- Les mêmes jours arrivent deux fois. C’est voulu : Depuis la dernière exécution renvoie les deux derniers jours, car Apple Health continue de les compléter. Gardez la dernière valeur par mesure et par jour.
- Elle ne veut pas s’activer. Chaque automatisation activée compte comme une connexion. Gratuit garde 1 connexion active à la fois, Marrow Pro jusqu’à 10 : IA, serveurs et automatisations ensemble. Désactivez-en une autre d’abord.
- Les unités semblent fausses. Les mesures arrivent dans les unités stockées indiquées dans
units(kg, m, mL, degC, kcal). Les séries de musculation suivent Réglages, Unités, et le champunitl’indique.
Les solutions pour chaque outil se trouvent sur sa page : n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, n’importe quelle URL.