Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no cardYour first API call in 2 minutes →
Amazfit and Zepp API: get Amazfit watch data into FHIR
Zepp has no public cloud API: read Amazfit data with Zepp OS Mini Programs or Apple Health and store it as FHIR R4 Observations, with code.
Zepp, the app and platform behind Amazfit watches, has no public cloud API for health data. What it does offer is Zepp OS: any developer can build a Mini Program that reads heart rate, sleep, SpO₂, stress and steps on the watch and sends them to your server. The Zepp app also writes to Apple Health. You can store each reading as a LOINC-coded FHIR R4 Observation with one standard API call. Anpheros does not connect to Zepp's cloud itself: your code reads Zepp (on the watch, or Apple Health on the phone), and Anpheros keeps the record with the person's consent. Zepp does not document a sync to Health Connect.
Read Amazfit and Zepp data and store it in FHIR
Zepp has no cloud endpoint to call, so the data is read on the watch by your Zepp OS Mini Program (or from Apple Health on iPhone). On the watch, with the data:user.hd.heart_rate permission declared in app.json:
import { HeartRate } from '@zos/sensor'
const heartRate = new HeartRate()
const today = heartRate.getToday() // per-minute values since 0:00
Pass the values to your app's Side Service, which runs inside the Zepp phone app, and post them to your backend with its fetch(). The messaging code is in Zepp's Side Service guide.
Then, on your backend, the day's heart rate as a FHIR Observation in the person's record (sandbox key sk_test_…):
curl -X POST https://platform.anpheros.com/fhir/R4/Observation \
-H "Authorization: Bearer $ANPHEROS_KEY" \
-H "Content-Type: application/fhir+json" \
-H "X-Anpheros-Author-Type: device" \
-d '{"resourceType":"Observation","status":"final",
"category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"vital-signs"}]}],
"code":{"coding":[{"system":"http://loinc.org","code":"8867-4","display":"Heart rate"}]},
"subject":{"reference":"Patient/<id>"},
"effectivePeriod":{"start":"2026-11-02T00:00:00+01:00","end":"2026-11-02T23:59:59+01:00"},
"valueQuantity":{"value":70,"unit":"/min","system":"http://unitsofmeasure.org","code":"/min"},
"device":{"display":"Amazfit (via Zepp OS)"}}'
The same in Python: your backend turns the getToday() values into a daily average, minimum and maximum.
import os, requests
FHIR = "https://platform.anpheros.com/fhir/R4"
fhir = {"Authorization": f"Bearer {os.environ['ANPHEROS_KEY']}", "Content-Type": "application/fhir+json",
"X-Anpheros-Author-Type": "device"}
def save_heart_rate(patient_id, day, minutes):
"""`minutes` is the HeartRate.getToday() list your Side Service posted for `day`."""
values = [v for v in minutes if v] # skip minutes without a reading
bpm = lambda v: {"value": v, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"}
obs = {
"resourceType": "Observation", "status": "final",
"category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
"code": {"coding": [{"system": "http://loinc.org", "code": "8867-4", "display": "Heart rate"}]},
"subject": {"reference": f"Patient/{patient_id}"},
"effectivePeriod": {"start": f"{day}T00:00:00+01:00", "end": f"{day}T23:59:59+01:00"},
"valueQuantity": bpm(round(sum(values) / len(values))),
"component": [{"code": {"text": "minimum"}, "valueQuantity": bpm(min(values))},
{"code": {"text": "maximum"}, "valueQuantity": bpm(max(values))}],
"device": {"display": "Amazfit (via Zepp OS)"},
}
r = requests.post(f"{FHIR}/Observation", headers=fhir, json=obs)
print(r.status_code, day, "saved")
And in JavaScript (Node 18+), resting heart rate from HeartRate.getResting():
const fhir = { Authorization: `Bearer ${process.env.ANPHEROS_KEY}`, 'Content-Type': 'application/fhir+json' };
// What your Side Service posts: the day and the value of HeartRate.getResting()
const body = { day: '2026-11-02', resting: 56 };
await fetch('https://platform.anpheros.com/fhir/R4/Observation', {
method: 'POST', headers: { ...fhir, 'X-Anpheros-Author-Type': 'device' },
body: JSON.stringify({
resourceType: 'Observation', status: 'final',
category: [{ coding: [{ system: 'http://terminology.hl7.org/CodeSystem/observation-category', code: 'vital-signs' }] }],
code: { coding: [{ system: 'http://loinc.org', code: '40443-4', display: 'Heart rate --resting' }] },
subject: { reference: 'Patient/<id>' },
effectivePeriod: { start: body.day, end: body.day },
valueQuantity: { value: body.resting, unit: '/min', system: 'http://unitsofmeasure.org', code: '/min' },
device: { display: 'Amazfit (via Zepp OS)' },
}),
});
The class and method names (HeartRate, getToday(), getResting()) are from Zepp's Zepp OS sensor reference; what your Side Service posts is your own format. The Anpheros side is standard FHIR R4, so the same requests work with any FHIR server.
Ways to get Amazfit and Zepp data into FHIR
| Path | Status | What you need |
|---|---|---|
| Your backend reads a Zepp cloud API, then writes FHIR to Anpheros | Not available | No public API. Zepp's open platform site shows only a sign-in page, with no API documentation |
| Your Zepp OS Mini Program reads the watch, its Side Service sends to your server → Anpheros | Works today | A Zepp OS app published through the Zepp console, permissions in app.json, the person installs your app |
| Zepp app → Apple Health → your iPhone app reads HealthKit → Anpheros | Works today | Zepp added as a source in Apple Health; HealthKit permissions. HRV for the Balance 2 needs Zepp app 10.5.5 or later. See Apple Health to FHIR |
| Zepp app → Health Connect → your Android app → Anpheros | Not available | Not documented by Zepp. Zepp documents a Google Fit sync, and Google supports the Google Fit APIs only until the end of 2026 |
| A direct Zepp connector inside Anpheros | On our roadmap | Not available yet. Use the button below to tell us you need it |
What Zepp offers developers
Zepp OS. An open developer platform with public docs. You publish Mini Programs and watch faces through the Zepp console; fees are not stated. There is no OAuth: your app declares permissions in app.json, and the person agrees when they install it. The health APIs come from @zos/sensor:
| Data | Class and methods | Permission |
|---|---|---|
| Heart rate | HeartRate: getCurrent(), getLast(), getToday(), getResting(), getAFibRecord() (API 3.0), onCurrentChange |
data:user.hd.heart_rate |
| Sleep | Sleep: getInfo() (score, deepTime, startTime, endTime, totalTime), getStage() (WAKE, REM, LIGHT, DEEP), getNap() (API 3.0), updateInfo() |
data:user.hd.sleep |
| SpO₂ | BloodOxygen: getCurrent(), getLastDay() (24 values), getLastFewHour(h) (API 3.0) |
data:user.hd.spo2 |
| Stress | Stress: getCurrent(), getToday(), getLastWeek() |
data:user.hd.stress |
| Also | Step, Calorie, Distance, Pai, Wear, Workout, BodyTemperature |
see Zepp's sensor pages |
The system refreshes sleep data about every 30 minutes. No HRV sensor API is listed. The Side Service runs inside the Zepp phone app without a screen and supports fetch(), messaging and settings storage, so a Mini Program can send data to your own server.
Cloud. Zepp publishes no cloud REST API for health data. The "Zepp Open Platform" site shows only a sign-in and registration page with an enterprise route, and no readable API docs; access terms and cost are not published. Community "Zepp/Huami cloud" clients use an unofficial, undocumented API that Zepp does not support.
Recent changes. The docs list API_LEVEL 4.2 and 5.0; 5.0 adds list views and binary serialization but no new health APIs. Zepp OS 6 reached the Amazfit Balance 2 series in an August 2026 update, and HRV export to Apple Health came for the Balance 2 with Zepp app 10.5.5 or later.
Sources: Zepp OS documentation, permissions, HeartRate, Sleep, BloodOxygen, Side Service, Zepp app sync with other apps, Amazfit Balance 2 August 2026 update, November 2026.
Amazfit and Zepp data as FHIR Observations
| Zepp data | LOINC | UCUM unit | Note |
|---|---|---|---|
Heart rate (HeartRate.getToday()) |
8867-4 | /min |
daily average, minimum and maximum rather than every minute |
Resting heart rate (HeartRate.getResting()) |
40443-4 | /min |
one per day |
Sleep (Sleep.getInfo() totalTime) |
93832-4 | min |
check the unit in Zepp's Sleep reference |
Sleep stages (Sleep.getStage()) |
93831-6, 93830-8, 93829-0 | min |
DEEP, LIGHT, REM |
SpO₂ (BloodOxygen) |
59408-5 | % |
category vital-signs |
Steps (Step) |
41950-7 | {steps} |
one per day |
Stress (Stress) |
see note | a Zepp score, not a LOINC measurement; use your own code | |
| HRV (Balance 2, through Apple Health) | 80404-7 | ms |
read from HealthKit's heartRateVariabilitySDNN type. See Wearable data in FHIR |
Frequently asked questions
Does Zepp have a public API?
Not a cloud one. Zepp publishes no cloud REST API for health data. Zepp OS, the platform for apps on Amazfit watches, is open to any developer.
Is there an Amazfit API?
Amazfit watches run Zepp OS, so the Amazfit API for developers is the Zepp OS one: a Mini Program on the watch reads heart rate, sleep, SpO₂, stress and steps and can send them to your server through its Side Service.
Can I get Amazfit data on iPhone?
Yes, through Apple Health. The Zepp app writes to Apple Health once Zepp is added as a source, and your app reads it with HealthKit.
Does the Zepp app write to Health Connect?
Zepp does not document it. Zepp documents a Google Fit sync, and Google supports the Google Fit APIs only until the end of 2026.
Can I get HRV from an Amazfit watch?
Zepp OS lists no HRV sensor API. For the Balance 2, the Zepp app (10.5.5 or later) writes HRV to Apple Health, where your app can read it.
Does Anpheros connect to Zepp directly?
Not yet. Today your code reads Zepp (on the watch, or Apple Health on the phone) and writes standard FHIR to Anpheros. A direct Zepp connector is on our roadmap; tell us with the button on this page if you need it.
Related
- Wearable APIs: every brand compared
- Wearable data in FHIR (Apple Health, Health Connect)
- Apple Health (HealthKit) to FHIR
- Health Connect to FHIR
- Xiaomi Mi Band API to FHIR · Huawei Health Kit API to FHIR · Google Health API to FHIR
Ask your AI
Paste this into Claude, ChatGPT, Cursor or Claude Code. Your assistant reads this guide and adapts it to your code.
Read https://developers.anpheros.com/guides/amazfit-zepp-api.md and help me apply this guide to my own project. Use the Anpheros sandbox (base URL https://platform.anpheros.com) with my API key from the ANPHEROS_KEY environment variable, never written in the code. Give me complete, runnable code, the response I should expect, and how to fix the errors in https://developers.anpheros.com/guides/troubleshooting.md if a call fails.Open in ClaudeOpen in ChatGPTThis guide as MarkdownBuild the whole integration with an AI coding tool
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no cardYour first API call in 2 minutes →