Health Connect REST API.
Your data, on your server.
Sync steps, sleep, heart rate and workouts from your React Native, Expo or Android app. Keep building your product. Let HC Sync handle change tokens, backfill and delivery.
Free for 5 synced users. Then $29/month for 100.
No card. No per-call billing. No automatic overages.
Android only. Your users install your app and grant Health Connect permissions. Expo needs a development build, not Expo Go.
import { connectHealth, syncHealthOnce } from "hcsync-react-native";
const types = ["Steps", "SleepSession"] as const;
// From a button the user tapped:
await connectHealth(types);
// Token from your server; secret key stays there.
const userToken = await fetchHcSyncTokenFromYourServer();
syncHealthOnce(userToken, types);
curl "https://hcsync.dev/v1/summary?user_id=maya&days=7" \ -H "authorization: Bearer $READ_KEY"
Real endpoint. Replace maya with sample_user after loading sample data. See the JSON response. Run on start and foreground; reset on sign-out. Full lifecycle in the guide.
Actual local sample-data response · one day excerpt
{ "day": "2026-11-02", "steps": 8000,
"sleep_min": 483.3, "avg_bpm": 73 }How it works
The library reads Health Connect on the device, sends only what changed since the last sync, and retries when offline. You never touch WorkManager or change tokens.
Mint a user token
On your server, with your secret key. Each token can write one user only.
curl -X POST $HC/v1/user-tokens \ -H "authorization: Bearer $SECRET" \ -d '{"user_id":"maya"}'Add the library
Ask for permissions, then start. It backfills 30 days, then syncs hourly in the background (or whenever your app calls
syncNow()on devices without background access).// settings.gradle.kts: repositories { // maven("https://hcsync.dev/maven") } implementation("dev.hcsync:hcsync:0.3.0") HcSync.configure(ctx, userToken, setOf("steps","sleep","heart_rate")) // after the permission prompt: HcSync.start(ctx)Read it anywhere
Pull with REST, get pushed with a signed webhook, or let an agent ask.
GET /v1/summary?user_id=maya GET /v1/records?type=sleep POST /mcp get_daily_summary
Built for the day something goes wrong
Health data pipelines fail quietly: a watch stops syncing, a permission gets revoked, your endpoint returns 500. HC Sync tells you which.
- Dashboard
- Synced users against your plan, records, last upload, webhook queue, sample data and key rotation in one page.
- Explain a day
- Pick a user and a date and get plain-language findings: which sources wrote what, when the phone last uploaded, and the likely cause of a gap (
GET /v1/explain). - Signed webhooks with retries
- Signed events with ids for dedupe. Queued events retry in order every 5 minutes, on sync or replay, for up to 7 days. The queue holds 500 events per project; new events are discarded when full. Record writes and event queuing are separate, so a failure between them can lose an event. REST exposes current records, but cannot recover missed deletion events.
- Drop-in Connect screen
- One
connectContract()call: install check, data explanation, permissions and a first sync with progress, in your colours. - Sync state on the phone
- The Android SDK exposes a
StateFlow: synced, permission denied (with the missing permissions), Health Connect missing (with an install intent), plan limit, offline. - React Native and Expo
- One TypeScript file on top of react-native-health-connect. No native code.
- Status
- Live API and database check.
Health Connect has no REST API.
That’s the gap we fill.
Health Connect stores data on Android devices. Your server cannot read it directly. HC Sync bridges the phone and your backend, with REST reads, signed webhooks and MCP.
Support for the legacy Fitbit Web API ended on 30 September 2026, and Google is turning it off. If you’re migrating a coaching, fitness or habit app, you still need an Android app and your users’ permission. This is a new data path, not a drop-in Fitbit cloud replacement.
Plan your Fitbit migration · Looking for a Terra alternative?
Pricing
Priced per synced user (a user whose phone sent data that month), not per API call. Every plan includes REST, webhooks and MCP.
| Plan | Monthly price | Synced users | Stored records |
|---|---|---|---|
| Free | $0 | 5 | 200,000 |
| Starter | $29 | 100 | No cap |
| Indie | $149 | 1,000 | No cap |
| Studio | $299 | 20,000 | No cap |
Start on Free. Upgrade links appear with your keys, and your project upgrades in place. Limits are hard caps: sync returns HTTP 402 for a user with no uploads this UTC calendar month once the monthly user cap is reached; users already synced that month can continue. Free also rejects an entire batch if its distinct record IDs would exceed 200,000 stored records (updates to existing IDs do not add to the count). Paid plans have no record cap. Reads and deletions remain available; there are no automatic overage charges.
Compare scope and pricing (checked 30 October 2026)
| Checked 30 Oct 2026 | Entry price | Users included | Health Connect |
|---|---|---|---|
| HC Sync | $0, then $29 | 5, then 100 | Yes, Kotlin + React Native |
| Junction | $300/month | 500 | Yes |
| Sahha | $299/month | 1,000 | Yes |
| ROOK | $399/month, add-ons $99-249 | 750 | Yes |
| Terra | Credits: 200 a month per connected user | Depends on plan | Yes |
They also cover iPhone and cloud wearables; we only do Android Health Connect, which is why we cost less.
Starter includes email support; Studio includes priority support. Manage your project in the dashboard.
A small service.
Clear commitments.
- Who runs it
- Operated by Shahar Frish, Israel. Email the person running it.
- Where data lives
- US Postgres on Supabase. Encrypted in transit. Records are deleted after 13 months. Read the security details.
- Processing terms
- The DPA applies to every customer, including Free. See the subprocessors and Privacy Policy.
- Room to change your mind
- Cancel anytime. Email within 30 days of a payment for a full refund. Cancellation and refunds.
- Your exit path
- Export with the REST API.
DELETE /v1/users/{id}removes a user’s data immediately;DELETE /v1/projectdeletes your project and its records. API reference.
Create a free project
Your secret key is shown once. Keep it on your server and never put it in the app.
Check my app
Tell us what you're building and we'll reply within one business day with what will and won't work, and the fastest way to get your data flowing.
Frequently asked questions
- Which data types?
- Steps, distance, active and total calories, heart rate, resting heart rate, HRV, SpO2, sleep sessions with stages, exercise sessions and weight.
- React Native or Expo?
- Yes. Copy one TypeScript file; no native code.
- Does this work on iPhone?
- Not yet. Health Connect is Android. Apple HealthKit is next if you ask for it.
- How do I delete a user's data?
DELETE /v1/users/{id}removes everything for that user immediately.- Is this a medical device?
- No. It moves data your users already granted you. It does not diagnose or interpret.
- My product is web only. Can I still use this?
- You need an Android app on your users' phones, because Health Connect has no cloud API. A small companion app (sign in, grant permissions, sync) is enough. Ask us through the form above.
- Where is my data stored?
- Postgres in the US (Supabase), encrypted in transit, deleted after 13 months or when you call the delete endpoints. Secret keys are stored only as hashes. See Security and Privacy.
- Do I need Google Play approval?
- Your app declares its Health Connect permissions in Play Console as usual. We don't publish an app, so there is nothing of ours to approve.