Marrow Health
KO
다운로드

자동화: 일정에 따라 전달되는 내 데이터

Marrow는 원하는 주기로, 휴대폰에서 직접, 원하는 URL에 건강 데이터 파일을 POST할 수 있어요. 이 페이지는 레퍼런스예요. 설정 방법, 각 페이로드의 모양, 그리고 이를 받는 수신기를 만드는 방법을 담았어요.

n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB용 설정 예시는 연결에 준비되어 있어요.

Marrow 가이드 전체: MCP · 셀프 호스팅 미러 · 자동화 · 파일 · 지원

자동화란?

내보내기, 자동에 저장된 작업이에요. 데이터 종류 하나, 형식 하나, 날짜 범위 하나, URL 하나, 주기 하나로 이루어져요. Marrow는 검증된 저장소에서 파일을 만들어, 앱이 닫혀 있어도 동기화가 끝날 때마다, 그리고 백그라운드 새로고침 때 주기가 지났다면 URL로 POST해요. 우리 서버를 거치는 것은 없어요. 휴대폰이 내 엔드포인트와 직접 통신해요.

설정하는 방법

  1. 내보내기 탭, 자동: 켠 다음 새로운 자동화를 탭하세요. 도구의 페이지(연결의 n8n, Zapier, Home Assistant 등)에서 만들면 자동화에 그 도구의 이름이 붙고, 각 항목 옆에 그 도구가 거기에 무엇을 원하는지 안내가 나와요.
  2. 주소: POST할 https URL이에요. 헤더: 수신기가 필요로 하는 것(Authorization 베어러 토큰, X-Gitlab-Token 등 무엇이든). 도구에 필요 없는 경우 헤더 추가는 옵션 더 보기에 있어요.
  3. 데이터: 건강 지표, 운동, 근력 운동 기록, 영양 일기, 증상 및 기분을 JSON이나 CSV로 보내요. 자동화 하나는 한 종류만 보내므로 원하는 종류마다 하나씩 만드세요. 켜져 있는 자동화는 각각 연결 하나로 계산돼요. 무료는 한 번에 연결 1개, Marrow Pro는 최대 10개까지 켤 수 있고, AI와 서버도 포함돼요.
  4. 주기: 몇 분, 몇 시간 또는 며칠마다. 날짜 범위, 집계 방식, 타임아웃은 옵션 더 보기에 있어요.
  5. 지금 실행은 첫 페이로드를 보내서, 일정을 기다리기 전에 수신기를 확인할 수 있어요.

날짜 범위

페이로드 형태

건강 지표 (일일 합계, JSON)

Health Auto Export의 지표와 같은 구조예요(name, units, data(qty 포함)로 이루어진 metrics 목록). 그 앱용으로 만든 수신기도 조금만 고치면 돼요. 여기서 날짜는 타임스탬프가 아니라 일 단위이고, 아래 운동과 근력 페이로드는 Marrow 고유 형식이에요. 값은 units에 적힌 저장 단위(kg, m, mL, degC, kcal, count)로 와요. 심박수는 하루의 Avg, Min, Max를 bpm으로, 수면은 단계가 포함된 밤별 기록을 시간 단위로 보내요. 야드파운드법이 필요하면 받는 쪽에서 변환하세요.

{"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로 응답하는 곳이라면 어디든 돼요. 웹훅 서비스, 서버리스 함수, 홈 서버의 스크립트 모두 가능해요. 세 가지 규칙을 지키면 튼튼해져요:

모든 POST를 보관하는 열두 줄짜리 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 또는 아무 리버스 프록시) 자동화가 그곳을 가리키게 하세요. 파일 폴더보다 질의할 수 있는 사본이 필요하다면 셀프 호스팅 미러가 이미 만들어진 그 수신기예요.

알아 두면 좋은 점

문제 해결

지금 실행으로 테스트하세요. 그 아래 한 줄이 무슨 일이 있었는지 알려 주고, 옵션 더 보기, 활동 기록에 최근 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날짜 범위에 해당 종류의 데이터가 없어요. 옵션 더 보기에서 더 긴 범위를 고르거나 먼저 무언가를 기록하세요.

도구별 해결 방법은 각 도구의 페이지에 있어요: n8n, Zapier, Make, Home Assistant, Google Sheets, InfluxDB, 원하는 URL.