Installation
- Bundle
- CDN
Methods
Link a health source
Links a source and kicks off an initial sync to your Terra destination. For Apple Health,session is a server-minted Terra auth token. For OAuth providers, it is a Terra Connect widget URL. The call is idempotent: if the user is already connected under the same user_id, the permission sheet is skipped and the runtime resyncs instead.
After a successful connect the
user_id is persisted and the runtime resyncs on every launch. Calling with a different user_id re-binds the SDK. Emits connected, then sync_started, then synced. despia.terraConnected and despia.terraProvider update in place.
Force a destination resync
Triggers an immediate resync to your destination for the currently linked user, without re-prompting. Use it for pull-to-refresh, a refresh after returning from the OAuth widget, or a manual retry. No-op if no user is connected, in which case it emits anerror.
Emits
sync_started then synced, and mirrors live progress to despia.terraSync. A second call while despia.terraSync.inProgress is true is deduplicated against the in-flight sync.
Request HealthKit permission
Pops the HealthKit permission sheet at a moment you choose, without committing to asession or a full connect. Useful for priming permissions during onboarding.
iOS only shows the sheet once per data type per install. If the user previously denied access, this returns
granted: true silently and you must send them to terra://settings to re-grant. Emits a permissions event carrying granted and message.
Read health data inline
Reads current HealthKit state and delivers it towindow.onTerraEvent. This is an inline read for your UI, it does not push to your destination. Requires a prior successful connect.
The
data event carries results (keyed by resource), succeeded, and failed ({ resource, message } per failure). Use failed for partial-state UI rather than blocking on one resource error.
Disconnect
Clears the runtime’s local connection state: the persisteduser_id, the connected flag, any ignored_sources, and the manager. It does not deauthenticate on Terra’s side, your backend handles that via the REST API.
disconnected. despia.terraConnected becomes false, despia.terraUserId and despia.terraProvider clear, and despia.terraSync resets to defaults. iOS has no programmatic Apple Health revoke, the user does that in Settings.
Open permission settings
Opens iOS Settings on the app’s HealthKit permission page so a user who denied access can re-grant it. Use it as the action behind a permission-denied prompt. iOS only.Full client-side setup
Reading current state
The native runtime injects five globals on thedespia object before any web code runs, and keeps them live by updating them in place on every state change. No reload is needed to read fresh values.
terraConnected, terraUserId, and terraProvider track the Apple Health connection only. While despia.terraSync.status is syncing, compute live elapsed time as Date.now() - despia.terraSync.startedAt.
Handling events
window.onTerraEvent is optional but recommended. Assign it before your first terra:// call. The runtime calls it on every state change, each carrying a type you branch on. The ready event fires on every page load, so it is a reliable bootstrap point.
A
connected event from Apple Health and from the OAuth widget carry different fields:
synced, never error:
succeeded and failed shape:
error carries a command (the scheme that failed) and an advisory message. The most common causes are calling terra://sync or terra://data before a successful connect, passing a malformed required parameter, or handing in a session token that Terra rejected.Backend responsibilities
The Terra REST API is called only by your backend. The Terra API key never reaches the device.Mint an Apple Health auth token
For a first-time Apple Health link, your backend calls Terra’s auth endpoint and returns the token to the web app, which passes it toterra://connect as session.
Build an OAuth widget session
For OAuth providers, create a Terra Connect widget session withauth_success_redirect set to your app’s deep link using host terra. Terra appends user_id, reference_id, and resource to that redirect so your backend can record the connection.
Deauthenticate on logout
terra://disconnect clears local device state only. On logout, your backend must call Terra’s deauthentication endpoint for the user to fully revoke the connection.
Receive data at your destination
Configure a destination webhook in the Terra dashboard. Terra pushes health data to it on every sync, including background delivery. Validate the Terra signature header on each request before processing the payload.Not exposed
Resources
NPM Package
despia-native
Terra Dashboard
Configure your application and destination webhook
Terra API Docs
Terra REST API and webhook payload reference