หน้านี้จะแสดงภาพรวมของรูปแบบ REST API พร้อมดัชนีของ งานทั่วไปของ Google Health 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.httpbody: "*"หมายความว่าข้อความทั้งหมดคือเนื้อหาbody: "resource_name"หมายความว่ามีเพียงฟิลด์ที่เฉพาะเจาะจงใน Proto เท่านั้นที่เป็น เนื้อหา
- เหมาะสำหรับ: ออบเจ็กต์ที่ซับซ้อน ข้อความที่ซ้อนกัน และข้อมูลที่ละเอียดอ่อน
ตัวอย่างไวยากรณ์
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"
}กรณีไฮบริด
ในUpdateเมธอดที่สอดคล้องกับ AIP-134 หรือPATCHการดำเนินการ จะใช้ทั้ง 2 อย่าง
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 หรือ Epoch อื่นๆ
ส่วนหัว
การเรียกใช้ปลายทาง Google Health API ต้องใช้ส่วนหัวและโทเค็นเพื่อการเข้าถึงที่เหมาะสม เราขอแนะนำให้ใช้ส่วนหัวต่อไปนี้สำหรับทั้งคำขอ GET และ POST
Authorization: Bearer access-token Accept: application/json
ดัชนีงาน API
ส่วนนี้แสดงดัชนีของงาน Google Health API ที่พบบ่อยและตัวอย่างของแต่ละงาน
รับรหัสผู้ใช้ Fitbit หรือ Google
หลังจากที่ผู้ใช้ให้ความยินยอมผ่าน Google OAuth 2.0 การตอบกลับโทเค็นจะไม่มีรหัสผู้ใช้ Fitbit หรือ Google
หากต้องการรับรหัสผู้ใช้ ให้เรียกใช้getIdentityปลายทาง getIdentityแสดงทั้งรหัสผู้ใช้เดิมของ Fitbit และรหัสผู้ใช้ Google
เราขอแนะนำให้คุณเรียกใช้ปลายทาง
getIdentity และจัดเก็บทั้งรหัสผู้ใช้ทันทีที่ผู้ใช้ใหม่ให้ความยินยอมผ่าน OAuth ซึ่งจะช่วยให้การผสานรวมของคุณเข้ากันได้ทั้งกับเวอร์ชันก่อนหน้าและเวอร์ชันใหม่
เช่น
ส่งคำขอ
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"
}กรองข้อมูลตามเวลาเริ่มต้นของช่วงเวลา
ใช้ปลายทาง list กับพารามิเตอร์ filter เพื่อกรองข้อมูลตามเวลาพลเรือน
หรือช่วงเวลา
เช่น
ส่งคำขอ
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"
}กรองข้อมูลตามเวลาจริงของการสังเกตตัวอย่าง
ใช้ปลายทาง list กับพารามิเตอร์ filter เพื่อกรองข้อมูลตามเวลาจริงของการสังเกตตัวอย่าง
เช่น
ส่งคำขอ
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
ปลายทางเพื่อแสดงผล
การรวมจุดข้อมูลตามกรอบเวลาเป็นวินาทีในช่วงdatetime
ตามเวลาจริงของผู้ใช้ (ใน UTC)
เมื่อเรียกใช้ปลายทาง 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 ของผู้ใช้
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าผู้ใช้บันทึกไขมันร่างกายบนเครื่องชั่งที่ชื่อ "HumanScale" จากบริษัท "Scales R Us" ค่าการอ่านค่าไขมันร่างกายใหม่ของผู้ใช้คือ 20% สำหรับวันที่ 10-03-2026
ส่งคำขอ
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
}
}
}ลบข้อมูลสุขภาพของผู้ใช้
ใช้batchDelete
อุปกรณ์ปลายทางเพื่อลบ
อาร์เรย์ของข้อมูลแอป Fitbit ของผู้ใช้
ตัวอย่างเช่น ผู้ใช้เคยบันทึกไขมันร่างกายบนเครื่องชั่ง แต่ต้องการลบบันทึก ใช้ 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"
}
}