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
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-Timestampexposes the emit-time of each event for ordering downstreamDaily Stress score (
SS_DAILY_STRESS) re-enabled with a simpler training formulaApple 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_RUNNINGandGRAVEL_CYCLINGactivity types were not mapped correctlyFixed a bug where Garmin planned-workout API errors surfaced as
500s instead of424s with normalised messagesFixed 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
SpO2sentinel 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
0when MFP returnedvalue=null(now correctlynil)Fixed a bug where MacrosFirst food-level meals used the wrong parent meal name for the
MealTypemappingFixed a bug where the Apple and Fitbit responses drifted from our schema for several daily fields
Fixed a bug where
GET /v2/dailyreturned future-dated daily recordsFixed a bug where workout / planned-workout IDs in
v2were returned as numbers (now JSON strings for precision)Fixed a bug where provider
429rate-limits were surfaced as424sFixed several score formula transcription bugs — Activity Efficiency,
SS_DAILY_STRESS_V2,SS_RESPIRATORY_V2, and Daily StrainFixed a bug where
SS_RESILIENCEandSS_READINESScapped 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 — 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
Stringto avoid JavaScript number-precision lossHealthStore now averages across all daily buckets, and
predicateOptionswas renamed tooptionsSleep wrist-temperature query predicate relaxed so more devices report a value
Server-driven initial backfill on
initConnectionfor Apple Health
Frontend 📺
Landing Page (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)
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.jsongenerator so customers can sync the reference setLab-reports model default upgraded to
claude-opus-4-7for higher-quality extraction
Last updated
Was this helpful?