Marrow Health
ES
Descargar

Envía datos de Apple Health a un webhook

Apple Health no tiene una API web, así que tus datos solo llegan a un webhook cuando una app de tu iPhone los envía. Marrow Health lo hace gratis: una automatización hace POST de tus métricas de salud, entrenamientos, series de fuerza, diario de nutrición, o síntomas y estado de ánimo a cualquier URL, como JSON o CSV, con la programación que elijas y con la app cerrada. Abajo están la configuración, el payload y receptores que funcionan para n8n, Home Assistant y un servidor sencillo. Nosotros hacemos Marrow.

Configura la automatización

  1. En Marrow Health, abre la pestaña Exportar, luego Automatizado y después Nueva automatización.
  2. Pega la URL de tu webhook (usa HTTPS). Añade los encabezados que compruebe tu receptor, como un token bearer en Authorization o una clave de header-auth de n8n.
  3. Elige el tipo de datos: Métricas de salud, Entrenamientos, Registro de fuerza, Diario de nutrición o Síntomas y estado de ánimo. Una automatización envía un solo tipo, y puedes tener hasta diez.
  4. Elige JSON o CSV, el rango de fechas (Desde la última carrera es el predeterminado) y con qué frecuencia se ejecuta, en minutos, horas o días.
  5. Actívala y toca Ejecutar ahora para enviar un primer payload mientras miras el receptor.

Cada petición es un POST con Content-Type: application/json (o text/csv) y tus encabezados. Cada ejecución, con su código de respuesta, aparece en el historial de la automatización en la app.

Qué llega

Las métricas de salud llegan como totales diarios, en la unidad indicada en units. La frecuencia cardiaca llega como el promedio, el mínimo y el máximo de cada día, y el sueño como cada noche con sus fases, en horas:

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

Los payloads de entrenamientos, fuerza, nutrición y estado de ánimo, las muestras sin procesar en lugar de totales diarios y el formato del CSV están en la referencia de automatizaciones.

Recíbelo en n8n

  1. Añade un nodo Webhook. Pon HTTP Method en POST y dale una ruta, como apple-health.
  2. Para un secreto, pon Authentication en Header Auth y añade el mismo nombre y valor de encabezado a la automatización de Marrow.
  3. Haz clic en Listen for test event y luego toca Ejecutar ahora en Marrow en menos de dos minutos. El payload aparece en el editor.
  4. Publica el flujo de trabajo y apunta Marrow a la Production URL (la que lleva /webhook/, no /webhook-test/). La URL de prueba deja de escuchar después de una prueba.

El payload está en body, así que los pasos de hoy son {{ $json.body.data.metrics.find(m => m.name === 'step_count').data.at(-1).qty }} en una expresión. Añade un nodo Split Out sobre body.data.metrics para tratar cada métrica como un elemento propio. n8n acepta payloads de hasta 16 MB por defecto, lo que cubre años de totales diarios. Las ejecuciones de producción aparecen en Executions, no en el editor. (documentación del webhook de n8n)

Recíbelo en Home Assistant

Un disparador webhook recibe el POST en /api/webhook/<webhook_id>. Esta automatización guarda el último recuento de pasos en un ayudante numérico llamado input_number.steps_today (créalo primero, con un máximo por encima de tu mejor día):

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

(Documentación del disparador webhook de Home Assistant)

Recíbelo en tu propio servidor

Sirve cualquier endpoint que acepte un POST HTTPS y responda 2xx. Este archiva cada payload en un archivo:

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

Ponlo detrás de HTTPS con un Cloudflare Tunnel, Tailscale Funnel o un proxy inverso. Si prefieres una base de datos consultable a una carpeta de archivos, el espejo autoalojado de Marrow es ese receptor ya escrito, y los agentes de IA también pueden consultarlo.

Tres reglas para un receptor que nunca pierde datos

¿Cuándo se ejecuta?

Siempre que iOS deje que Marrow se ejecute: después de sincronizar con Apple Health, cuando la abres y durante la actualización en segundo plano, una vez pasado el intervalo que elegiste. iOS decide cuándo ocurre la actualización en segundo plano, así que un teléfono que pasa todo el día bloqueado envía cuando se desbloquea de nuevo, y Desde la última carrera cubre el hueco.

Otras formas de hacerlo