Автоматизации: ваши данные, отправляемые по расписанию
Marrow может отправлять POST-запросом файл с вашими данными о здоровье на любой выбранный вами URL, с выбранной вами периодичностью, прямо с телефона. Эта страница служит справочником: как настроить автоматизацию, как выглядит каждый запрос и как написать то, что его принимает.
Готовые настройки для n8n, Zapier, Make, Home Assistant, Google Sheets и InfluxDB собраны в разделе подключения.
Все руководства Marrow: MCP · Зеркало на своем сервере · Автоматизации · Файлы · Поддержка
Что такое автоматизация
Сохраненное задание в разделе Экспорт, Автоматически: один вид данных, один формат, один диапазон дат, один URL, одна периодичность. Marrow собирает файл из своего проверенного хранилища и отправляет его POST-запросом на URL при закрытом приложении, после каждой записи синхронизации и при каждом фоновом обновлении, как только пройдет заданный интервал. Через нас ничего не проходит: телефон обращается прямо к вашему адресу.
Как настроить
- Вкладка «Экспорт», Автоматически: включите, затем Новая автоматизация. Если создать ее со страницы инструмента (n8n, Zapier, Home Assistant и остальные в разделе подключения), автоматизация получит название этого инструмента, а рядом с каждым полем будет подсказка, что туда нужно ввести.
- Адрес: https URL, на который она отправляет POST. Заголовки: любые, которые нужны вашему приемнику (bearer-токен
Authorization,X-Gitlab-Token, что угодно). Если инструменту они не нужны, «Добавить заголовок» находится в разделе «Другие параметры». - Данные: Показатели здоровья, Тренировки, Журнал силовых, Дневник питания или Симптомы и настроение, в формате JSON или CSV. Одна автоматизация отправляет один вид данных, поэтому создайте по одной на каждый нужный вид. Каждая включенная автоматизация считается подключением: на бесплатном тарифе одновременно может быть включено 1 подключение, в Marrow Pro до 10, включая ИИ и серверы.
- Периодичность: раз в столько-то минут, часов или дней. Диапазон дат, агрегирование и таймаут находятся в разделе Другие параметры.
- Запустить сейчас отправляет первый запрос, чтобы вы могли проверить приемник, не дожидаясь расписания.
Диапазоны дат
- С последнего запуска (по умолчанию): все, что было после последнего успешного запуска, минус перекрытие в два дня. HealthKit продолжает дописывать день после его окончания, поэтому перекрытие заново отправляет недавно завершившиеся дни. Храните у себя последнее значение по каждому показателю и дню, и повторы будут безвредны. Приемник, который какое-то время не работал, получит все пропущенные дни при первом же успешном запуске.
- Сегодня, Последние 7 / 30 / 90 дней, Последний год: фиксированные скользящие периоды, которые отправляются целиком при каждом запуске. Выбирайте их, если вам нужен самовосстанавливающийся снимок, а не приращение.
Структура запросов
Показатели здоровья (дневные итоги, JSON)
Та же структура, что и у показателей в Health Auto Export (список metrics из name, units и data с qty), поэтому приемнику, написанному для этого приложения, нужны лишь небольшие изменения: даты здесь указаны днями, а не метками времени, а запросы для тренировок и силовых ниже имеют собственный формат Marrow. Значения приходят в хранимой единице, указанной в units (kg, m, mL, degC, kcal, count). Пульс приходит как Avg, Min и Max за каждый день в уд/мин, а сон как каждая ночь с фазами в часах. Если нужны имперские единицы, переводите на своей стороне.
{"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"}]}
]}}
Исходные записи (группировка Исходные записи) отправляют каждый замер со временем начала и окончания вместо дневного итога. Показатели в CSV приходят в виде широкой таблицы, описанной на странице о файлах.
Тренировки
{"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"}
]}}
Журнал силовых
Каждый рабочий подход (разминочные не включаются), а также прогресс по каждому упражнению и объем по каждой группе мышц. Вес указан в единице, выбранной в разделе Настройки, Единицы измерения. Поле unit показывает, в какой именно. Поле set_type каждого подхода равно work, failure или drop, а если вы записывали повторы в запасе, у подхода есть и rir. set_credits считает подходы, засчитанные группе мышц, дробными значениями, когда упражнение задействует несколько групп.
{"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}]
}}
Дневник питания
{"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}}
]}
]}}
Как написать приемник
Подойдет все, что принимает HTTPS POST и отвечает кодом 2xx: сервис вебхуков, serverless-функция, скрипт на домашнем сервере. Три правила делают приемник надежным:
- Побеждает последнее. Храните значения по ключу (показатель, день) или по собственному идентификатору записи и перезаписывайте при повторе. Периоды перекрываются намеренно.
- Сначала архивируйте тело запроса как есть. Затем разбирайте. Ошибка парсера не должна стоить вам данных.
- Отвечайте быстро. Marrow ждет не дольше заданного вами таймаута (по умолчанию 60 с), а иначе помечает запуск как неудавшийся. Неудавшиеся запуски повторяются на следующем такте периодичности, начиная с последнего успешного периода.
Приемник на Python в двенадцать строк, который архивирует каждый запрос:
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()
Откройте его по HTTPS (Cloudflare Tunnel, Tailscale Funnel или любой обратный прокси) и направьте на него автоматизацию. Если вам нужна копия, к которой можно делать запросы, а не папка с файлами, зеркало на своем сервере как раз такой готовый приемник.
Полезно знать
- Автоматизации запускаются, только когда iOS позволяет приложению работать: после записи синхронизации, при обновлении на переднем плане и во время фонового обновления. Телефон, который весь день заблокирован, отправит данные при следующей разблокировке. Период «С последнего запуска» закрывает пропуск.
- Каждый запуск записывается в Журнал активности автоматизации (Другие параметры) с результатом, поэтому неверный URL виден в приложении, а не только на вашем сервере.
- Продублируйте автоматизацию, чтобы использовать ее заголовки для другого вида данных.
Устранение неполадок
Проверяйте кнопкой Запустить сейчас. Строка под ней сообщает, что произошло, а в Другие параметры, Журнал активности хранятся последние 30 запусков с такой же строкой. Включите Уведомлять при запуске (Другие параметры), чтобы получать уведомление о каждом запуске, пока вы проверяете.
| Что показывает Marrow | Что делать |
|---|---|
Сводка отправленного, например 12 diary entries | Доставлено: приемник ответил 2xx. Если на его стороне ничего не видно, см. последние строки ниже. |
Server answered 401 или 403 | Приемнику нужен заголовок, или добавленный вами неверен. Проверьте его имя и значение, включая Bearer и пробел после него. |
Server answered 404 | Неверный адрес, или приемник не слушает. В n8n используйте Production URL и активируйте рабочий процесс. Проверьте, не пропущен ли путь в конце. |
Server answered 405 | Адрес не принимает POST. Укажите адрес, предназначенный для входящих данных. |
Server answered 413 | Запрос слишком велик для приемника. Выберите более короткий диапазон дат, меньше показателей или «Дневные итоги» вместо «Исходных записей». |
Server answered 500 или другой 5xx | Приемник дал сбой при обработке. Посмотрите его собственный журнал. Сначала архивируйте тело запроса как есть, затем разбирайте. |
| Время ожидания запроса истекло | Приемник ответил дольше, чем позволяет таймаут. Сначала отвечайте, потом работайте, или увеличьте Таймаут в разделе «Другие параметры» (до 300 с). |
| Политика App Transport Security требует использовать защищенное соединение | Адрес использует обычный http в интернете. Используйте https. iOS разрешает Marrow использовать обычный http только в вашей собственной сети. |
| Не удалось найти сервер с указанным именем хоста | Опечатка в адресе или имя, известное только вашей домашней сети. Проверьте его в Safari на телефоне. |
No valid URL - set an https endpoint first | Адрес пуст или не начинается с https:// (или http:// в вашей собственной сети). |
Nothing to export in this range | Нет данных такого вида в этом диапазоне дат. Выберите более длинный диапазон в разделе «Другие параметры» или сначала что-нибудь запишите. |
- Доставлено, но ничего не приходит. Некоторые приемники отвечают 200, даже когда отбрасывают данные. Так делает Home Assistant при неверном ID вебхука, а рецепт для Apps Script при неверном
?key=. Zapier и Make ничего не показывают, пока вы не загрузите образец в их редакторе. Проверьте собственную историю или журнал приемника. - Запуски приходят поздно или не приходят вовсе. Момент фоновых запусков выбирает iOS: после синхронизации, при открытии Marrow и во время фонового обновления. Оставьте для Marrow включенным «Обновление контента» (Настройки, Основные, Обновление контента). Режим энергосбережения сдерживает фоновые запуски, а телефон, который остается заблокированным, отправит данные при следующей разблокировке. «С последнего запуска» наверстает пропущенное при следующем успешном запуске.
- Приемник в вашей домашней сети. Чтобы до него добраться, Marrow нужен доступ к локальной сети: Настройки, Конфиденциальность и безопасность, Локальная сеть. Один раз нажмите «Запустить сейчас» при открытом Marrow, чтобы iOS могла спросить. В фоне iOS отказывает без вопроса, пока вы не ответите.
- Приложение смахнуто. Если смахнуть Marrow в переключателе приложений, iOS может не будить его в фоне, пока вы не откроете его снова.
- Одни и те же дни приходят дважды. Так задумано: «С последнего запуска» заново отправляет последние два дня, потому что Apple Health продолжает их дописывать. Храните последнее значение по каждому показателю и дню.
- Не включается. Каждая включенная автоматизация считается подключением. На бесплатном тарифе одновременно может быть включено 1 подключение, в Marrow Pro до 10: ИИ, серверы и автоматизации вместе. Сначала выключите другое.
- Единицы выглядят неправильно. Показатели приходят в хранимых единицах, указанных в
units(kg, m, mL, degC, kcal). Силовые подходы следуют настройке «Настройки, Единицы измерения», а полеunitпоказывает, какой именно.
Решения для каждого инструмента по отдельности есть на его странице: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, любой URL.