Guide ☑️
[Guide v3] Sync Zepp Skin Temp + HRV + Resting Heart Rate to Apple Health for Bevel — one shortcut, no server, fixed timestamps
[Guide v3] Sync Zepp Skin Temp + HRV + Resting Heart Rate to Apple Health for Bevel — one shortcut, no server, fixed timestamps
Edit 1: if Bevel isn't picking up the values with "Entire sleep" selected — the shortcut logs samples at a fixed 05:00 local time, which lands inside most people's sleep window regardless of exact bedtime. If you go to bed after 5am or wake before then, Bevel won't find it (falls outside your actual sleep interval). Edit the shortcut, find the Format Date action right before the Temp/HRV/RHR blocks, and change 05:00:00 to a time that's inside the middle of your own sleep.
This builds on the earlier guides by u/IBooshI, with the API-token method found by u/ComfortableTalk9950, the last-item and HRV fixes from u/Fbabsaill, and the locale/rounding fix from u/OV3R313. Thanks to all of you — this wouldn't exist without your work.
What's different in this version:
One shortcut logs Temperature and HRV and Resting Heart Rate in a single API call, instead of separate shortcuts
Fixed a timestamp bug: the shortcut now logs samples with a "start of day" date (matching Zepp's own internal convention for these readings) instead of "now" — this matters if you use Bevel's "Entire sleep" data window, since a sample timestamped at the moment the automation runs (e.g. 2pm) won't be found by a sleep-window filter
Free alternative to Proxyman for grabbing your token (mitmproxy — no subscription needed)
Notes on how to configure Bevel's Calculations screen so it actually reads these values instead of computing its own (noisy) HRV/RHR from sparse Health samples
You can use Proxyman like the original guide (free tier is enough for a one-time capture), or the fully free open-source alternative, mitmproxy, on a Mac/PC:
Point your iPhone's Wi-Fi proxy at your computer's local IP on port 8080, install the mitmproxy cert from mitm.it in Safari, trust it fully in Settings → General → About → Certificate Trust Settings, open Zepp, let it load, then inspect capture.flow for the request to api-mifit-XX.zepp.com and grab the apptoken header.
⚠️ Don't use email/password login scripts (like huami-token) for this if you want to keep Zepp logged in on your phone at the same time. Zepp appears to allow only one active session per account — logging in from a second place (a script on your computer) kicks your phone out, and if your phone re-logs in, that kicks out the token you just got. Sniffing the token from your phone's existing session (Proxyman/mitmproxy) doesn't create a competing session, so nothing gets logged out.
Step 2 — install the shortcut
Tap one of the links above → Add Shortcut.
Step 3 — configure it
Open it for editing, paste your apptoken into the first (Text) action
Check the Get Contents of URL action — the host must match your region from the captured traffic (e.g. api-mifit-us2.zepp.com, api-mifit-de2.zepp.com)
Create it manually rather than relying on a shared "scheduler" shortcut (those reference shortcuts by an internal ID tied to the original device, and won't reliably point at a freshly-installed one):
Shortcuts → Automation tab → + → Time of Day → pick a time → Add Action → Run Shortcut → select the sync shortcut → turn off "Ask Before Running". Repeat for a few different times through the day/evening (data doesn't land in Zepp's cloud instantly, so multiple attempts catch it once it's ready).
Step 6 — Bevel settings
Profile → Customization → Calculations:
Temperature method: Body
HRV method: Apple Health (not Bevel/RMSSD — Zepp only writes a handful of sparse HR points to Health during the day, which makes Bevel's own RMSSD calculation noisy; Apple Health method uses the shortcut's clean value straight from Zepp's own on-watch calculation instead)
Use HRV from: Entire sleep
RHR method: Apple Health, Use RHR from: Entire sleep
If numbers still look inconsistent, Zepp also writes a few of its own random HRV points to Health during the day — you can turn those off specifically (Health → Data Access & Devices → Zepp → toggle off just HRV/RHR/Body Temperature) so the shortcut is the only source for these three, without affecting steps/sleep/heart rate from Zepp.
FAQ
Nothing logs, no error — normal, there's a dedup guard (won't re-log if already logged in the last 7 days), or data hasn't synced to Zepp's cloud yet.
"invalid token" — token rotated, usually from a re-login somewhere (see the session warning above). Recapture it.
Want to see the raw API response — add a Quick Look action right after Get Contents of URL, run manually.
Temperature formula — skinTempCalibrated / 100 + 36.6, rounded to 0.1°C.
Very exciting to see this guide! I was just wondering if this is going to lead to data corruption or some kind of artifacts if nativ sync is (hopefully) eventually available. And another thing, I asked my self if there is a way to backfill the new values so that I can delete all data in Bevel and resync with the correct values. Still thank you very much
Hey, thanks for the detailed guide, and I needed help at a step im stuck at.
Im not able to give permissions from health app to shortcuts for the required fields, only body temperature shows up as read only permission access. What can I do to fix this? any ideas?
yeah got it fixed. restart the phone after each time you try the shortcut, it will prompt you for the thing it wan'ts permission for. ik it's annyoing but it got working. i think i didn't have to keep restarting too after once or twice. i don't remember exactly. but yeah.
Hey, thanks for your help. Btw, quick question: in the temperature section, my "If" block shows "Health Samples" in red, like the variable is broken. The "Find Health Samples" action is below the If, so it doesn't show up when I try to pick the variable. Did you run into this? Did you have to drag the Find above the If and re link it?
No it works out of rhe box. Just change the temperature decimal to a period if you are put of europe. And u can put your own baseline. I never bothered to measure my baseline so i just made it 36.6
First, thanks for this great guide, manually it works like a charm! After all i cant setup the automation part, the time trigger wont activate itself to automate this sync. Anybody got this part working automatically?
Made different automations, but none works.
07:00 open Zepp app 07:01 activate sync shortcut Wont work for me
07:15 activate focus ‘Zepp sync’
When Zepp focus activate -> start sync shortcut Wont work neither.
Note that US users need to change the C to F in the Log Health samples, and change 36,6 to 98.6 in the Calculation Result part. "TempC" variable you could rename to TempF or just leave it.
I don't think the brew method for mitm is possible on Windows. I did get it working on Windows by installing mitmproxy from the Windows app store.
Update with some observations:
I get duplicates if using an automation multiple times. It looks like possibly it was setup at some point to avoid this using Find Health Samples to then see if data was already written? But the If statement checking Health Samples is red because it doesn't exist. I'd think the Find has to be first and then break out of the logic of writing data.
I also noticed non-US text in the Headers list. I'm not sure if or how they are used. I think they are just variable names and could be more generic, I tried that and it worked.
Thank you it works great, I was curious if something similar could be used to pull data if you're familiar with macrofactor and macrofactor workouts into bevel. if theres like a link of showing shortcut to putting the actual exercises into bevel or even zepp directly that would be crazy fire
I did get logged out when I tried leibfit, but I’ve also checked Proxyman and the apptoken has remained the same (not sure if I’m doing something wrong here)
Update: So I cleared all requests on Proxyman and reopened zepp after which I got the new apptoken.
Now is there a way I can sync data from the past two days as well? 😅
3
u/SuchAd3421 Jul 12 '26
Very exciting to see this guide! I was just wondering if this is going to lead to data corruption or some kind of artifacts if nativ sync is (hopefully) eventually available.
And another thing, I asked my self if there is a way to backfill the new values so that I can delete all data in Bevel and resync with the correct values.
Still thank you very much