Marrow Health
PT
Baixar

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

  1. No Marrow Health, abra a aba Exportar, depois Automatizado, depois Nova automação.
  2. Cole a URL do seu webhook (use HTTPS). Adicione os cabeçalhos que o seu receptor verifica, como um token bearer em Authorization ou uma chave de autenticação por cabeçalho do n8n.
  3. 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.
  4. 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.
  5. 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

  1. Adicione um nó Webhook. Defina HTTP Method como POST e dê um caminho a ele, como apple-health.
  2. Para usar um segredo, defina Authentication como Header Auth e adicione o mesmo nome e valor de cabeçalho à automação do Marrow.
  3. Clique em Listen for test event e depois toque em Executar agora no Marrow em até dois minutos. O payload aparece no editor.
  4. 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 }}

(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

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