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
- En Marrow Health, abre la pestaña Exportar, luego Automatizado y después Nueva automatización.
- Pega la URL de tu webhook (usa HTTPS). Añade los encabezados que compruebe tu receptor, como un token bearer en
Authorizationo una clave de header-auth de n8n. - 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.
- 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.
- 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
- Añade un nodo Webhook. Pon HTTP Method en
POSTy dale una ruta, comoapple-health. - Para un secreto, pon Authentication en Header Auth y añade el mismo nombre y valor de encabezado a la automatización de Marrow.
- 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.
- 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 }}
- El cuerpo JSON está en
trigger.jsonporque Marrow envíaContent-Type: application/json. local_onlyviene activado por defecto, lo que solo acepta envíos desde tu red doméstica o desde una URL de webhook en la nube de Nabu Casa. Ponlo enfalsecuando el teléfono envíe por internet a tu propia dirección HTTPS.- El ID del webhook es el único secreto, así que hazlo largo y aleatorio.
(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
- Gana el último. Guarda cada valor con la clave de métrica y día y sobrescribe cuando se repita. Desde la última carrera reenvía los dos últimos días a propósito, porque Apple Health sigue rellenando un día después de que termine.
- Guarda primero el cuerpo sin procesar, y luego analízalo. Un error de análisis nunca debería costarte datos.
- Responde rápido. Marrow espera hasta el tiempo límite que establezcas (60 segundos por defecto) y reintenta una ejecución fallida desde la última ventana correcta en su siguiente turno.
¿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
- Health Auto Export también envía datos de Apple Health a webhooks, y su JSON de métricas tiene la misma estructura que el de Marrow. Sus automatizaciones requieren el nivel Premium.
- Atajos de Apple puede leer muestras de salud y enviarlas con Get Contents of URL, en una automatización personal a una hora fija. Es gratis, solo puede leer los datos de Salud mientras el teléfono está desbloqueado, y tú construyes y mantienes cada métrica.
- El export.zip de Apple es una copia de seguridad completa puntual, no un flujo de datos. Para convertir uno en CSV, usa nuestro conversor en el navegador.