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
- 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.
- Endereço: a URL https para onde ele deve fazer POST. Cabeçalhos: os que o seu receptor precisar (um token bearer em
Authorization, umX-Gitlab-Token, qualquer um). Quando a ferramenta não precisa de nenhum, Adicionar cabeçalho fica em Mais opções. - 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.
- 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.
- Executar agora envia um primeiro payload para você conferir o receptor antes de esperar o agendamento.
Intervalos de datas
- Desde a última corrida (padrão): tudo desde a última execução bem-sucedida, menos uma sobreposição de dois dias. O HealthKit continua preenchendo um dia depois que ele termina, então a sobreposição reenvia os dias concluídos recentemente. Guarde do seu lado o valor mais recente por métrica e dia, e as repetições não fazem mal. Um receptor que ficou fora do ar por um tempo recebe todos os dias perdidos na primeira execução que der certo.
- Hoje, Últimos 7 / 30 / 90 dias, Último ano: janelas móveis fixas, reenviadas por completo a cada execução. Escolha essas quando preferir um retrato que se corrige sozinho a um delta.
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:
- Vale o mais recente. Guarde os valores com a chave (métrica, dia) ou com a identidade do próprio registro e sobrescreva quando se repetirem. As janelas se sobrepõem de propósito.
- Arquive primeiro o corpo bruto. Depois interprete. Um erro de leitura nunca deve custar os dados a você.
- Responda rápido. O Marrow espera até o tempo limite que você definiu (padrão 60 s) e, passado esse tempo, marca a execução como falha. As execuções com falha são tentadas de novo no próximo ciclo da frequência, a partir da última janela bem-sucedida.
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
- As automações só rodam quando o iOS deixa o app rodar: depois de uma sincronização concluída, na atualização em primeiro plano e durante a atualização em segundo plano. Um celular que fica bloqueado o dia todo envia na próxima vez que for desbloqueado. A janela desde a última execução cobre o intervalo.
- Cada execução fica registrada no Registro de atividades da automação (Mais opções) com o seu resultado, então uma URL mal configurada aparece no app, e não só no seu servidor.
- Duplique uma automação para reaproveitar os cabeçalhos dela em outro tipo.
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 mostra | O que fazer |
|---|---|
Um resumo do que foi enviado, como 12 diary entries | Entregue: o receptor respondeu 2xx. Se nada aparece do lado dele, veja as últimas linhas abaixo. |
Server answered 401 ou 403 | O 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 404 | Endereç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 405 | O endereço não aceita um POST. Aponte para o endpoint feito para receber dados. |
Server answered 413 | O 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 5xx | O receptor falhou ao processar. Veja o log dele. Arquive primeiro o corpo bruto e depois interprete. |
| A solicitação expirou | O 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 segura | O 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 especificado | Um 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 first | O endereço está vazio ou não começa com https:// (ou http:// na sua própria rede). |
Nothing to export in this range | Não há dados desse tipo no intervalo de datas. Escolha um intervalo maior em Mais opções, ou registre algo antes. |
- Entregue, mas nada chega. Alguns receptores respondem 200 mesmo quando descartam os dados. O Home Assistant faz isso com um ID de webhook errado, e a receita do Apps Script faz isso com um
?key=errado. O Zapier e o Make não mostram nada até você carregar um exemplo no editor deles. Confira o histórico ou o log do próprio receptor. - As execuções atrasam ou não acontecem. O iOS escolhe o momento das execuções em segundo plano: depois de uma sincronização, quando você abre o Marrow e durante a atualização em segundo plano. Mantenha a Atualização em Segundo Plano ativada para o Marrow (Ajustes, Geral, Atualização em Segundo Plano). O Modo de Pouca Energia segura as execuções em segundo plano, e um celular que fica bloqueado envia na próxima vez que for desbloqueado. Desde a última corrida se atualiza na próxima execução que der certo.
- Um receptor na sua rede doméstica. O Marrow precisa do acesso à Rede Local para alcançá-lo: Ajustes, Privacidade e Segurança, Rede Local. Toque em Executar agora uma vez com o Marrow aberto para o iOS poder perguntar. Em segundo plano, o iOS recusa sem perguntar até você responder.
- Você fechou o app. Depois que você fecha o Marrow deslizando no seletor de apps, o iOS pode não acordá-lo em segundo plano até você abri-lo de novo.
- Os mesmos dias chegam duas vezes. É de propósito: Desde a última corrida reenvia os dois últimos dias, porque o Apple Health continua preenchendo esses dias. Guarde o valor mais recente por métrica e dia.
- Não quer ativar. Cada automação ativada conta como uma conexão. O plano Grátis mantém 1 conexão ativa por vez, o Marrow Pro até 10: IAs, servidores e automações juntos. Desative outra antes.
- As unidades parecem erradas. As métricas chegam nas unidades armazenadas indicadas em
units(kg, m, mL, degC, kcal). As séries de musculação seguem Ajustes, Unidades, e o campounitinforma qual.
As soluções ferramenta por ferramenta estão na página de cada uma: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, qualquer URL.