> For the complete documentation index, see [llms.txt](https://docs.tryterra.co/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tryterra.co/changelog/2026/may-update-2026.md).

# May Update 2026

Check out what we've been doing at Terra over the month of May 2026!

### Backend 💾

#### Features

* New integration: **Trailforks** is out&#x20;
* New integration: **Rouvy** webhooks are out
* New integration: **Omron** webhooks are out
* **Fitbit v2 API** integration is live
* **Bring-your-own-app OAuth** pathway available for Strava, Oura, and WHOOP — connect your own OAuth app to Terra
* New **AI Health Context** endpoint — query an LLM-grounded summary of a user's recent health data through the API
* New **Hormone** scope available
* **Raw FIT files** are now captured and stored from provider integrations
* TrainingPeaks **strength workouts** are now included in the planned-workout response
* Planned workouts on **Apple** are now supported
* MacrosFirst now surfaces **weight** data
* New webhook header `X-Terra-Ordering-Timestamp` exposes the emit-time of each event for ordering downstream
* Daily Stress score (`SS_DAILY_STRESS`) re-enabled with a simpler training formula
* Apple Health activity & lap average heart rate is now time-weighted for accuracy

#### Bug fixes

* Fixed a bug where Garmin swim summary aggregates were not mapped to lap and activity fields
* Fixed a bug where Garmin `TRAIL_RUNNING` and `GRAVEL_CYCLING` activity types were not mapped correctly
* Fixed a bug where Garmin planned-workout API errors surfaced as `500`s instead of `424`s with normalised messages
* Fixed a bug where Garmin daily step / distance / active-calorie totals were not derived from epoch samples
* Fixed a bug where Garmin absolute speed bounds were not derived from threshold/percentage targets for SPEED/PACE workouts
* Fixed a bug where Fitbit re-delivery could overwrite a better GPS track
* Fixed a bug where Fitbit daily steps and distance were not derived from intraday samples
* Fixed a bug where Fitbit calories / activity-level samples used the wrong anchor time
* Fixed a bug where Fitbit v2 was emitting passively-measured `SpO2` sentinel values (`percentage=50`)
* Fixed a bug where Apple HealthKit body-fat values were sent as a fraction rather than a percent
* Fixed a bug where Apple SDNN samples were not being set
* Fixed a bug where Apple steps did not fall back to summing intraday samples
* Fixed a bug where Apple all-zero daily records were not dropped for completed past days
* Fixed a bug where Oura activity type mappings were incorrect
* Fixed a bug where Zepp elevation summary fields and summary polyline were missing
* Fixed a bug where Zepp GPS coordinates were scaled incorrectly
* Fixed a bug where Zepp workout step count was not surfaced from the sports endpoint
* Fixed a bug where Wahoo elevation summary fields were missing from FIT sessions
* Fixed a bug where Huawei out-of-range pace targets caused hard errors instead of structured warnings, with pace values now clamped to the allowed range
* Fixed a bug where COROS planned workouts required leaf intensity on repeat steps (now defaults to active)
* Fixed a bug where Clue's current cycle was not fetched correctly
* Fixed a bug where MyFitnessPal per-meal calories were `0` when MFP returned `value=null` (now correctly `nil`)
* Fixed a bug where MacrosFirst food-level meals used the wrong parent meal name for the `MealType` mapping
* Fixed a bug where the Apple and Fitbit responses drifted from our schema for several daily fields
* Fixed a bug where `GET /v2/daily` returned future-dated daily records
* Fixed a bug where workout / planned-workout IDs in `v2` were returned as numbers (now JSON strings for precision)
* Fixed a bug where provider `429` rate-limits were surfaced as `424`s
* Fixed several **score formula** transcription bugs — Activity Efficiency, `SS_DAILY_STRESS_V2`, `SS_RESPIRATORY_V2`, and Daily Strain
* Fixed a bug where `SS_RESILIENCE` and `SS_READINESS` capped at 80 instead of running to 100

#### Changes

* Webhook delivery now spools to disk and parallelises per-entry uploads for S3 destinations
* Non-webhook destinations (GCS, SQL, Firestore, Supabase, Azure Blob, MongoDB) migrated to a streaming pipeline for lower memory and latency
* Webhook dispatcher hardened with a per-destination safety-valve circuit breaker

***

### SDK 📱

#### [TerraiOS](ref:reference-ios-sdk) — `1.7.3`

* Handle request failures correctly so an individual sample-type failure no longer breaks a whole sync
* Background delivery now bounds observer-fire fan-out and adds a per-push cap (1.7.2)
* Snowflake IDs are now decoded as `String` to avoid JavaScript number-precision loss
* HealthStore now averages across all daily buckets, and `predicateOptions` was renamed to `options`
* Sleep wrist-temperature query predicate relaxed so more devices report a value
* Server-driven initial backfill on `initConnection` for Apple Health

***

### Frontend 📺

#### Landing Page ([tryterra.co](https://tryterra.co))

* New self-serve **DPA** page and ToS reference for enterprise customers (<https://tryterra.co/dpa>)
* Research articles now ship with a dedicated **Methodology** section and an **auto-generated FAQ** powered by Claude
* Podcast page redesigned around per-episode article-style layouts, powered by the official **Spotify Web API**
* New **planned workout pricing** on the pricing page
* "**Become an Integration**" CTA added across homepage and footer
* Toast notification banner connected to our Instatus status page so customers see incidents in real time
* DPA + ToS last-updated date refreshed to May 1st, 2026

#### Dashboard ([dashboard.tryterra.co](https://dashboard.tryterra.co))

* **Scores V6** redesigned page is live — new modules for Daily Strain, the Activity quad (Strain / RCRS / TRIMP / Efficiency), Immunity, Resilience, Readiness, Sleep V2, Respiratory V2, and Daily Stress V2
* New **Score Sandbox** with a Sleep score playground — tweak inputs and see how scores change live
* **Provider health** page is out — see provider status / outages at a glance
* New **Hormone** scope available in the scopes UI
* **Synthetic data fetch** — pull realistic synthetic samples without needing a real connection
* Click-wrap updated to include **DPA + SCC** acceptance, with version-based terms tracking
* Immunity now renders on its native 0–5 scale, and unbounded scores (RCRS, TRIMP) render as scale-aware histograms

***

### Blood Biomarkers 🩸

* Backfilled **1,506 LOINC codes** for the biomarker reference set
* New public `biomarkers.json` generator so customers can sync the reference set
* Lab-reports model default upgraded to `claude-opus-4-7` for higher-quality extraction
