Apple Health 데이터를 웹훅으로 보내기
Apple Health에는 웹 API가 없어서, iPhone의 앱이 보내 줘야만 데이터가 웹훅에 도착해요. Marrow Health는 이 기능을 무료로 제공해요. 자동화가 건강 지표, 운동, 근력 세트, 음식 일기, 증상과 기분을 원하는 URL로 JSON이나 CSV 형식의 POST로 보내요. 정한 일정대로, 앱이 닫혀 있어도 돼요. 아래에 설정 방법, 페이로드, 그리고 n8n, Home Assistant, 일반 서버용 수신기 예제가 있어요. Marrow는 저희가 만들었어요.
자동화 설정하기
- Marrow Health에서 내보내기 탭을 열고, 자동을 탭한 다음 새로운 자동화를 탭하세요.
- 웹훅 URL을 붙여넣으세요(HTTPS를 사용하세요). 수신기가 확인하는 헤더가 있으면 추가하세요. 예를 들면
Authorization베어러 토큰이나 n8n 헤더 인증 키가 있어요. - 데이터 종류를 고르세요: 건강 지표, 운동, 근력 운동 기록, 영양 일기, 증상 및 기분. 자동화 하나는 한 종류만 보내고, 최대 열 개까지 만들 수 있어요.
- JSON 또는 CSV, 날짜 범위(기본값은 마지막 실행 이후), 실행 주기를 분, 시간, 일 단위로 고르세요.
- 켠 다음 지금 실행을 탭해서 수신기를 지켜보며 첫 페이로드를 보내 보세요.
각 요청은 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에서 받기
- Webhook 노드를 추가하세요. HTTP Method를
POST로 설정하고apple-health같은 경로를 지정하세요. - 비밀 값을 쓰려면 Authentication을 Header Auth로 설정하고, 같은 헤더 이름과 값을 Marrow 자동화에도 추가하세요.
- Listen for test event를 클릭한 다음, 2분 안에 Marrow에서 지금 실행을 탭하세요. 페이로드가 편집기에 나타나요.
- 워크플로를 게시하고 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 }}
- Marrow가
Content-Type: application/json을 보내기 때문에 JSON 본문은trigger.json에 들어 있어요. local_only는 기본으로 켜져 있어서 집 네트워크나 Nabu Casa 클라우드 웹훅 URL에서 보낸 POST만 받아요. 휴대폰이 인터넷을 통해 내 HTTPS 주소로 보낼 때는false로 설정하세요.- 웹훅 ID가 유일한 비밀이므로 길고 무작위로 만드세요.
내 서버에서 받기
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 에이전트도 질의할 수 있어요.
데이터를 잃지 않는 수신기를 위한 세 가지 규칙
- 마지막 값이 우선이에요. 값을 지표와 날짜를 키로 저장하고, 같은 키가 다시 오면 덮어쓰세요. 마지막 실행 이후는 일부러 최근 이틀을 다시 보내요. Apple Health가 하루가 끝난 뒤에도 그날의 데이터를 계속 채우기 때문이에요.
- 원본 본문을 먼저 저장하세요. 그다음에 파싱하세요. 파싱 버그 때문에 데이터를 잃는 일은 없어야 해요.
- 빨리 응답하세요. Marrow는 설정한 타임아웃(기본 60초)까지 기다리고, 실패한 실행은 다음 차례에 마지막으로 성공한 구간부터 다시 시도해요.
언제 실행되나요?
iOS가 Marrow를 실행하도록 허용할 때마다 실행돼요. Apple Health와 동기화한 뒤, 앱을 열 때, 백그라운드 새로고침 중에, 정한 간격이 지났다면요. 백그라운드 새로고침이 언제 일어날지는 iOS가 정하기 때문에, 하루 종일 잠겨 있던 휴대폰은 다음에 잠금을 풀 때 보내고, 마지막 실행 이후가 그 사이를 채워 줘요.
다른 방법
- Health Auto Export도 Apple Health 데이터를 웹훅으로 보내고, 지표 JSON 구조가 Marrow와 같아요. 자동화에는 Premium 등급이 필요해요.
- Apple 단축어는 건강 샘플을 읽고 Get Contents of URL로 보낼 수 있어요. 정해진 시간의 개인용 자동화에서 쓰면 돼요. 무료이지만 휴대폰이 잠금 해제된 동안에만 건강 데이터를 읽을 수 있고, 지표마다 직접 만들고 관리해야 해요.
- Apple의 export.zip은 한 번만 만드는 전체 백업이지 지속적인 데이터 전달 방식이 아니에요. CSV로 바꾸려면 저희 브라우저 변환기를 쓰세요.