이 페이지에서는 일반적인 Google Health API 작업의 색인과 각 작업의 예시와 함께 REST API 규칙의 개요를 제공합니다.
REST API 규칙
Google Health API는 Google API 개선 제안 (AIP) 표준, 특히 AIP-127 (HTTP 및 gRPC 트랜스코딩) 및 AIP-131~ AIP-135 (표준 메서드)를 따릅니다. 이러한 표준은 프로토 메시지에서 HTTP 요청으로 데이터를 매핑하는 방법을 정의합니다.
쿼리 매개변수
쿼리 매개변수는 데이터가 URL의 일부일 때 사용됩니다. 이는 주로 GET 요청 (리소스 가져오기) 또는 LIST 요청(필터링/페이지 나누기)에 사용되지만 DELETE 작업에도 사용됩니다.
- 위치:
?뒤에 URL에 추가됩니다. - 구문:
&로 구분된 키-값 쌍입니다. - 매핑: URL 경로 템플릿의 일부가 아닌 요청 메시지의 모든 필드는 쿼리 매개변수에 매핑됩니다.
- 가장 적합한 경우: 단순 유형 (문자열, 정수, enum) 및 반복 필드
구문 예시:
GET https://health.googleapis.com/v4/users/me/dataTypes/data-type/dataPoints?page_size=10&filter=data_type.interval.start_time >= "2025-10-01T00:00:00Z"
요청 본문
요청 본문은 데이터가 리소스의 상태를 수정하거나 URL에 비해 너무 클 때 사용됩니다. 본문은 일반적으로 리소스 자체의 JSON 표현입니다. 일반적으로 POST, PATCH, PUT 작업에 사용됩니다.
- 위치: HTTP 페이로드 내 (URL에 표시되지 않음)
- 구문: JSON 객체로 형식이 지정됩니다.
- 매핑:
google.api.http주석에 정의됩니다.body: "*"는 전체 메시지가 본문임을 의미합니다.body: "resource_name"은 프로토의 특정 필드만 본문임을 의미합니다.
- 가장 적합한 경우: 복잡한 객체, 중첩된 메시지, 민감한 데이터
구문 예시:
POST https://health.googleapis.com/v4/users/me/dataTypes/data-type/dataPoints:rollUp
Content-Type: application/json
{
"range": {
"startTime": "2025-11-05T00:00:00Z",
"endTime": "2025-11-13T00:00:00Z"
},
"windowSize": "3600s"
}하이브리드 사례
AIP-134를 준수하는 Update 메서드 또는 PATCH 작업에서는 둘 다 사용됩니다.
URL에는 리소스 이름이 포함되고, 본문에는 업데이트된 리소스 데이터가 포함되며, 쿼리 매개변수 (일반적으로 update_mask)는 변경할 필드를 지정합니다.
PATCH https://health.googleapis.com/v4/projects/project-id/subscribers/subscriber-id
Content-Type: application/json
{
"endpointUri": "https://myapp.com/new-webhooks/health"
}
주요 차이점 한눈에 보기
| 기능 | 쿼리 매개변수 | 요청 본문 |
|---|---|---|
| AIP 안내 | 검색, 필터링, 읽기 작업에 사용됩니다. | 쓰기 작업에 사용됩니다. |
| 공개 상태 | 브라우저 기록 및 서버 로그에 표시됩니다. | URL에서 숨겨집니다. |
| 복잡성 | 플랫 또는 반복 구조로 제한됩니다. | 깊이 중첩된 JSON 객체를 지원합니다. |
| 인코딩 | URL로 인코딩되어야 합니다 (예: 공백은 %20이 됨). |
표준 JSON 인코딩입니다. |
날짜
Google Health API의 모든 날짜는 YYYY-MM-DD 형식으로 표시됩니다. Nutrition API는 다음 조건으로 날짜 값에 ISO-8601 표준을 지원합니다.
- 4자리 연도
YYYY - 0000~9999 범위의 연도 값
- ISO-8601 표준 또는 기타 에포크에서 암시하는 시작 날짜 제한을 적용하지 않음
헤더
Google Health API 엔드포인트를 실행하려면 적절한 헤더와 액세스 토큰을 사용해야 합니다. GET 및 POST 요청 모두에 다음 헤더를 사용하는 것이 좋습니다.
Authorization: Bearer access-token Accept: application/json
API 작업 색인
이 섹션에서는 일반적인 Google Health API 작업의 색인과 각 작업의 예시를 제공합니다.
Fitbit 또는 Google 사용자 ID 가져오기
사용자가 Google OAuth 2.0을 통해 동의한 후 토큰 응답에 Fitbit 또는 Google 사용자 ID가 포함되지 않습니다. 사용자 ID를 가져오려면
getIdentity 엔드포인트를 호출합니다. getIdentity
는 Fitbit 기존 사용자 ID와 Google 사용자 ID를 모두 반환합니다.
OAuth를 통해 새 사용자가 동의하는 즉시 getIdentity 엔드포인트를 호출하고 두 사용자 ID를 모두 저장하는 것이 좋습니다. 이렇게 하면 통합에서 이전 버전과의 호환성 및 향후 호환성이 제공됩니다.
예를 들면 다음과 같습니다.
요청
GET https://health.googleapis.com/v4/users/me/identity Authorization: Bearer access-token Accept: application/json
응답
{
"name": "users/me/identity",
"legacyUserId": "A1B2C3",
"healthUserId": "111111256096816351"
}하루 종일 수집된 시간 내 또는 세부 데이터 가져오기
특정 데이터 유형의 list
엔드포인트를 사용하여 해당 데이터 유형에
지원되는 간격으로 하루 종일 수집된 시간 내 또는 세부 데이터를 가져옵니다.
예를 들면 다음과 같습니다.
요청
GET https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints Authorization: Bearer access-token Accept: application/json
응답
{
"dataPoints": [
{
"dataSource": {
"recordingMethod": "PASSIVELY_MEASURED",
"device": {
"manufacturer": "",
"displayName": "Charge 6"
},
"platform": "FITBIT"
},
"steps": {
"interval": {
"startTime": "2026-03-04T07:05:00Z",
"startUtcOffset": "0s",
"endTime": "2026-03-04T07:06:00Z",
"endUtcOffset": "0s",
"civilStartTime": {
"date": {
"year": 2026,
"month": 3,
"day": 4
},
"time": {
"hours": 7,
"minutes": 5
}
},
"civilEndTime": {
"date": {
"year": 2026,
"month": 3,
"day": 4
},
"time": {
"hours": 7,
"minutes": 6
}
}
},
"count": "40"
}
},
...
],
"nextPageToken": "Xm5h-6L0viZxIlRuWjx5bmvy98zj85uG34tuMn16mu2pntsnZI32iqhq"
}간격 시민 시작 시간으로 데이터 필터링
filter 매개변수가 있는 list 엔드포인트를 사용하여 시민 시간 또는 간격으로 데이터를 필터링합니다.
예를 들면 다음과 같습니다.
요청
GET https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints?filter=steps.interval.civil_start_time >= "2026-03-04T00:00:00" Authorization: Bearer access-token Accept: application/json
응답
{
"dataPoints": [
{
"dataSource": {
"recordingMethod": "PASSIVELY_MEASURED",
"device": {
"manufacturer": "",
"displayName": "Charge 6"
},
"platform": "FITBIT"
},
"steps": {
"interval": {
"startTime": "2026-03-04T07:05:00Z",
"startUtcOffset": "0s",
"endTime": "2026-03-04T07:06:00Z",
"endUtcOffset": "0s",
"civilStartTime": {
"date": {
"year": 2026,
"month": 3,
"day": 4
},
"time": {
"hours": 7,
"minutes": 5
}
},
"civilEndTime": {
"date": {
"year": 2026,
"month": 3,
"day": 4
},
"time": {
"hours": 7,
"minutes": 6
}
}
},
"count": "40"
}
...
],
"nextPageToken": "Xm5h-6L0viZxIlRuQjp5bml1bZ4ve2dhNmZvMnt4Yn7qIGQhbHN3YQ"
}샘플 관찰 실제 시간으로 데이터 필터링
filter 매개변수가 있는 list 엔드포인트를 사용하여 샘플 관찰 실제 시간으로 데이터를 필터링합니다.
예를 들면 다음과 같습니다.
요청
GET https://health.googleapis.com/v4/users/me/dataTypes/body-fat/dataPoints?filter=body_fat.sample_time.physical_time >= "2026-03-01T00:00:00Z" Authorization: Bearer access-token Accept: application/json
응답
{
"dataPoints": [
{
"name": "users/2515055256096816351/dataTypes/body-fat/dataPoints/1234567890",
"dataSource": {
"recordingMethod": "UNKNOWN",
"application": {
"packageName": "",
"webClientId": "",
"googleWebClientId": "google-web-client-id"
},
"platform": "GOOGLE_WEB_API"
},
"-->bodyFat<--": {
"sampleTime": {
"physicalTime": "2026-03-10T10:00:00Z",
"utcOffset": "0s",
"civilTime": {
"date": {
"year": 2026,
"month": 3,
"day": 10
},
"time": {
"hours": 10
}
}
},
"percentage": 20
}
}
"nextPageToken": ""
}웨어러블과 같은 데이터 소스로 데이터 필터링
reconcile
엔드포인트를 사용하여 조정된 스트림에서 "데이터 소스 패밀리"별로 데이터를 가져옵니다.
다음은 2026-03-03 이후의 트래커 기록 수면만 필터링하는 예입니다.
요청
GET https://health.googleapis.com/v4/users/me/dataTypes/sleep/dataPoints:reconcile?dataSourceFamily=users/me/dataSourceFamilies/google-wearables&filter=sleep.interval.civil_end_time >= "2026-03-03" Authorization: Bearer access-token Accept: application/json
응답
{
"dataPoints": [
{
"name": "users/2515055256096816351/dataTypes/sleep/dataPoints/2724123844716220216",
"dataSource": {
"recordingMethod": "DERIVED",
"device": {
"displayName": "Charge 6"
},
"platform": "FITBIT"
},
"sleep": {
"interval": {
"startTime": "2026-03-03T20:57:30Z",
"startUtcOffset": "0s",
"endTime": "2026-03-04T04:41:30Z",
"endUtcOffset": "0s"
},
"type": "STAGES",
"stages": [
{
"startTime": "2026-03-03T20:57:30Z",
"startUtcOffset": "0s",
"endTime": "2026-03-03T20:59:30Z",
"endUtcOffset": "0s",
"type": "AWAKE",
"createTime": "2026-03-04T04:43:40.937183Z",
"updateTime": "2026-03-04T04:43:40.937183Z"
},
…
{
"startTime": "2026-03-04T04:07:30Z",
"startUtcOffset": "0s",
"endTime": "2026-03-04T04:41:30Z",
"endUtcOffset": "0s",
"type": "AWAKE",
"createTime": "2026-03-04T04:43:40.937183Z",
"updateTime": "2026-03-04T04:43:40.937183Z"
}
],
"metadata": {
"stagesStatus": "SUCCEEDED",
"processed": true,
"main": true
},
"summary": {
"minutesInSleepPeriod": "464",
"minutesAfterWakeUp": "0",
"minutesToFallAsleep": "0",
"minutesAsleep": "407",
"minutesAwake": "57",
"stagesSummary": [
{
"type": "AWAKE",
"minutes": "56",
"count": "12"
},
{
"type": "LIGHT",
"minutes": "198",
"count": "19"
},
{
"type": "DEEP",
"minutes": "114",
"count": "10"
},
{
"type": "REM",
"minutes": "94",
"count": "4"
}
]
},
"createTime": "2026-03-04T04:43:40.337983Z",
"updateTime": "2026-03-04T04:43:40.937183Z"
}
}
],
"nextPageToken": ""
}일정 범위의 데이터 포인트 집계
rollUp
endpoint를 사용하여 사용자의 실제 시간 (UTC)을 기준으로 datetime 범위에서 초 단위의 창을 기준으로 데이터 포인트의
집계를 반환합니다.
rollUp 엔드포인트를 호출할 때는 사용자의 시민 시간으로 필요한 날짜 범위를 나타내는 요청 본문을 제공해야 합니다. 예를 들면 다음과 같습니다.
요청
POST https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints:rollUp
Authorization: Bearer access-token
Accept: application/json
{
"range": {
"startTime": "2026-02-17T17:00:00Z",
"endTime": "2026-02-17T17:59:59Z"
},
"windowSize": "30s"
}응답
{
"rollupDataPoints": [
{
"startTime": "2026-02-17T17:55:00Z",
"endTime": "2026-02-17T17:55:30Z",
"steps": {
"countSum": "41"
}
},
{
"startTime": "2026-02-17T17:54:00Z",
"endTime": "2026-02-17T17:54:30Z",
"steps": {
"countSum": "31"
}
},
...
]
}하루 또는 여러 날에 걸쳐 데이터 집계
dailyRollUp
엔드포인트는
하루 또는 여러 날에 걸쳐 데이터를 집계하려는 경우에
사용해야 합니다. windowSize 요청 본문에서 필요한 간격의 닫힌-열린 시민 시간 범위를 제공합니다. 데이터 유형에 따라 간격의 합계 또는 평균을 받게 됩니다.
예를 들면 다음과 같습니다.
요청
POST https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints:dailyRollUp
Authorization: Bearer access-token
Accept: application/json
{
"range": {
"start": {
"date": {
"year": 2026,
"month": 2,
"day": 26
},
"time": {
"hours": 0,
"minutes": 0,
"seconds": 0,
"nanos": 0
}
},
"end": {
"date": {
"year": 2026,
"month": 2,
"day": 26
},
"time": {
"hours": 23,
"minutes": 59,
"seconds": 59,
"nanos": 0
}
}
},
"windowSizeDays": 1
}응답
{
"rollupDataPoints": [
{
"civilStartTime": {
"date": {
"year": 2026,
"month": 2,
"day": 26
},
"time": {}
},
"civilEndTime": {
"date": {
"year": 2026,
"month": 2,
"day": 26
},
"time": {
"hours": 23,
"minutes": 59,
"seconds": 59
}
},
"steps": {
"countSum": "3822"
}
}
]
}사용자의 건강 데이터 삽입 또는 업데이트
patch
엔드포인트를 사용하여 사용자의 Fitbit 앱 데이터를 삽입하거나
업데이트합니다.
다음은 사용자가 'Scales R Us'라는 회사에서 'HumanScale'이라는 체중계로 체지방을 기록한 예입니다. 사용자의 새 체지방 측정값은 2026-03-10의 경우 20% 입니다.
요청
PATCH https://health.googleapis.com/v4/users/me/dataTypes/body-fat/dataPoints/1234567890
Authorization: Bearer access-token
content-length: 329
{
"name": "bodyFatName",
"dataSource": {
"recordingMethod": "ACTIVELY_MEASURED",
"device": {
"formFactor": "SCALE",
"manufacturer": "Scales R Us",
"displayName": "HumanScale"
}
},
"bodyFat": {
"sampleTime": {
"physicalTime": "2026-03-10T10:00:00Z"
},
"percentage": 20
}
}응답
{
"done": true,
"response": {
"@type": "type.googleapis.com/google.devicesandservices.health.v4main.DataPoint",
"name": "users/2515055256096816351/dataTypes/body-fat/dataPoints/1234567890",
"dataSource": {
"recordingMethod": "ACTIVELY_MEASURED",
"device": {
"formFactor": "SCALE",
"manufacturer": "Scales R Us",
"displayName": "HumanScale"
},
"application": {
"googleWebClientId": "618308034039.apps.googleusercontent.com"
},
"platform": "GOOGLE_WEB_API"
},
"bodyFat": {
"sampleTime": {
"physicalTime": "2026-03-10T10:00:00Z"
},
"percentage": 20
}
}
}사용자 건강 데이터 삭제
사용자의 Fitbit 앱 데이터 배열을 삭제하려면 batchDelete
endpoint를 사용합니다.
다음은 사용자가 이전에 체중계로 체지방을 기록했지만 기록을 삭제하려는 예입니다. 원래 삽입 작업의 user-id 및 data-point-id을 사용합니다.
요청
POST https://health.googleapis.com/v4/users/me/dataTypes/body-fat/dataPoints:batchDelete
Authorization: Bearer access-token
Accept: application/json
content-length: 93
{
"names": [
"users/2515055256096816351/dataTypes/body-fat/dataPoints/1234567890"
]
}응답
{
"done": true,
"response": {
"@type": "type.googleapis.com/google.devicesandservices.health.v4main.BatchDeleteDataPointsResponse"
}
}