# May Update 2026

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

### Backend 💾

#### Features

* New integration: **Mira** is out, with full hormone data support 🩸
* 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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.tryterra.co/changelog/2026/may-update-2026.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
