Enviar dados do Apple Health para um webhook
O Apple Health não tem API web, então os seus dados só chegam a um webhook quando um app no seu iPhone os envia. O Marrow Health faz isso de graça: uma automação faz POST das suas métricas de saúde, treinos, séries de musculação, diário de alimentação, ou sintomas e humor para qualquer URL, em JSON ou CSV, no horário que você escolher, com o app fechado. Abaixo estão a configuração, o payload e receptores prontos para n8n, Home Assistant e um servidor simples. Nós fazemos o Marrow.
Configure a automação
- No Marrow Health, abra a aba Exportar, depois Automatizado, depois Nova automação.
- Cole a URL do seu webhook (use HTTPS). Adicione os cabeçalhos que o seu receptor verifica, como um token bearer em
Authorizationou uma chave de autenticação por cabeçalho do n8n. - Escolha o tipo de dado: Métricas de saúde, Treinos, Registro de força, Diário de nutrição ou Sintomas e humor. Cada automação envia um tipo, e você pode ter até dez.
- Escolha JSON ou CSV, o intervalo de datas (Desde a última corrida é o padrão) e a frequência de execução, em minutos, horas ou dias.
- Ative e toque em Executar agora para enviar um primeiro payload enquanto você acompanha o receptor.
Cada requisição é um POST com Content-Type: application/json (ou text/csv) e os seus cabeçalhos. Cada execução, com o seu código de resposta, aparece no histórico da automação no app.
O que chega
As métricas de saúde chegam como totais diários, na unidade indicada em units. A frequência cardíaca vem como média, mínimo e máximo de cada dia, e o sono como cada noite com as suas fases, em 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"}]}
]}}
Os payloads de treino, musculação, nutrição e humor, as amostras brutas em vez de totais diários e o formato do CSV estão na referência de automações.
Receba no n8n
- Adicione um nó Webhook. Defina HTTP Method como
POSTe dê um caminho a ele, comoapple-health. - Para usar um segredo, defina Authentication como Header Auth e adicione o mesmo nome e valor de cabeçalho à automação do Marrow.
- Clique em Listen for test event e depois toque em Executar agora no Marrow em até dois minutos. O payload aparece no editor.
- Publique o fluxo e aponte o Marrow para a Production URL (a que tem
/webhook/, não/webhook-test/). A URL de teste para de escutar depois de um teste.
O payload fica em body, então os passos de hoje são {{ $json.body.data.metrics.find(m => m.name === 'step_count').data.at(-1).qty }} em uma expressão. Adicione um nó Split Out em body.data.metrics para tratar cada métrica como um item próprio. O n8n aceita payloads de até 16 MB por padrão, o que cobre anos de totais diários. As execuções de produção aparecem em Executions, não no editor. (Documentação do Webhook do n8n)
Receba no Home Assistant
Um gatilho de webhook recebe o POST em /api/webhook/<webhook_id>. Esta automação guarda a contagem de passos mais recente em um auxiliar numérico chamado input_number.steps_today (crie-o antes, com um máximo acima do seu melhor dia):
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 }}
- O corpo JSON fica em
trigger.jsonporque o Marrow enviaContent-Type: application/json. local_onlyvem ativado por padrão, o que só aceita envios da sua rede doméstica ou de uma URL de webhook na nuvem do Nabu Casa. Defina comofalsequando o celular enviar pela internet para o seu próprio endereço HTTPS.- O ID do webhook é o único segredo, então faça-o longo e aleatório.
(Documentação do gatilho de webhook do Home Assistant)
Receba no seu próprio servidor
Qualquer endpoint que aceite um POST por HTTPS e responda 2xx funciona. Este arquiva cada payload em um arquivo:
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()
Coloque-o atrás de HTTPS com um Cloudflare Tunnel, um Tailscale Funnel ou um proxy reverso. Se você prefere um banco de dados consultável a uma pasta de arquivos, o espelho autohospedado do Marrow já é esse receptor pronto, e agentes de IA também podem consultá-lo.
Três regras para um receptor que nunca perde dados
- Vale o mais recente. Guarde cada valor com a chave de métrica e dia e sobrescreva quando se repetir. Desde a última corrida reenvia os dois últimos dias de propósito, porque o Apple Health continua preenchendo um dia depois que ele termina.
- Salve primeiro o corpo bruto, e só depois interprete. Um erro de leitura nunca deve custar dados a você.
- Responda rápido. O Marrow espera até o tempo limite que você definiu (60 segundos por padrão) e tenta de novo uma execução que falhou, a partir da última janela bem-sucedida, na vez seguinte.
Quando ele roda?
Sempre que o iOS deixa o Marrow rodar: depois que ele sincroniza com o Apple Health, quando você o abre e durante a atualização em segundo plano, assim que o intervalo escolhido passa. É o iOS que decide quando a atualização em segundo plano acontece, então um celular deixado bloqueado o dia todo envia na próxima vez que for desbloqueado, e Desde a última corrida cobre o intervalo.
Outras formas de fazer
- O Health Auto Export também envia dados do Apple Health para webhooks, e o JSON de métricas dele tem a mesma estrutura do Marrow. As automações dele exigem o plano Premium.
- Os Atalhos da Apple conseguem ler amostras de saúde e enviá-las com Obter Conteúdo do URL, em uma automação pessoal em um horário definido. É grátis, só consegue ler dados de Saúde com o celular desbloqueado, e você monta e mantém cada métrica por conta própria.
- O export.zip da Apple é um backup completo pontual, não um fluxo contínuo. Para transformar um em CSV, use o nosso conversor no navegador.