How to send Apple Health data to Zapier
What do you get?
Syncky Health sends selected Apple Health data to a Zapier direct webhook, then your Zap forwards it to chosen destinations. Free during launch; plans are coming later. See Syncky launch access and pricing; Zapier's plan is separate.
This route does not require MCP or Syncky Relay, and no agent pairing is needed. Nothing passes through Syncky's servers on this route. Zapier receives plaintext inside the connection; review its storage, history and downstream sharing before sending. iOS schedules background work and Health reads require an unlocked iPhone, so deliveries can be hours late.
What do you need before setup?
Use Syncky Health and a Zapier plan with Webhooks by Zapier. Zapier's trigger documentation marks Free ineligible; its pricing page includes webhooks with Professional. Budget for a paid plan; Syncky's launch access does not cover Zapier.
Choose Health Auto Export JSON for metric-oriented automation or Syncky native JSON for sample UUIDs, deletions and device identity. Both are JSON objects containing arrays. This guide supplies a receiving workflow, with no Health write-back.
How do you set up Zapier?
- In the Zap editor, select Webhooks by Zapier as the trigger and Catch Hook for parsed JSON, or Catch Raw Hook if you will implement header/signature checks before downstream actions. Follow the official setup.
- For Catch Hook, leave Pick Off A Child Key blank to retain the envelope, including the native test flag. Copy the HTTPS webhook URL privately from the Test tab. The URL is the only secret in this basic setup: anyone who obtains it can trigger the Zap. Never include it in screenshots, public code or logs.
- In Syncky Health, open Settings › Connections › + › Server or automation. Enter that URL, choose Health Auto Export JSON or Syncky native JSON, and authentication None for the URL-secret route. Select types and grant their Health read permissions. Keep Accept writes to Health off.
- Before adding destination actions, arrange for empty arrays and native
delivery.test: trueto produce no sample actions. For Catch Raw Hook, check credentials/signatures first, then parse the body; no verifier is supplied here. Tap Check connection, then use Zapier's Test trigger to inspect only that no-data request. - Finish and enable the Zap. After the check succeeds and your guards are in place, deliberately use Sync now. Iterate the selected samples into your destination and replace repeated records rather than adding their values again.
Not verified by Syncky: a live Zap, empty-array mapping and any custom Code verifier. The UI and trigger behavior above follow official documentation fetched on 7 November 2026; run the no-data check in your account before sending selected data.
What can Zapier read and write?
The table separates Catch Hook from Catch Raw Hook. A later Code by Zapier step needs deliberate input mapping.
| Authentication | Catch Hook / Catch Raw Hook |
|---|---|
| URL secret | Supported on both; possession permits submission. |
| Bearer | No on Catch Hook; workaround on Catch Raw Hook: custom Code check before actions. |
| Header | No on Catch Hook; workaround on Catch Raw Hook: custom Code check before actions. |
| Basic | No on Catch Hook; workaround on Catch Raw Hook: custom Code check of Authorization before actions. |
| HMAC | No on Catch Hook; workaround on Catch Raw Hook: custom raw-body verifier before actions. |
The official introduction treats the hook URL as a password. Catch Hook has no documented built-in header authentication; Catch Raw Hook exposes headers and the unparsed body for custom checks. For HMAC, use the whole whsec_ secret as the UTF-8 key, HMAC-SHA256 over timestamp + . + exact raw body bytes, constant-time signature comparison and a 300-second window from authentication and signatures. Replay protection requires a persistent store or an upstream receiver: retain signature values for that window and reject repeats. Never reserialize parsed JSON to verify. Not verified by Syncky: byte-for-byte preservation in Catch Raw Hook. Use a receiver you control before Zapier if authentication must determine the HTTP status: Zapier's acknowledgment is not controlled by a later Code step.
Zapier documents one Zap run per object in a top-level JSON array. Syncky's payload is an object: do not assume this automatically splits native samples or HAE data.metrics[].data. Explicitly iterate samples, or metrics and then their data points; handle workouts separately. Nested-array mapping is Not verified by Syncky. Native records use (device, uuid), adding part for split series. HAE omits sample UUIDs and deletions. This route has no Health write-back; its acknowledgment supplies no commands.
How do you test the connection?
Check connection sends no health data: HAE sends {"data":{"metrics":[],"workouts":[]}}; native sends empty arrays with delivery.test: true. Expect 2xx and no destination records. Zapier normally returns 200; Catch Raw Hook's documented silent option can give an empty body. The app ignores the test reply body, so an empty successful acknowledgment is sufficient but not required.
A successful check proves HTTP receipt, not Zap completion or current Health data. Zapier documents that a disabled Zap can temporarily still return 200. Inspect status and counts without copying full URLs, credentials, signatures or bodies; use synthetic fixtures for field mapping.
How do you troubleshoot this setup?
- The trigger needs an upgrade: webhooks are excluded from Zapier Free. Check the current plan before building later steps.
- The check makes a blank destination row: branch on the test flag and empty arrays before actions; the check contains no samples.
- Only one item appears: Syncky does not send a top-level array. Explicitly iterate the nested arrays and preserve the envelope for test handling.
- A large delivery fails: Zapier documents 10 MB for triggers and 2 MB for Catch Raw Hook, above Syncky's initial 1,000,000-byte request limit. On
413, Syncky halves its body limit down to 65,536 bytes; investigate the actual rejecting service. - Receipt succeeds but data is missing: check the Zap is enabled, downstream failures, selected Health types, permissions and an unlocked iPhone. A 200 response does not prove processing finished.
What are the frequently asked questions?
Does Zapier split every nested sample automatically?
No. Iterate native samples or each HAE metric's data array before destination actions.
Can I send these samples to a spreadsheet?
Yes, through a deliberately configured downstream action. Follow the Google Sheets guide for one row per sample and deduplication; never append the connection test as a row.
Agent setup · MCP comparison · All guides · Privacy · Public security policy · FAQ · Support.