How to send Apple Health data to InfluxDB and Grafana

What do you get?

Syncky Health sends selected Apple Health samples to an InfluxDB 2 direct webhook endpoint as line protocol. Grafana reads that database through an InfluxDB datasource; the iPhone does not send Health data to a Grafana endpoint. Free during launch; plans are coming later. See launch access and pricing.

This route does not require MCP or Syncky Relay, and no agent pairing is needed. Nothing passes through Syncky's servers on this route. InfluxDB receives plaintext inside the connection, and Grafana can read the data its credential permits. Protect both services and choose who may view the dashboard. iOS schedules background work and Health reads require an unlocked iPhone, so deliveries can be hours late.

What do you need before setup?

Use a running InfluxDB 2 instance reachable from your iPhone and from Grafana, plus the Grafana Administrator role to add a datasource. This guide targets the repository's InfluxDB 2 recipe, not InfluxDB 1, 3 or Cloud compatibility. Choose the types to send and create separate bucket credentials: a write-only token for the app, and a read-only token for Grafana. Enter them privately; never put tokens in URLs, screenshots or logs.

The template uses Bearer authentication, while InfluxDB documents Token authentication. Resolve that mismatch for your deployment before relying on delivery; the details below preserve that limitation.

How do you set up InfluxDB and Grafana?

  1. In InfluxDB 2, create bucket health in organization home, or use your own names consistently. Create a token with write-only access to that bucket for the phone, and a separate token with read-only access to it for Grafana.
  2. In Syncky Health, open Settings › Connections › + › InfluxDB. The repository template is http://influxdb.local:8086/api/v2/write?org=home&bucket=health&precision=ns, format InfluxDB line protocol, authentication Bearer. Replace the host/org/bucket as needed, retain precision=ns, enter the write token privately and select types with their Health read permissions. Prefer HTTPS; keep plain HTTP restricted to your trusted network.
  3. Check authentication before sending selected data. InfluxDB documents Authorization: Token <token>, but the app sends Authorization: Bearer <token> and cannot set Authorization as a custom header. Direct Bearer acceptance is not verified by Syncky. If your endpoint returns 401, use a proxy that rewrites the header to Token, and protect both sides of that connection. This guide supplies no proxy implementation. InfluxDB does not check X-Syncky-Signature; signing alone does not authenticate this endpoint.
  4. Tap Check connection, which sends an empty body with no health data. InfluxDB's response to that empty body is not verified by Syncky, so an empty successful acknowledgment is not promised. Inspect status/authentication without logging bodies or credentials. After resolving endpoint/authentication issues, deliberately use Sync now for your selected data and confirm receipt in your database.
  5. In Grafana, follow Configure InfluxDB: Connections → Add new connection, select InfluxDB, then Add new data source. Set the InfluxDB instance's base URL, choose your InfluxDB 2 product and Flux query language. Set Organization to home, Default Bucket to health, and Token to the separate read-only token. Click Save & test. Grafana needs the base instance URL, not the phone's write path and query string.
  6. Follow Create dashboards: Dashboards → New → New dashboard, Add new element → panel, then Configure visualization. In Queries, select your InfluxDB datasource. Flux uses a raw text editor, not a visual query builder: use Grafana's official Flux example as a starting point, adapting its measurement/field filters to the selected quantity, such as measurement steps and field value. Keep its default-bucket and dashboard time-range macros. Click Refresh, choose a suitable visualization, enter the panel and dashboard titles and Save. Select a time range containing the samples' start times; this guide supplies no custom query or dashboard package.

These Grafana UI and Flux instructions follow official documentation fetched on 2026-11-03. The datasource's bucket setting alone does not enforce access isolation; the token's InfluxDB permissions must do that. Grafana Save & test checks the reader's datasource connection, separately from the phone's empty-body test. Neither proves a live Syncky delivery.

What can InfluxDB and Grafana read and write?

The line-protocol contract uses the type name as measurement, nonempty unit/source/device tags, and the sample start time in nanoseconds. Quantities have field value; categories have numeric value and string value_name; workouts have activity and duration, with energy and distance when known. A steps point is an individual sample, not a daily total.

Deletions, characteristics and the other kinds are not sent in line protocol. A Health deletion therefore does not remove a stored InfluxDB point through this recipe. Missing data is not a measured zero, and this dashboard does not establish completeness or freshness.

This recipe has no Health write-back. Grafana's read-only bucket token is distinct from the phone's write-only token; it grants no Health permission. For write-back with source and undo on supported, permitted types, choose a separately implemented native server workflow or n8n, not this line-protocol route. Review authentication and signatures before exposing a receiver.

How do you test the connection?

Check connection sends an empty body with no health data. Empty-body acceptance by InfluxDB is unverified; inspect the actual status rather than treating a failed empty check as proof that a valid line-protocol write cannot work. Resolve authentication and routing first, then intentionally use Sync now and check receipt without printing sample values.

In Grafana, use Save & test with the read-only token, then Refresh your panel for a time range covering received samples. A working datasource can still show no matching measurements. The phone's delivery, database receipt and Grafana read are separate checks; no test writes back to Health.

How do you troubleshoot this setup?

What are the frequently asked questions?

Does Syncky send data straight to Grafana?

No. The phone writes to InfluxDB 2; Grafana queries InfluxDB using a separate datasource credential. The Grafana datasource documentation describes that reader connection.

Can I choose SQL or use a visual Flux builder?

This recipe uses InfluxDB 2 with Flux. Grafana documents Flux as a raw text editor. SQL targets newer InfluxDB products, while InfluxQL on 2.x needs additional DBRP mapping; neither is configured here.

Will Health deletions and writes appear in this integration?

Line protocol omits deletions and has no Health command replies. This recipe cannot undo stored database points when a Health sample is removed and cannot write an entry into Health.

Agent setup · MCP comparison · All guides · Privacy · Public security policy · FAQ · Support.