⌚ Live HR · Apple Watch

Stream your Apple Watch heart rate into PulseVault.

iPhones can't read a heart-rate sensor through the browser — so PulseVault uses a small bridge instead. Your Apple Watch feeds Apple Health, an iPhone Shortcut reads it, and sends it to PulseVault every minute. Here's the whole setup, start to finish.

⌚→📱→📊
How it works in one line

Your Watch already sends heart rate to Apple Health. A Shortcut grabs the latest value and posts it to your PulseVault stream code. PulseVault shows it live and lets you save the workout as a session.

Before you start, you'll need: an Apple Watch paired to your iPhone, the free Shortcuts app (built into iOS), and a PulseVault account open in Safari on the same iPhone. Takes about 3 minutes.
1

Get your stream code from PulseVault

On your iPhone, open PulseVault and go to Devices → Live HR. Scroll to the 📲 Phone & Watch bridge card and tap ▶ Start live bridge.

You'll get a short 6-character code — something like 2NZXD5. Keep this screen open; it's now waiting for readings and will draw them live as they arrive.

2

Open Shortcuts and create a new shortcut

Open the Shortcuts app on your iPhone. Tap the + in the top-right to create a new shortcut, then tap Add Action.

3

Add the “Get Latest Heart Rate” action

Search for Health and choose Find Health Samples (or “Get Latest Heart Rate Sample” if your iOS shows it). Configure it to read:

  • Sample type: Heart Rate
  • Sort by End Date, order Latest first, limit 1

Make sure your Apple Watch is on your wrist so Health has a fresh reading to hand over.

4

Build the JSON with a Text action (the easy way)

The inline JSON editor makes it hard to drop a variable into a Number field. So instead, build the body in a Text action first — Text fields let you insert variables with no fuss.

  • Search for Text (Szöveg) and add it above where the URL action will go.
  • In the text box, type this exactly, but insert the Heart Rate variable from Step 3 where [Heart Rate] is (and use your code instead of 2NZXD5):
{"code":"2NZXD5","bpm":[Heart Rate]}

To insert the variable: type up to "bpm":, then tap the variable bar just above the keyboard and pick Heart Rate, then type the closing }.

If the value shows units (e.g. “142 BPM”) the server will reject it — it needs a plain number. Fix: add a Get Numbers from Input (Számok lekérése) action between Step 3 and this Text action, feed it the heart-rate sample, and insert that Numbers result into the text instead of Heart Rate. Then the body reads {"code":"...","bpm":142}.
5

Add the “Get Contents of URL” action

Search for Get Contents of URL and add it after the Text action. Tap to expand its options and set:

  • URL: https://pulsevault.net/api/livehr/push
  • Method: POST
  • Headers: add one — Content-Type = application/json
  • Request Body: choose File (Fájl), then select the Text variable from Step 4 as the body.
Why the Text method? Shortcuts only shows the variable picker on an empty, focused field, and on a Number field it's hidden in that grey bar above the keyboard — easy to miss. Building the JSON as Text and sending it as the body sidesteps the whole problem. The server still receives a real number and parses it fine.
6

Name it and test once

Name the shortcut something like “PulseVault HR” and save. Tap it once to run it. The first time, iOS will ask permission to read Health data and to send to pulsevault.net — allow both.

Flip back to the PulseVault Live HR screen: within a couple of seconds your heart rate should appear and the live trace should start drawing. 🎉

7

Make it repeat automatically

To keep readings flowing without tapping each time, set up a repeating automation:

  • In Shortcuts, go to the Automation tab → +Create Personal Automation.
  • Choose a time-based trigger and set it to repeat every minute while you train.
  • For the action, choose Run Shortcut → your “PulseVault HR” shortcut.
  • Turn off “Ask Before Running” so it fires silently.
iOS limits how often a background automation runs — in practice that's about once a minute. So the bridge gives you a steady minute-by-minute trace, not beat-by-beat. For continuous second-by-second HR, a Bluetooth chest strap on a laptop or Android phone is smoother.
8

Save your session

When you're done, go back to PulseVault and tap ✕ Stop on the bridge card. You'll see a summary (readings, average, max) and a 💾 Save as session button. Saving turns your live readings into a normal PulseVault session — ready for AI reports, trends, and comparisons.

Good to know

Why can't PulseVault just connect to my Apple Watch directly?

Two reasons, both Apple's design: iPhone browsers don't support Web Bluetooth at all, and the Apple Watch keeps its heart-rate sensor inside Apple Health rather than broadcasting it like a chest strap. The Shortcut bridge is the supported way to get that data out to a web app.

Is my heart-rate data stored on your server?

No. Live readings are held only in memory while the bridge is running and are never written to disk server-side. Nothing is saved until you tap “Save as session” — and that session lives in your own encrypted account, like all your other data.

How long does a stream code last?

Three hours, then it expires automatically. Just start a new bridge to get a fresh code for your next session.

Can I use this without an Apple Watch?

Yes. Any phone heart-rate app or a second device that can POST {"code", "bpm"} to the same URL works. And if you have a Bluetooth chest strap (Polar H9/H10, Garmin, Wahoo), you can connect it directly in the browser on a laptop or Android phone for a continuous live trace — no Shortcut needed.

The reading isn't updating — what should I check?

Make sure the Watch is on your wrist and Health has a recent reading, that the code in your Shortcut exactly matches the one on screen, and that you allowed the Health and network permissions when prompted. A reading older than 15 seconds is treated as stale, so the live number clears until the next push arrives.

Shortcuts won't let me insert the Heart Rate variable into the bpm field

This is the most common snag. The variable picker only shows when a field is empty and focused, and on a Number field it hides in the grey bar just above the keyboard — easy to miss. The reliable fix is Step 4: build the body in a Text action (where variables insert normally) and send that Text as the request body (set Request Body to File). That avoids the inline Number field entirely.

Get PulseVault access

Already have an account? Open Devices → Live HR in the app to start a bridge.