Marrow Health
KO
다운로드

Apple Health 데이터를 웹훅으로 보내기

Apple Health에는 웹 API가 없어서, iPhone의 앱이 보내 줘야만 데이터가 웹훅에 도착해요. Marrow Health는 이 기능을 무료로 제공해요. 자동화가 건강 지표, 운동, 근력 세트, 음식 일기, 증상과 기분을 원하는 URL로 JSON이나 CSV 형식의 POST로 보내요. 정한 일정대로, 앱이 닫혀 있어도 돼요. 아래에 설정 방법, 페이로드, 그리고 n8n, Home Assistant, 일반 서버용 수신기 예제가 있어요. Marrow는 저희가 만들었어요.

자동화 설정하기

  1. Marrow Health에서 내보내기 탭을 열고, 자동을 탭한 다음 새로운 자동화를 탭하세요.
  2. 웹훅 URL을 붙여넣으세요(HTTPS를 사용하세요). 수신기가 확인하는 헤더가 있으면 추가하세요. 예를 들면 Authorization 베어러 토큰이나 n8n 헤더 인증 키가 있어요.
  3. 데이터 종류를 고르세요: 건강 지표, 운동, 근력 운동 기록, 영양 일기, 증상 및 기분. 자동화 하나는 한 종류만 보내고, 최대 열 개까지 만들 수 있어요.
  4. JSON 또는 CSV, 날짜 범위(기본값은 마지막 실행 이후), 실행 주기를 분, 시간, 일 단위로 고르세요.
  5. 켠 다음 지금 실행을 탭해서 수신기를 지켜보며 첫 페이로드를 보내 보세요.

각 요청은 POST이고 Content-Type: application/json(또는 text/csv)과 내가 설정한 헤더가 들어가요. 실행 때마다 응답 코드와 함께 앱의 자동화 기록에 표시돼요.

도착하는 내용

건강 지표는 units에 적힌 단위의 일일 합계로 도착해요. 심박수는 하루의 평균, 최소, 최대로, 수면은 단계가 포함된 밤별 기록으로 시간 단위로 와요:

{"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 구성은 자동화 레퍼런스에 있어요.

n8n에서 받기

  1. Webhook 노드를 추가하세요. HTTP Method를 POST로 설정하고 apple-health 같은 경로를 지정하세요.
  2. 비밀 값을 쓰려면 Authentication을 Header Auth로 설정하고, 같은 헤더 이름과 값을 Marrow 자동화에도 추가하세요.
  3. Listen for test event를 클릭한 다음, 2분 안에 Marrow에서 지금 실행을 탭하세요. 페이로드가 편집기에 나타나요.
  4. 워크플로를 게시하고 Marrow가 Production URL(/webhook-test/가 아니라 /webhook/이 들어 있는 주소)을 가리키게 하세요. 테스트 URL은 테스트 후에는 수신을 멈춰요.

페이로드는 body 아래에 있으므로 오늘의 걸음 수는 표현식에서 {{ $json.body.data.metrics.find(m => m.name === 'step_count').data.at(-1).qty }}예요. Split Out 노드를 body.data.metrics에 추가하면 지표마다 별도 항목으로 처리할 수 있어요. n8n은 기본적으로 최대 16 MB 페이로드를 받아서 수년 치 일일 합계도 충분해요. 프로덕션 실행은 편집기가 아니라 Executions에 표시돼요. (n8n Webhook 문서)

Home Assistant에서 받기

웹훅 트리거는 /api/webhook/<webhook_id>에서 POST를 받아요. 이 자동화는 최신 걸음 수를 input_number.steps_today라는 숫자 헬퍼에 저장해요(먼저 만들어 두고, 최댓값은 가장 많이 걸은 날보다 크게 잡으세요):

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 }}

(Home Assistant 웹훅 트리거 문서)

내 서버에서 받기

HTTPS POST를 받고 2xx로 응답하는 엔드포인트라면 어디든 돼요. 이 예제는 모든 페이로드를 파일에 보관해요:

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()

Cloudflare Tunnel, Tailscale Funnel 또는 리버스 프록시로 HTTPS 뒤에 두세요. 파일 폴더보다 질의할 수 있는 데이터베이스가 좋다면, Marrow의 셀프 호스팅 미러가 이미 만들어진 그 수신기이고, AI 에이전트도 질의할 수 있어요.

데이터를 잃지 않는 수신기를 위한 세 가지 규칙

언제 실행되나요?

iOS가 Marrow를 실행하도록 허용할 때마다 실행돼요. Apple Health와 동기화한 뒤, 앱을 열 때, 백그라운드 새로고침 중에, 정한 간격이 지났다면요. 백그라운드 새로고침이 언제 일어날지는 iOS가 정하기 때문에, 하루 종일 잠겨 있던 휴대폰은 다음에 잠금을 풀 때 보내고, 마지막 실행 이후가 그 사이를 채워 줘요.

다른 방법