Marrow Health
PT
Baixar

Automações: seus dados, enviados em horário programado

O Marrow pode fazer POST de um arquivo com os seus dados de saúde para qualquer URL que você escolher, na frequência que você escolher, direto do celular. Esta página é a referência: como configurar uma, como é cada payload e como escrever algo que o receba.

Configurações prontas para n8n, Zapier, Make, Home Assistant, Google Sheets e InfluxDB estão em conexões.

Todos os guias do Marrow: MCP · Espelho autohospedado · Automações · Arquivos · Suporte

O que é uma automação

Uma tarefa salva em Exportar, Automatizado: um tipo de dado, um formato, um intervalo de datas, uma URL, uma frequência. O Marrow monta o arquivo a partir do seu armazenamento verificado e faz POST na URL com o app fechado, depois de cada sincronização concluída e a cada atualização em segundo plano, sempre que a frequência já tiver passado. Nada passa por nós: o celular fala direto com o seu endpoint.

Como configurar uma

  1. Aba Exportar, Automatizado: ative e depois toque em Nova automação. Quando criada a partir da página de uma ferramenta (n8n, Zapier, Home Assistant e as demais em conexões), a automação leva o nome dessa ferramenta e diz, ao lado de cada campo, o que a ferramenta espera ali.
  2. Endereço: a URL https para onde ele deve fazer POST. Cabeçalhos: os que o seu receptor precisar (um token bearer em Authorization, um X-Gitlab-Token, qualquer um). Quando a ferramenta não precisa de nenhum, Adicionar cabeçalho fica em Mais opções.
  3. Dados: Métricas de saúde, Treinos, Registro de força, Diário de nutrição ou Sintomas e humor, em JSON ou CSV. Cada automação leva um tipo, então crie uma para cada tipo que você quiser. Cada uma que estiver ativada conta como uma conexão: o plano Grátis mantém 1 conexão ativa por vez, o Marrow Pro até 10, incluindo IAs e servidores.
  4. Frequência: a cada tantos minutos, horas ou dias. O intervalo de datas, a agregação e o tempo limite ficam em Mais opções.
  5. Executar agora envia um primeiro payload para você conferir o receptor antes de esperar o agendamento.

Intervalos de datas

Formatos de payload

Métricas de saúde (totais diários, JSON)

A mesma estrutura das métricas do Health Auto Export (uma lista metrics com name, units e data com qty), então um receptor escrito para aquele app precisa de poucos ajustes: aqui as datas são dias simples, não timestamps, e os payloads de treino e musculação abaixo são do próprio Marrow. Os valores estão na unidade armazenada indicada em units (kg, m, mL, degC, kcal, count). A frequência cardíaca vem como Avg, Min e Max de cada dia em bpm, e o sono como cada noite com as suas fases em horas. Converta do seu lado se quiser o sistema imperial.

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

As amostras brutas (o agrupamento Amostras brutas) enviam cada amostra com o horário de início e de fim em vez de um total diário. As métricas em CSV chegam como a tabela larga descrita na página de arquivos.

Treinos

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

Registro de força

Cada série de trabalho (os aquecimentos ficam de fora), mais o progresso por exercício e o volume por grupo muscular. Os pesos estão na unidade que você escolheu em Ajustes, Unidades. O campo unit informa qual. O set_type de cada série é work, failure ou drop, e uma série também traz rir quando você registrou repetições em reserva. set_credits conta as séries creditadas a um grupo muscular, em frações quando um exercício trabalha vários grupos.

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

Diário de nutrição

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

Como escrever um receptor

Qualquer coisa que aceite um POST por HTTPS e responda 2xx funciona: um serviço de webhook, uma função serverless, um script em um servidor doméstico. Três regras o mantêm robusto:

Um receptor em Python de doze linhas que arquiva cada envio:

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 (um Cloudflare Tunnel, um Tailscale Funnel ou qualquer proxy reverso) e aponte a automação para ele. Se o que você quer é uma cópia consultável em vez de uma pasta de arquivos, o espelho autohospedado já é esse receptor pronto.

Bom saber

Solução de problemas

Teste com Executar agora. A linha embaixo diz o que aconteceu, e Mais opções, Registro de atividades guarda as últimas 30 execuções com a mesma linha. Ative Notificar ao executar (Mais opções) para receber uma notificação a cada execução enquanto você confere.

O que o Marrow mostraO que fazer
Um resumo do que foi enviado, como 12 diary entriesEntregue: o receptor respondeu 2xx. Se nada aparece do lado dele, veja as últimas linhas abaixo.
Server answered 401 ou 403O receptor quer um cabeçalho, ou o que você adicionou está errado. Confira o nome e o valor, incluindo Bearer e o espaço depois dele.
Server answered 404Endereço errado, ou o receptor não está escutando. No n8n, use a Production URL e ative o fluxo. Veja se não falta um caminho no final.
Server answered 405O endereço não aceita um POST. Aponte para o endpoint feito para receber dados.
Server answered 413O payload é grande demais para o receptor. Escolha um intervalo de datas menor, menos métricas, ou Totais diários no lugar de Amostras brutas.
Server answered 500 ou outro 5xxO receptor falhou ao processar. Veja o log dele. Arquive primeiro o corpo bruto e depois interprete.
A solicitação expirouO receptor demorou mais que o tempo limite. Responda primeiro e trabalhe depois, ou aumente o Timeout em Mais opções (até 300 s).
A política de Segurança de Transporte de Apps exige o uso de uma conexão seguraO endereço é http simples na internet. Use https. O iOS só deixa o Marrow usar http simples na sua própria rede.
Não foi possível encontrar um servidor com o nome de host especificadoUm erro de digitação no endereço, ou um nome que só a sua rede doméstica conhece. Teste no Safari do celular.
No valid URL - set an https endpoint firstO endereço está vazio ou não começa com https:// (ou http:// na sua própria rede).
Nothing to export in this rangeNão há dados desse tipo no intervalo de datas. Escolha um intervalo maior em Mais opções, ou registre algo antes.

As soluções ferramenta por ferramenta estão na página de cada uma: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, qualquer URL.