{"version":1,"pages":[{"id":"dN4JJgahzIWBaUvOWh2F","title":"What is Terra API?","pathname":"/","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Getting Started","icon":"hand-wave"}]},{"id":"W5WBMbS9iXQGBIjvGvPt","title":"Account setup and API keys","pathname":"/introduction/account-setup-and-api-keys","siteSpaceId":"sitesp_x290K","description":"This guide walks you through creating your Terra account and obtaining the API keys necessary to start integrating with our services.","breadcrumbs":[{"label":"Docs"},{"label":"Getting Started","icon":"hand-wave"}]},{"id":"kDJRUnUHzukp7758wzWZ","title":"Core concepts","pathname":"/introduction/core-concepts","siteSpaceId":"sitesp_x290K","description":"Understand the fundamental terms and concepts used throughout the Terra API ecosystem. Grasping these will help you integrate Terra more effectively.","breadcrumbs":[{"label":"Docs"},{"label":"Getting Started","icon":"hand-wave"}]},{"id":"sXs7CwU3DIamektD2SSg","title":"AI coding agents","pathname":"/introduction/ai-coding-agents","siteSpaceId":"sitesp_x290K","description":"Set up your AI coding agent to build with Terra using agent skills and the docs MCP server, so it works from accurate, up-to-date information instead of outdated training data.","breadcrumbs":[{"label":"Docs"},{"label":"Getting Started","icon":"hand-wave"}]},{"id":"GUjKeD2rpA0Pnb9wKNmH","title":"Examples","pathname":"/introduction/examples","siteSpaceId":"sitesp_x290K","description":"Example apps built on Terra. Clone one with a single command, deploy it to your own infrastructure, and build on top of it.","breadcrumbs":[{"label":"Docs"},{"label":"Getting Started","icon":"hand-wave"}]},{"id":"Lmqe2xKJp2sNwcUjWiG9","title":"Terra Basecamp","pathname":"/introduction/examples/terra-basecamp","siteSpaceId":"sitesp_x290K","description":"A complete Terra integration you can run yourself: wearable connections, webhook ingestion, multi-device deduplication, a live dashboard, and an AI health assistant.","breadcrumbs":[{"label":"Docs"},{"label":"Getting Started","icon":"hand-wave"},{"label":"Examples"}]},{"id":"qbVlof1gkimTh2hlNhHi","title":"Overview","pathname":"/unified-api/getting-started","siteSpaceId":"sitesp_x290K","description":"Discover the capabilities of Terra's Unified API, enabling you to access historical and current user health data from a multitude of health data sources.","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"}]},{"id":"e6qszDGhRFFjgiC4stsR","title":"Quickstart","pathname":"/unified-api/quickstart","siteSpaceId":"sitesp_x290K","description":"Learn how to receive data events in just 3 steps","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"}]},{"id":"jcydmbYnSVgUGOQkhf2M","title":"Integration setup","pathname":"/unified-api/integration-setup","siteSpaceId":"sitesp_x290K","description":"Configure Terra API to receive your users' health & fitness data to your preferred destination (e.g. webhook, DB, etc).","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"}]},{"id":"NQEVLVw5ESZ2nWpCyKHN","title":"Understanding sources and destinations","pathname":"/unified-api/integration-setup/understanding-sources-and-destinations","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Integration setup"}]},{"id":"h8FHZu5lasTujJllh6II","title":"Setting up data sources","pathname":"/unified-api/integration-setup/setting-up-data-sources","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Integration setup"}]},{"id":"GA9mVthdoq7F7pDfs1pU","title":"Setting up data destinations","pathname":"/unified-api/integration-setup/setting-up-data-destinations","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Integration setup"}]},{"id":"O4nXV6K51xZ8HfGfQSB4","title":"Webhooks","pathname":"/unified-api/integration-setup/setting-up-data-destinations/webhooks","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Integration setup"},{"label":"Setting up data destinations"}]},{"id":"OnsnXYVT6WnohDaHZCMy","title":"SQL database (Postgres, MySQL)","pathname":"/unified-api/integration-setup/setting-up-data-destinations/sql-database-postgres-mysql","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Integration setup"},{"label":"Setting up data destinations"}]},{"id":"0brgJCvKOPOQd8wGFHaN","title":"Supabase","pathname":"/unified-api/integration-setup/setting-up-data-destinations/supabase","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Integration setup"},{"label":"Setting up data destinations"}]},{"id":"tOHYUY61Fmchmy8nDEBd","title":"Cloud storage (S3, GCS, Azure Blob)","pathname":"/unified-api/integration-setup/setting-up-data-destinations/cloud-storage-s3-gcp","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Integration setup"},{"label":"Setting up data destinations"}]},{"id":"0nApKsSLSe5On8ygSOru","title":"Queuing services (SQS, Kafka)","pathname":"/unified-api/integration-setup/setting-up-data-destinations/queuing-services-sqs-kafka","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Integration setup"},{"label":"Setting up data destinations"}]},{"id":"G4UOnS4XPEWVjGm6s4ll","title":"MongoDB","pathname":"/unified-api/integration-setup/setting-up-data-destinations/mongodb","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Integration setup"},{"label":"Setting up data destinations"}]},{"id":"HcoyvPT9RyxjKUnnWzCz","title":"Firestore","pathname":"/unified-api/integration-setup/setting-up-data-destinations/firestore","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Integration setup"},{"label":"Setting up data destinations"}]},{"id":"XhXy8cgnJgHsaqZWNeQj","title":"Customising data types","pathname":"/unified-api/integration-setup/customising-data-types","siteSpaceId":"sitesp_x290K","description":"Customise the types of data events you wish to receive from your users (activity, sleep, etc).","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Integration setup"}]},{"id":"kx5tMIUY3sUDtA6ecoJi","title":"Dedicated data source API keys","pathname":"/unified-api/integration-setup/dedicated-data-source-api-keys","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Integration setup"}]},{"id":"Xf5lSIykfTCibtMc6r4H","title":"Understanding Terra environments","pathname":"/unified-api/integration-setup/understanding-terra-environments","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Integration setup"}]},{"id":"RKl7wAjZ66GVW9xVSDCr","title":"User authentication","pathname":"/unified-api/user-authentication","siteSpaceId":"sitesp_x290K","description":"Securely connect your users' health data sources to your application via Terra.","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"}]},{"id":"P13r9NYl7vCPSbsaFOIC","title":"Authentication flow","pathname":"/unified-api/user-authentication/authentication-flow","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"User authentication"}]},{"id":"TdUI5j0dVRBxBQgqOjRa","title":"Implementation (Terra widget)","pathname":"/unified-api/user-authentication/implementation-terra-widget","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"User authentication"}]},{"id":"VAS36MDVrwKWE8GUApVq","title":"Implementation (Custom UI)","pathname":"/unified-api/user-authentication/implementation-custom-ui","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"User authentication"}]},{"id":"MKbm7PDHmaXXTvP8HCUm","title":"Handling authentication events","pathname":"/unified-api/user-authentication/handling-authentication-events","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"User authentication"}]},{"id":"5cft8d2v8d4KeuYG9cWO","title":"Customising authentication redirects","pathname":"/unified-api/user-authentication/customising-authentication-redirects","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"User authentication"}]},{"id":"TZyseR8zNUgsakrGIiDr","title":"Managing user health data","pathname":"/unified-api/managing-user-health-data","siteSpaceId":"sitesp_x290K","description":"Access user health and fitness information from Terra and, where supported, write data back to connected services.","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"}]},{"id":"033OGVxaYX6DEvu9ziBK","title":"Receiving health data updates (events)","pathname":"/unified-api/managing-user-health-data/receiving-data-updates","siteSpaceId":"sitesp_x290K","description":"Learn how to receive data update events to your app as soon as the user's data syncs to the cloud","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Managing user health data"}]},{"id":"FBWemnhzaBKXnzUT9mxf","title":"Requesting historical health data (REST API requests)","pathname":"/unified-api/managing-user-health-data/requesting-historical-data","siteSpaceId":"sitesp_x290K","description":"Learn how to request for historical data to be sent to your destination through the REST API","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Managing user health data"}]},{"id":"1i4wahgsXAhAcWLZVB62","title":"Writing data","pathname":"/unified-api/managing-user-health-data/write-data","siteSpaceId":"sitesp_x290K","description":"Learn how to write data back to providers, and create a bi-directional data stream between your app and the various integrations you connect to","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Managing user health data"}]},{"id":"Rf62W0mepMcfjJBcp75y","title":"Mobile-only sources","pathname":"/unified-api/mobile-only-sources","siteSpaceId":"sitesp_x290K","description":"Learn how to connect mobile-based integrations: Apple Health, Samsung Health, Google Fit","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"}]},{"id":"wd1sbQ8DVmAwEBBp3kwI","title":"iOS (Swift)","pathname":"/unified-api/mobile-only-sources/ios-swift","siteSpaceId":"sitesp_x290K","icon":"apple-whole","description":"The iOS SDK allows you to seamlessly send data from iOS to your backend or to your app directly!","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Mobile-only sources"}]},{"id":"UWmb8FNMddQXf1IBRBVV","title":"Android (Kotlin)","pathname":"/unified-api/mobile-only-sources/android-kotlin","siteSpaceId":"sitesp_x290K","icon":"android","description":"How to use the TerraAndroid SDK to connect mobile-based integrations?","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Mobile-only sources"}]},{"id":"00rWmZtXElU1B61nb1Ks","title":"React Native","pathname":"/unified-api/mobile-only-sources/react-native","siteSpaceId":"sitesp_x290K","icon":"react","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Mobile-only sources"}]},{"id":"rywkiNhyWtGQMiha9gBb","title":"Flutter","pathname":"/unified-api/mobile-only-sources/flutter","siteSpaceId":"sitesp_x290K","icon":"flutter","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"},{"label":"Mobile-only sources"}]},{"id":"npI9RXCfjOORp8VSfTj0","title":"Activity Types Reference","pathname":"/unified-api/activity-types","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"}]},{"id":"0hBDHJCU1WGHZCUuvDWv","title":"Troubleshooting","pathname":"/unified-api/debugging-faq","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"}]},{"id":"cdV0igZLLWYB1Vd8RexS","title":"Pricing","pathname":"/unified-api/pricing","siteSpaceId":"sitesp_x290K","description":"This page outlines pricing for the Unified API on the Quick Start plan.","breadcrumbs":[{"label":"Docs"},{"label":"Unified API","icon":"watch-calculator"}]},{"id":"R6eJgC5QvT1QAkqGx3mN","title":"Overview","pathname":"/models/models","siteSpaceId":"sitesp_x290K","description":"Run Terra's health models over your users' data to turn raw metrics into ready-to-use wellness insights.","breadcrumbs":[{"label":"Docs"},{"label":"Models"}]},{"id":"RHQKaA5cuMyFsmKGWjW6","title":"Health Scores","pathname":"/user-engagement/health-scores","siteSpaceId":"sitesp_x290K","description":"Learn how to embed adaptive health scores in your app","breadcrumbs":[{"label":"Docs"},{"label":"User Engagement","icon":"medal"}]},{"id":"yiw2pwEE03hqah6IhAH2","title":"Overview","pathname":"/planned-workouts-api/overview","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API (pre-release)","icon":"dumbbell"}]},{"id":"4bJvC3RRkI6aUBcupmVv","title":"Introduction","pathname":"/planned-workouts-api/introduction","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API (pre-release)","icon":"dumbbell"}]},{"id":"cJMJ3yFJcOqjgGimGwed","title":"Pricing & Access","pathname":"/planned-workouts-api/pricing","siteSpaceId":"sitesp_x290K","description":"Planned Workouts is a paid add-on to your Terra plan, with usage measured in credits.","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API (pre-release)","icon":"dumbbell"}]},{"id":"NQ9hfFptbGHniBHpnXyk","title":"Core Concepts","pathname":"/planned-workouts-api/core-concepts","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API (pre-release)","icon":"dumbbell"}]},{"id":"iC9lxpDssRJuQsfiJcj9","title":"Sport-Specific Examples","pathname":"/planned-workouts-api/sport-specific-examples","siteSpaceId":"sitesp_x290K","description":"Complete, copy-paste examples for each sport type.","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API (pre-release)","icon":"dumbbell"}]},{"id":"1WBeqVzAtVV8Csi8T1Dw","title":"Athlete Parameters","pathname":"/planned-workouts-api/athlete-parameters","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API (pre-release)","icon":"dumbbell"}]},{"id":"6Dx2UhecSrdZC694nOZT","title":"Provider compatibility","pathname":"/planned-workouts-api/provider-compatibility","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API (pre-release)","icon":"dumbbell"}]},{"id":"sYol1k2mDM5oUhac5ZqA","title":"Coercion Warnings","pathname":"/planned-workouts-api/coercion-warnings","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API (pre-release)","icon":"dumbbell"}]},{"id":"yI6alwFFLcvlZ6T7e0d5","title":"Exercise Reference","pathname":"/planned-workouts-api/exercise-reference","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API (pre-release)","icon":"dumbbell"}]},{"id":"2QQR521h5M2Da7lIFN34","title":"Garmin & Hevy exercise reference","pathname":"/planned-workouts-api/garmin-exercise-reference","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API (pre-release)","icon":"dumbbell"}]},{"id":"ZMFBA4vB0mGf8EyPns0Q","title":"Overview","pathname":"/streaming-api/getting-started","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API","icon":"signal-stream"}]},{"id":"pLfdFqRmJcyPiQyOqCuq","title":"Pricing & Access","pathname":"/streaming-api/pricing","siteSpaceId":"sitesp_x290K","description":"The Streaming API is a paid add-on to your Terra plan, with usage measured in credits.","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API","icon":"signal-stream"}]},{"id":"1e0LLNGbfyPWYiAM5CFT","title":"Wearable -> Your app","pathname":"/streaming-api/connect-wearable-to-sdk","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API","icon":"signal-stream"}]},{"id":"BuOSI8vISkOLTuGlrpTM","title":"iOS (Swift)","pathname":"/streaming-api/connect-wearable-to-sdk/ios-swift","siteSpaceId":"sitesp_x290K","icon":"apple-whole","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API","icon":"signal-stream"},{"label":"Wearable -> Your app"}]},{"id":"ZWsLTBJHMA360yVXgNOl","title":"Android","pathname":"/streaming-api/connect-wearable-to-sdk/android","siteSpaceId":"sitesp_x290K","icon":"android","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API","icon":"signal-stream"},{"label":"Wearable -> Your app"}]},{"id":"vjX7INe8J8EKG2fuJp2l","title":"React Native","pathname":"/streaming-api/connect-wearable-to-sdk/react-native","siteSpaceId":"sitesp_x290K","icon":"react","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API","icon":"signal-stream"},{"label":"Wearable -> Your app"}]},{"id":"q9ZHTFj5xhVUfdHu6OTu","title":"Flutter","pathname":"/streaming-api/connect-wearable-to-sdk/flutter","siteSpaceId":"sitesp_x290K","icon":"flutter","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API","icon":"signal-stream"},{"label":"Wearable -> Your app"}]},{"id":"CHglzYwvvGN2QoFuvnzR","title":"Your app -> Terra","pathname":"/streaming-api/your-app-greater-than-terra","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API","icon":"signal-stream"}]},{"id":"1DJaLmHUitDgSVj8w1m1","title":"iOS (Swift)","pathname":"/streaming-api/your-app-greater-than-terra/ios-swift","siteSpaceId":"sitesp_x290K","icon":"apple-whole","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API","icon":"signal-stream"},{"label":"Your app -> Terra"}]},{"id":"yG8hJeDj25optKTNfXM6","title":"Android","pathname":"/streaming-api/your-app-greater-than-terra/android","siteSpaceId":"sitesp_x290K","icon":"android","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API","icon":"signal-stream"},{"label":"Your app -> Terra"}]},{"id":"VuggPlOSKMveLxkYFYxj","title":"React Native","pathname":"/streaming-api/your-app-greater-than-terra/react-native","siteSpaceId":"sitesp_x290K","icon":"react","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API","icon":"signal-stream"},{"label":"Your app -> Terra"}]},{"id":"SPngcdtqnNJoeZf5K2MT","title":"Flutter","pathname":"/streaming-api/your-app-greater-than-terra/flutter","siteSpaceId":"sitesp_x290K","icon":"flutter","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API","icon":"signal-stream"},{"label":"Your app -> Terra"}]},{"id":"HiOGHFXileVRts3Wxyoh","title":"Terra -> Your backend","pathname":"/streaming-api/terra-greater-than-your-backend","siteSpaceId":"sitesp_x290K","description":"Set up and manage a consumer connection to the Terra WebSocket service to receive real-time health data.","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API","icon":"signal-stream"}]},{"id":"xJk9LO2xp0gyY2Axz7q9","title":"Overview","pathname":"/integration-partners/overview","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Integration Partners","icon":"handshake"}]},{"id":"EQYib7cOIQUoEu0BOLRS","title":"How the integration works","pathname":"/integration-partners/how-the-integration-works","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Integration Partners","icon":"handshake"}]},{"id":"b0kpH1K6H8jNoPcB7As4","title":"Submitting an Application","pathname":"/integration-partners/submitting-an-application","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Integration Partners","icon":"handshake"}]},{"id":"aW1anNgx114LO2OUExsT","title":"Overview","pathname":"/lab-reports/lab-reports","siteSpaceId":"sitesp_x290K","description":"Convert lab report PDFs into structured, standardized biomarker data via a simple REST API.","breadcrumbs":[{"label":"Docs"},{"label":"Lab Reports","icon":"flask-vial"}]},{"id":"qsW3W0Vv3hEEL1Rg6gwO","title":"Quick Start","pathname":"/lab-reports/quickstart","siteSpaceId":"sitesp_x290K","description":"Upload a lab report, check status, and retrieve structured biomarker data in three steps.","breadcrumbs":[{"label":"Docs"},{"label":"Lab Reports","icon":"flask-vial"}]},{"id":"yf4I5IcEVlpFRWD4HqKe","title":"Core Concepts","pathname":"/lab-reports/core-concepts","siteSpaceId":"sitesp_x290K","description":"Session lifecycle, data model, biomarker standardization, and async processing.","breadcrumbs":[{"label":"Docs"},{"label":"Lab Reports","icon":"flask-vial"}]},{"id":"oIdBi358DlwXzikllX5u","title":"API Reference","pathname":"/lab-reports/api-reference","siteSpaceId":"sitesp_x290K","description":"Complete reference for all Lab Reports API endpoints.","breadcrumbs":[{"label":"Docs"},{"label":"Lab Reports","icon":"flask-vial"}]},{"id":"LAFrwYOvr62CflUORiSV","title":"Webhook Payload","pathname":"/lab-reports/webhook-payload","siteSpaceId":"sitesp_x290K","description":"Webhook delivery format, complete payload example, and field specifications.","breadcrumbs":[{"label":"Docs"},{"label":"Lab Reports","icon":"flask-vial"}]},{"id":"wVteYHFlTl4pbNtxUHHf","title":"Biomarker Reference","pathname":"/lab-reports/biomarker-reference","siteSpaceId":"sitesp_x290K","description":"Biomarker standardization, UCUM unit codes, and common biomarker reference table.","breadcrumbs":[{"label":"Docs"},{"label":"Lab Reports","icon":"flask-vial"}]},{"id":"at05yaNrLjXYUKYHX9oi","title":"Best Practices","pathname":"/lab-reports/best-practices","siteSpaceId":"sitesp_x290K","description":"Recommendations for robust integration with the Lab Reports API.","breadcrumbs":[{"label":"Docs"},{"label":"Lab Reports","icon":"flask-vial"}]},{"id":"FQhHNm5FLkJFJVotQqGu","title":"REST API Endpoints","pathname":"/reference","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"}]},{"id":"1gGpqtGyPCbKEVT9b3dk","title":"OpenAPI Spec","pathname":"/reference/health-and-fitness-api/openapi-spec","siteSpaceId":"sitesp_6ihJs","description":"Outlines where to access Terra's OpenAPI Spec","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"}]},{"id":"DOYEsFWSrWttD9io5NL8","title":"Supported integrations","pathname":"/reference/health-and-fitness-api/supported-integrations","siteSpaceId":"sitesp_6ihJs","description":"Outlines the currently supported integrations & any surrounding info around them","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"}]},{"id":"cy46X4ojl34wlysLBl1P","title":"Event Types","pathname":"/reference/health-and-fitness-api/event-types","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"}]},{"id":"1tWjoDbv4xvNTYgArD5i","title":"Data models","pathname":"/reference/health-and-fitness-api/data-models","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"}]},{"id":"heLEGuSoAb68aED0A4V5","title":"Samples","pathname":"/reference/health-and-fitness-api/samples","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"}]},{"id":"LKWyfkQuiVmbM97s6zEi","title":"Core concepts","pathname":"/reference/health-and-fitness-api/core-concepts","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"}]},{"id":"I4gaLvxIX9YPJONQJfhk","title":"Rate Limits","pathname":"/reference/health-and-fitness-api/rate-limits","siteSpaceId":"sitesp_6ihJs","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"}]},{"id":"3pkvWBzMWt81SSqUw4ui","title":"Destinations","pathname":"/reference/health-and-fitness-api/destinations","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"}]},{"id":"e6k7r0441LTpFE2G80nc","title":"Mobile SDK","pathname":"/reference/health-and-fitness-api/sdk-references","siteSpaceId":"sitesp_6ihJs","icon":"mobile-notch","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"}]},{"id":"5ndyWIp3sQqelSRzXmZM","title":"iOS (Swift)","pathname":"/reference/health-and-fitness-api/sdk-references/ios-swift","siteSpaceId":"sitesp_6ihJs","icon":"apple-whole","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"},{"label":"Mobile SDK","icon":"mobile-notch"}]},{"id":"TB4cK3AsTsiK2Xbj3bwS","title":"Android (Kotlin)","pathname":"/reference/health-and-fitness-api/sdk-references/android-kotlin","siteSpaceId":"sitesp_6ihJs","icon":"android","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"},{"label":"Mobile SDK","icon":"mobile-notch"}]},{"id":"BCwCVbldpvDrFBJ4sxIs","title":"React Native","pathname":"/reference/health-and-fitness-api/sdk-references/react-native","siteSpaceId":"sitesp_6ihJs","icon":"react","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"},{"label":"Mobile SDK","icon":"mobile-notch"}]},{"id":"oUCP22xvgTnHDliWBHxc","title":"Flutter","pathname":"/reference/health-and-fitness-api/sdk-references/flutter","siteSpaceId":"sitesp_6ihJs","icon":"flutter","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"},{"label":"Mobile SDK","icon":"mobile-notch"}]},{"id":"p4BmSFkGxQvYBTVsqanD","title":"Permissions mapping","pathname":"/reference/health-and-fitness-api/sdk-references/permissions-mapping","siteSpaceId":"sitesp_6ihJs","icon":"shield-check","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Health & Fitness API"},{"label":"Mobile SDK","icon":"mobile-notch"}]},{"id":"2oGKJhw2wdhuHBpXXgcw","title":"REST API Endpoints","pathname":"/reference/streaming-api/api-endpoints","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Streaming API"}]},{"id":"MHE7DQlmlYB3qygrNEJA","title":"Supported Integrations","pathname":"/reference/streaming-api/supported-integrations","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Streaming API"}]},{"id":"jgvEC76cngHLkP2y7lDl","title":"Core Concepts","pathname":"/reference/streaming-api/core-concepts","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Streaming API"}]},{"id":"jyQ5cLnS9nLrBQ1kgVS4","title":"Websocket Reference","pathname":"/reference/streaming-api/websocket-reference","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Streaming API"}]},{"id":"N6WCqdmPGhOXrsll6YQP","title":"Mobile SDK","pathname":"/reference/streaming-api/reference","siteSpaceId":"sitesp_6ihJs","icon":"mobile-notch","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Streaming API"}]},{"id":"YtH3ihAStRQynTsbDQTm","title":"iOS (Swift)","pathname":"/reference/streaming-api/reference/ios-swift","siteSpaceId":"sitesp_6ihJs","icon":"apple-whole","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Streaming API"},{"label":"Mobile SDK","icon":"mobile-notch"}]},{"id":"rAjIOlXsmUCxddZR3dg6","title":"Android (Kotlin)","pathname":"/reference/streaming-api/reference/android-kotlin","siteSpaceId":"sitesp_6ihJs","icon":"android","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Streaming API"},{"label":"Mobile SDK","icon":"mobile-notch"}]},{"id":"Cnfz5OU0AwMg9njuoNib","title":"Flutter","pathname":"/reference/streaming-api/reference/flutter","siteSpaceId":"sitesp_6ihJs","icon":"flutter","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Streaming API"},{"label":"Mobile SDK","icon":"mobile-notch"}]},{"id":"13jH8OquAfoWAj7PLTYT","title":"React Native","pathname":"/reference/streaming-api/reference/react-native","siteSpaceId":"sitesp_6ihJs","icon":"react","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Streaming API"},{"label":"Mobile SDK","icon":"mobile-notch"}]},{"id":"OMb3wRWfbGfksNt50Jio","title":"Supported Integrations","pathname":"/reference/teams-api/supported-integrations","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Teams API - Beta"}]},{"id":"9kmv6hBh9Egd2q0re444","title":"Core Concepts","pathname":"/reference/teams-api/core-concepts","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Teams API - Beta"}]},{"id":"ZALEuNfebosOCQUBhZPI","title":"API Endpoints","pathname":"/reference/teams-api/api-endpoints","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Teams API - Beta"}]},{"id":"2zPHvBrpP6u7v00MX1LI","title":"Event types","pathname":"/reference/teams-api/event-types","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Teams API - Beta"}]},{"id":"xjkUytxN8iDdHDCXp4tG","title":"May Update 2026","pathname":"/changelog","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2026"}]},{"id":"prZWM3Crci26AgOFSfRl","title":"April Update 2026","pathname":"/changelog/2026/april-update-2026","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2026"}]},{"id":"qOIp0nz7YA1Y5cFuP5vN","title":"March Update 2026","pathname":"/changelog/2026/march-update-2026","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2026"}]},{"id":"QAbRFzbocR1qPCcogh8P","title":"February Update 2026","pathname":"/changelog/2026/february-update-2026","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2026"}]},{"id":"q9wPnzQkKGQBleTttVdf","title":"January Update 2026","pathname":"/changelog/2026/january-update-2026","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2026"}]},{"id":"wZY3ZzivedipEiFVwkHc","title":"December Update 2025","pathname":"/changelog/2025/december-update-2025","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2025"}]},{"id":"5IfxHCqTulfEkqErubUW","title":"November Update 2025","pathname":"/changelog/2025/november-update-2025","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2025"}]},{"id":"YChhdFkn6fjhjQplbMNd","title":"October Update 2025","pathname":"/changelog/2025/october-update-2025","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2025"}]},{"id":"8nJBJwt1ripjfpWxBtC7","title":"September Update 2025","pathname":"/changelog/2025/september-update-2025","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2025"}]},{"id":"iYIIBTuzbo5PrsUgNpsf","title":"August Update 2025","pathname":"/changelog/2025/august-update-2025","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2025"}]},{"id":"0s11eTAI1OmOwgYWnaaW","title":"July Update 2025","pathname":"/changelog/2025/readme","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2025"}]},{"id":"RCLflgf1XP4WsMCRQTA7","title":"June Update 2025","pathname":"/changelog/2025/readme-1","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2025"}]},{"id":"Ok1r6d63qfWDL2INYTHQ","title":"May Update 2025","pathname":"/changelog/2025/readme-2","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2025"}]},{"id":"UsEGUv7u0ctkyH0whbnL","title":"April Update 2025","pathname":"/changelog/2025/readme-1-1","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2025"}]},{"id":"9Wqa0eLdMcWAkyyPBXTc","title":"March Update 2025","pathname":"/changelog/2025/readme-2-1","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2025"}]},{"id":"o4QwDpwgD5o2TbUj9gtq","title":"February Update 2025","pathname":"/changelog/2025/february-update-2025","siteSpaceId":"sitesp_q3JRb","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2025"}]},{"id":"Z6R6CkBftAp8YPzD6k3t","title":"January Update 2025","pathname":"/changelog/2025/readme-1-1-1","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2025"}]},{"id":"BCvwN8pAhDfpFRC1c0r2","title":"December Update 2024","pathname":"/changelog/2024/2024-december-update","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2024"}]},{"id":"QUgCahErFLFQvW2R8yOW","title":"November Updates 2024","pathname":"/changelog/2024/2024-november-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2024"}]},{"id":"dl0qKON36cjF4i4BwKMA","title":"October Updates 2024","pathname":"/changelog/2024/2024-october-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2024"}]},{"id":"oA4pnKMw5JrYyt3a7xQS","title":"September Updates 2024","pathname":"/changelog/2024/2024-september-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2024"}]},{"id":"eaOmYGyao0nKL8OgX5JP","title":"August Updates 2024","pathname":"/changelog/2024/2024-august-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2024"}]},{"id":"QXbDfOw9njnQWMqTrWnp","title":"July Updates 2024","pathname":"/changelog/2024/2024-july-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2024"}]},{"id":"7YWK3yCc7yVCBqhaVdT8","title":"June Updates 2024","pathname":"/changelog/2024/2024-june-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2024"}]},{"id":"VVNrWgbF9Rgt7aOqLu4O","title":"May Updates 2024","pathname":"/changelog/2024/2024-may-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2024"}]},{"id":"0ePvnOHPDyXYUSPuM7iD","title":"April Updates 2024","pathname":"/changelog/2024/2024-april-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2024"}]},{"id":"4zw66ZOsLGhqQqxGYScK","title":"March 2024","pathname":"/changelog/2024/2024-march","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2024"}]},{"id":"maHxbFarATVjTZDfozIt","title":"February Updates 2024","pathname":"/changelog/2024/2024-february-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2024"}]},{"id":"tlWrX8BnwHtFBTS8lAQF","title":"January Updates 2024","pathname":"/changelog/2024/2024-january-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2024"}]},{"id":"pxaowIJW8jJ3lbwbWHII","title":"December Updates 2023","pathname":"/changelog/2023/2024-december-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"wrEeASqCS4iQRSOwTaJD","title":"November Updates 2023","pathname":"/changelog/2023/2023-november-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"lVzB8zymnGCTd1M1uXAD","title":"October Updates 2023","pathname":"/changelog/2023/2023-october-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"zlMjERAqhSGT035vvnCv","title":"September Updates 2023","pathname":"/changelog/2023/2023-september-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"rq0cEReOgySm8YLlhFqO","title":"August Updates 2023","pathname":"/changelog/2023/2023-august-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"U76hy1M72bHUEr9Bhl62","title":"July Updates 2023","pathname":"/changelog/2023/2023-july-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"hda1e69s8EmHMILT8MjL","title":"June Updates 2023","pathname":"/changelog/2023/2023-june-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"KYok3rJRY2ddQZBZWRXk","title":"June 27, 2023","pathname":"/changelog/2023/2023-06-27","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"jP2xfDBWB09Hq1gcKtcI","title":"June 16, 2023","pathname":"/changelog/2023/2023-06-16","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"8tZuTpDICaeJkJ3xzdbs","title":"June 5, 2023","pathname":"/changelog/2023/2023-06-05","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"6h6b32x60t2FDsKofOmu","title":"May Updates 2023","pathname":"/changelog/2023/2023-may-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"EzRN1ia6LSXrMbqaN2PS","title":"May 19, 2023","pathname":"/changelog/2023/2023-05-19","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"YyTyFyRJRJNYMT3ELTdq","title":"April Updates 2023","pathname":"/changelog/2023/2023-april-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"EDMJAAREUOWUM8Rz5krJ","title":"April 27, 2023","pathname":"/changelog/2023/2023-04-27","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"T4Qt5itkwr9jXT4XFdfk","title":"April 18, 2023","pathname":"/changelog/2023/2023-04-18","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"OUTnXURLcsKNXOd4HR5q","title":"April 11, 2023","pathname":"/changelog/2023/2023-04-11","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"35PUIGo8rz8JFJ4zjLT2","title":"March Updates 2023","pathname":"/changelog/2023/2023-march-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"3Y4RiwUDCzM14pSGyugO","title":"March 29, 2023","pathname":"/changelog/2023/2023-03-29","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"RCJsC9pCdceUA84dIzBQ","title":"March 22, 2023","pathname":"/changelog/2023/2023-03-22","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"379kTe3sL82ZyehSquaq","title":"March 13, 2023","pathname":"/changelog/2023/2023-03-13","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"e1kynjZ2lVW0CfqwISff","title":"March 6, 2023","pathname":"/changelog/2023/2023-03-06","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"m3xrE92ySpuXFtqlvPmM","title":"February Updates 2023","pathname":"/changelog/2023/2023-february-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"iTqq8WlFIHgFTnYF2IEv","title":"February 21, 2023","pathname":"/changelog/2023/2023-02-21","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"4bk41fdU02MnjxDD872B","title":"February 7, 2023","pathname":"/changelog/2023/2023-02-07","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"lTHTjNYN6xn0bTeBaA0h","title":"January Updates 2023","pathname":"/changelog/2023/2023-january-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"bifAUzOUBFf3tKej5phe","title":"January 30, 2023","pathname":"/changelog/2023/2023-01-30","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2023"}]},{"id":"EGg2mvDxUppMUnNEP5pl","title":"December 15, 2022","pathname":"/changelog/2022/2022-12-15","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2022"}]},{"id":"E1JvGyaolzW22hhvvIFC","title":"December 7, 2022","pathname":"/changelog/2022/2022-12-07","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2022"}]},{"id":"GzGrMkLX66kxxacGvjU1","title":"November 22, 2022","pathname":"/changelog/2022/2022-11-22","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog","icon":"scroll"},{"label":"2022"}]},{"id":"gQPBZgclYPiwlaFKnnG7","title":"Terra AI","pathname":"/ai-interface","siteSpaceId":"sitesp_3D5Rv","breadcrumbs":[{"label":"AI"}]},{"id":"c01830131051873f15c51f1edd7f5888d71dfd10","title":"Error states","pathname":"/ai-interface/error-states","siteSpaceId":"sitesp_3D5Rv","breadcrumbs":[{"label":"AI"}]},{"id":"LThc2RqOxBKU56Qt3TMy","title":"What is Vantage API?","pathname":"/vantage-api-docs","siteSpaceId":"sitesp_vurtg","icon":"hand-wave","description":"Vantage API is Terra's diagnostics platform: order blood and DNA test kits, track fulfilment, and receive lab results in FHIR format through a single API.","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"}]},{"id":"9JYzNsswqpnarSW02vxt","title":"Account setup and authentication","pathname":"/vantage-api-docs/account-setup-and-api-keys","siteSpaceId":"sitesp_vurtg","icon":"key","description":"How to get Vantage API access, authenticate your requests, and configure the webhook endpoint that receives order and result updates.","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"}]},{"id":"Hrfa21Z3nzSwMh6vmUPd","title":"Core concepts","pathname":"/vantage-api-docs/core-concepts","siteSpaceId":"sitesp_vurtg","icon":"diagram-project","description":"The Vantage API data model: catalog structure, orders and order items, recipients and test takers, status lifecycles, and conventions used across all endpoints.","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"}]},{"id":"3jCnoOQRT6Q3ZXrNpjqh","title":"Ordering your first test","pathname":"/vantage-api-docs/getting-started/ordering-your-first-test","siteSpaceId":"sitesp_vurtg","icon":"vial","description":"Place your first sandbox order in a few minutes: browse the catalog, order a test kit, and watch the fulfilment webhooks arrive.","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"},{"label":"Getting Started"}]},{"id":"QPzbTvC6XsT5gERiU43E","title":"Working with Sandbox","pathname":"/vantage-api-docs/getting-started/working-with-sandbox","siteSpaceId":"sitesp_vurtg","icon":"island-tropical","description":"Simulate the full kit journey in sandbox - either by driving lifecycle events directly with the simulate endpoint, or by walking the realistic supplier flow with kit activation - then fetch and acknow","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"},{"label":"Getting Started"}]},{"id":"DDSNrUXXLzcW04P3zd02","title":"Webhooks","pathname":"/vantage-api-docs/documentation/webhooks","siteSpaceId":"sitesp_vurtg","icon":"anchor","description":"How Vantage API delivers order and result updates to your endpoint: event families and payloads, HMAC signature verification, and retry semantics.","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"},{"label":"DOCUMENTATION"}]},{"id":"kpM0MWYzfzcG1c7z0WFb","title":"Managing orders","pathname":"/vantage-api-docs/documentation/managing-orders","siteSpaceId":"sitesp_vurtg","icon":"list-check","description":"Track orders after placement: fetch full order detail with status history, list and filter orders and results, and curate which products your catalog returns.","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"},{"label":"DOCUMENTATION"}]},{"id":"zi6qDReMNj4WRmMwm0Fh","title":"Test Collection Methods","pathname":"/vantage-api-docs/documentation/test-collection-methods","siteSpaceId":"sitesp_vurtg","icon":"syringe","description":"AT_HOME vs GO_TO_LAB orders: which address fields each requires, how lab routing works, and how to find nearby lab draw sites.","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"},{"label":"DOCUMENTATION"}]},{"id":"wh4vQcj9dEPw0yCyhRHT","title":"Results","pathname":"/vantage-api-docs/documentation/results","siteSpaceId":"sitesp_vurtg","icon":"square-poll-horizontal","description":"Fetching test results as FHIR documents: the download flow, how to read the Bundle structure, out-of-range and critical values, and failure scenarios.","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"},{"label":"DOCUMENTATION"}]},{"id":"jmyU2m3ntPsQybDehYO6","title":"Errors","pathname":"/vantage-api-docs/documentation/errors","siteSpaceId":"sitesp_vurtg","icon":"triangle-exclamation","description":"The error format Vantage API uses (RFC 7807 problem details), what each HTTP status code means, and how to handle validation failures.","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"},{"label":"DOCUMENTATION"}]},{"id":"Bwa73PXKYKi8FYGgppJU","title":"Monitoring and debugging","pathname":"/vantage-api-docs/documentation/monitoring","siteSpaceId":"sitesp_vurtg","icon":"chart-line","description":"Observe your integration in production: the analytics overview endpoint, webhook delivery outcomes, and how to debug missed webhooks.","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"},{"label":"DOCUMENTATION"}]},{"id":"N9VduanJKcWywpOgGQae","title":"Best practices","pathname":"/vantage-api-docs/documentation/best-practices","siteSpaceId":"sitesp_vurtg","icon":"thumbs-up","description":"Patterns that keep a Vantage integration robust: webhook handling, deduplication, safe retries, ID handling, and result delivery done right.","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"},{"label":"DOCUMENTATION"}]},{"id":"rpg4wJFiaQxILfmFOb4h","title":"Acknowledging Results","pathname":"/vantage-api-docs/important-information/acknowledging-results","siteSpaceId":"sitesp_vurtg","icon":"microscope","description":"Result acknowledgment is a mandatory compliance step: patients cannot access their results until you acknowledge them, and failing to acknowledge transfers liability to your organisation.","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"},{"label":"IMPORTANT INFORMATION"}]},{"id":"m4GDpLucAymCZQCAibU3","title":"Going to production","pathname":"/vantage-api-docs/important-information/going-to-production","siteSpaceId":"sitesp_vurtg","icon":"rocket-launch","description":"A checklist for moving your Vantage integration from sandbox to production safely.","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Docs"},{"label":"IMPORTANT INFORMATION"}]},{"id":"c9f64ff7afa8ab42b2b21866ed8d6d88b3f0007e","title":"Activation","pathname":"/vantage-api-reference","siteSpaceId":"sitesp_otzY4","description":"","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Reference"},{"label":"CORE RESOURCES"}]},{"id":"dcbdc9bc3e82498620ac0758abbc08047a01a7dd","title":"Clients","pathname":"/vantage-api-reference/core-resources/clients","siteSpaceId":"sitesp_otzY4","description":"","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Reference"},{"label":"CORE RESOURCES"}]},{"id":"9c1c199f31bf994d546ea347f1194c1a742d1954","title":"Orders","pathname":"/vantage-api-reference/core-resources/orders","siteSpaceId":"sitesp_otzY4","description":"","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Reference"},{"label":"CORE RESOURCES"}]},{"id":"8d4503d8fe68ff4d6afa0b665248e35f40e3aab5","title":"Products","pathname":"/vantage-api-reference/core-resources/products","siteSpaceId":"sitesp_otzY4","description":"","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Reference"},{"label":"CORE RESOURCES"}]},{"id":"0ef76abde16675473fda321994b4a184be5cb23c","title":"Results","pathname":"/vantage-api-reference/core-resources/results","siteSpaceId":"sitesp_otzY4","description":"","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Reference"},{"label":"CORE RESOURCES"}]},{"id":"f917a83f2d58257a8167d5e9d26adeaeeff6d698","title":"Labs","pathname":"/vantage-api-reference/core-resources/labs","siteSpaceId":"sitesp_otzY4","description":"","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Reference"},{"label":"CORE RESOURCES"}]},{"id":"457ab12d3d825bb9e3ff1ab0704743c0f7e39931","title":"Analytics","pathname":"/vantage-api-reference/core-resources/analytics","siteSpaceId":"sitesp_otzY4","description":"","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Reference"},{"label":"CORE RESOURCES"}]},{"id":"0075f954259fcb60521137b0ff95a0dd4f0c6998","title":"Terra Vantage API","pathname":"/vantage-api-reference/core-resources/terra-vantage-api","siteSpaceId":"sitesp_otzY4","description":"","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Reference"},{"label":"CORE RESOURCES"}]},{"id":"46185a3bb2afa20c498c68b6ff03389c9207cf1e","title":"Models","pathname":"/vantage-api-reference/core-resources/models","siteSpaceId":"sitesp_otzY4","breadcrumbs":[{"label":"Vantage API"},{"label":"Vantage API Reference"},{"label":"CORE RESOURCES"}]},{"id":"njH9eu74kH4nq2PaW1uB","title":"Help Center","pathname":"/faq","siteSpaceId":"sitesp_2ppMq","icon":"life-ring","description":"","breadcrumbs":[{"label":"FAQ"}]},{"id":"VRuVEZHe8m3vr7EcAyxQ","title":"API, SDK & data formats","pathname":"/faq/help-topics/data-api-sdk","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"The API, the SDKs, data fields, formats and provider coverage.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"}]},{"id":"ZTTnTO9a1fzIOIWS5EuE","title":"Mobile SDK setup, permissions and crashes","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Mobile SDK setup, permissions and crashes","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"IuTmKR6P0uv8PGQU1tIq","title":"Can I connect Apple Health from a web app?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/mobile-only-sources-need-sdk-not-web-or-rest","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Apple Health, Samsung Health, Health Connect, and Google Fit (via Health Connect) are on-device, mobile-only sources with no web API.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"Uc2tJrMPfgHJA7OMZstR","title":"Why does Health Connect re-prompt permissions on init?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/permission-prompt-reappears-on-init","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"On Android with Health Connect, initTerra automatically re-requests permissions when the device previously had a connection and the user still exists…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"uaAqkTMPhfzpZ06Zw3pE","title":"Why does the Flutter SDK fail in release but work in debug?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/android-release-proguard-r8-keep-rules","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Code that works in debug but fails in Android release builds means R8 minification (disabled in debug) is stripping or renaming SDK classes.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"SWP6xz3AoPg8xcPfDu1L","title":"How do I remove unused Health Connect permissions?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/strip-unused-health-permissions-store-review","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"The Terra Android SDK declares all Health Connect permissions by default, which triggers Play Store review questions about permissions you do not actually use.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"ML5asHsOCetzdTsKOZhv","title":"Why are Apple Health activity webhooks empty?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/apple-health-permission-list-mapping","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Apple Health data only flows when the matching HealthKit permission is granted, and the Health app labels don't always match Terra's data types.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"OD7NDAlEHmtXSBlOEV0J","title":"Why am I seeing Android React Native background crashes?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/android-rn-background-crashes-upgrade","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Random background crashes in the React Native plugin on Android were a known issue resolved in later releases.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"YstEmp0NUgW7JBHypAAZ","title":"Why do SDK data calls say permission not granted?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/init-sequence-before-data-calls","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Data functions like getActivity / getDaily only work after the SDK is fully initialised.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"z3XmvoooQvQBxs4EL3Cs","title":"Why does the SDK report success when user denies permissions?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/connection-success-does-not-mean-permissions-granted","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"This is intended behaviour.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"vNpWzfRkoRl2sZgRjvuS","title":"Why does Health Connect heart rate sync cause OOM crashes?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/health-connect-oom-large-hr-window","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Out-of-memory crashes reading Health Connect heart-rate data usually come from requesting too large a window at once, since HR samples are very dense.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"dFd4dBQVt5rsI99nPf6V","title":"Why is Google sign-in blocked in my WebView?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/google-oauth-blocked-in-webview","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Google blocks OAuth inside embedded WebViews because the missing URL bar prevents users from verifying the domain, which surfaces as the disallowed_useragent /…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"IORGoCEBpUoFGt0ij3hf","title":"How do users connect if the Apple companion app isn't in the App Store?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/missing-apple-companion-app-store-link","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"The companion app may not appear in normal App Store search.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"CkuLxoIm40pMwKjH8GEA","title":"How do I request more health permissions from existing users?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/expand-permissions-existing-users","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"To request more permissions from existing users, call initConnection again with an expanded set of customPermissions.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"BXwHtXACa572iGLHsHUI","title":"Why does Samsung initConnection return invalid session token?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/samsung-init-errors-token-devmode","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"An invalid-session-token error on initConnection almost always means the SDK was initialised with a different dev ID from the one used to generate the auth…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"NsEl5lb5A3BWITBm46Yp","title":"How does the Apple Health SDK work?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/apple-health-sdk-overview-capabilities","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Apple Health has no server API.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"f4DkE4NO7bQwzjuyUYao","title":"Why does generateAuthToken hit a CORS error?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/auth-token-generate-server-side","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Two separate things are happening here","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"Nd31PDdSXE9KTNXcM22t","title":"Google Fit vs Health Connect SDK connection types?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/google-fit-vs-health-connect-connection-types","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"The two connection types differ in what they read","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"mj1KwecQ1hx7x7VZnkXq","title":"Why isn't Health Connect background sync firing?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/health-connect-background-sync-not-firing","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Health Connect background sync behaves differently from Apple Health, so schedulerOn=true working immediately is not expected on first connection.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"cb6nPsXreACtf20RSQyH","title":"Why did my Python SDK data pulls stop working?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/stale-sdk-version-broke-compat","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"If data pulls suddenly stop on an older Terra client SDK version, the cause is usually an API change that broke compatibility with the outdated SDK, not…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"EKUCeyVcEqNam4COK8wU","title":"Why do I get 'Invalid dev-id was provided'?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/invalid-dev-id-validation-catchall","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"The authenticateSDKUser endpoint returns Invalid dev-id was provided for any validation failure on that call, not only a bad dev-id.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"7kfvRJwC3VzKa1hdmk8L","title":"How do getSleep start and end date filters work?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/getsleep-date-filter-behaviour","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"getSleep(startDate, endDate) returns sleep sessions for that window, and the end time is not ignored.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"XI5Wt4vua9zJeGmFJHOj","title":"Why does the Health Connect permission screen never appear?","pathname":"/faq/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/health-connect-permission-screen-missing-client-build","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"A Health Connect permission screen that never appears (with empty payloads) can be caused by your own build plugin rendering Android intents incorrectly…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"hjRZq0xxdJ81jHDfswXU","title":"Webhooks, dedup and sync reliability","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Webhooks, dedup and sync reliability","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"oz78tUzOWlaCozkuByah","title":"Why are daily step totals inconsistent across webhooks?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/daily-payload-cumulative-overwrite-by-day","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Daily payloads are a running summary of the 24-hour period, sent multiple times as new data arrives, each containing totals up to that point.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"viTb59czGBmEXZLYfih1","title":"How do I make production sync reliable?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/webhooks-as-primary-source-best-practice","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"Use webhooks as your primary data source.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"JwhiHZHrQcZGQ9c5ILiY","title":"How do I dedupe two payloads for the same event?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/dedup-by-summary-id-overwrite-updates","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"A data point is uniquely identified by the tuple (user_id, metric/type, start_time, end_time, summary_id), even when summary_id or timestamps are null.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"3pQM3rEBT5uaJuoAbmUD","title":"How do I dedupe multiple sources behind Apple Health?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/apple-health-multi-source-dedup","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"For Apple Health, payloads can combine data from multiple contributing apps","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"sVLTOlexCkF7b3AYrdo6","title":"Can Apple Health data arrive near real-time?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/apple-sdk-sync-timing-foreground-dependent","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Apple Health sync timing is controlled by iOS, which decides when to release resources to deliver new data, so true real-time delivery cannot be guaranteed.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"si2GoUZhWlZWxSuD74bl","title":"How reliable is iOS background data delivery?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/ios-background-delivery-reliability-setup","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"On iOS, background delivery is triggered by the OS when new HealthKit data is available, not on a fixed schedule.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"fU45bIqivahBAJcx9wFk","title":"Can a payload show its originating source through an aggregator?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/originating-source-via-device-data","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"It depends on the provider.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"omw0AyaeAKNRoCRC5i1J","title":"How do I stop receiving Oura data through Apple?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/apple-foreign-data-tagged-apple-filter","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Other apps such as Oura write their readings into Apple HealthKit.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"3jjv3dmYOBmPp3OlaKma","title":"Can I detect and exclude manually entered steps?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/manual-entry-upload-type-filtering","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Most wearable APIs flag manually entered data, surfaced in metadata.upload_type","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"Qp876obBmuuHaP9sA7Jj","title":"Why does Samsung Health send webhooks with empty data?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/samsung-health-empty-data-not-syncing","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"When Samsung Health (read via Health Connect) returns empty payloads, work through three things","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"GwX6DJqmaoaJ1JenbL5C","title":"Why are deleted Garmin activities still returned?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/garmin-deleted-activities-persist","siteSpaceId":"sitesp_2ppMq","icon":"trash","description":"Garmin's Health API does not publish an activity-deletion event, so once an activity reaches Terra, a later delete in Garmin Connect never reaches us and the…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"YEKgAZD3fvcvSiwJ0yVg","title":"Why does a daily payload look missing for one day?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/timezone-date-boundary-missing-day","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"This is a timezone boundary effect, not missing data.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"qhS0yOaMvxXxv4B2VW3z","title":"What sync frequency can I expect per provider?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/sync-freshness-bottleneck-device-to-cloud","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Sync frequency depends on whether a provider is push-based or polled","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"1WUKGwDENCPJKX7Q6lOH","title":"How do I dedupe sleep webhooks with the same start time?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/sleep-dedup-summary-id","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Use the summary_id field under metadata to uniquely identify and update sleep records, rather than the start_time/end_time pair.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"vdHMDUnUEDI3drXLfwhC","title":"Why was the same workout re-sent with a different timezone?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/apple-travel-timezone-duplicate-workouts","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Apple Health timestamps use the device's current timezone at sync time, and historical timezones can't be retrieved on iOS.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"rbQLG0epN6A7KWQa2jn2","title":"What webhook traffic rates should I expect?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/webhook-traffic-rates","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Expected webhook traffic and burst patterns depend on your device mix, so there is no single rate.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"6YOx0G5DZrj72kDp8GPW","title":"Why do Apple body metrics arrive after step changes?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/apple-body-payloads-independent","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Metrics like VO2 Max, lean body mass, and body fat are delivered in body payloads, which are sent independently of daily payloads.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"2p4MVIdfIbFYbYTDm57L","title":"Why did the first webhook lack heart rate?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/near-simultaneous-webhooks-use-latest","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"When two webhooks arrive close together for the same session, the earlier one may lack a field like heart rate because the source data was still being updated.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"7rBrgdjl8ldloGYIxZdg","title":"Why do Oura payloads differ from the Oura app?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/oura-app-vs-terra-discrepancy","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Discrepancies between the Oura app and Terra usually have two causes","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"xj02ktQZsDB32KUQPOxc","title":"Why does Oura app HRV differ from the API HRV?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/hrv-app-vs-api-calculation-diff","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"A different HRV in the provider's app versus the Terra API is usually a difference in calculation method, not a data discrepancy.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"7kScxJrUAa05KWAVe72L","title":"Why did new payload fields break my parser?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/additive-schema-new-fields-parser","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"New fields can appear in payloads as part of normalised-schema updates.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"GH63r0OpAPQouOjgFUpc","title":"Why are COROS activities delayed by several minutes?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/coros-polling-latency-no-webhooks","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Yes, this latency is expected.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"jXK8RkKtzhaqHzeyFmxY","title":"What is the permission_change webhook type?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/informational-webhook-event-types","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"The permission_change webhook is an informational event sent when an end user modifies the scopes granted to your app.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"XjFb2Lqv3T6pzc2H64lV","title":"How do I know when a data request's last event arrived?","pathname":"/faq/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/track-webhook-request-completion","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"Webhook payloads include the terra-reference header value returned in the synchronous API response, so you can match deliveries to a specific request and track…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Webhooks, dedup and sync reliability","icon":"code"}]},{"id":"pgnqjeqnNobgmd6JXloU","title":"Provider coverage and per-provider data availability","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Provider coverage and per-provider data availability","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"PaHcPet7EvTdIVYckq9D","title":"Do you support CGMs like Dexcom?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/cgm-coverage-dexcom","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Dexcom (including G7) is a reliable direct integration.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"dT7LrYhD2VZdc4f7ZzSB","title":"Why are step and distance metrics empty for WHOOP?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/provider-limitation-steps-distance","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"WHOOP devices have no step counter, so step and walking-distance metrics are never produced and those fields are always empty for WHOOP-connected users.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"RIVNoH8DZt4tsUSl3059","title":"Why is hr_zone_data always empty for this provider?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/hr-zone-data-empty-per-provider","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"hr_zone_data is only populated for providers that expose it through their API.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"cM8z3sTkH5BuMO2DroAP","title":"Why doesn't Garmin calorie series match total_burned_calories?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/garmin-calorie-timeseries-vs-total","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"The calorie time series tracks active burn only, while total_burned_calories is the whole-day figure including BMR (resting calories).","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"L2F3BUZe3MHhUEMz8lgg","title":"Can I get time-in-zones and strength detail for Garmin?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/garmin-no-timeinzones-no-exercise-detail","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Garmin's Health API does not provide","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"1Gyanl4wkloe7dzEG2QP","title":"Why are Garmin daily fields like respiration and VO2 max null?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/garmin-daily-fields-null-on-other-payloads","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Many fields that look null on the Garmin daily payload are actually delivered, just on the sleep or body payload rather than the daily envelope.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"WXaghAXh8p0oH6Bvp0QX","title":"Why does stress data have no samples array?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/stress-data-samples-and-fields","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Detailed stress samples are currently only available from Garmin.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"J9ZLZz4Qj7DW0JwtSq7W","title":"Why don't Zwift activities forward from Garmin to Terra?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/garmin-no-third-party-activity-forwarding","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"This is expected: Garmin deliberately does not forward third-party uploaded activities (for example, from Zwift) through the API Terra uses.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"n4eraQiX8mtKHERQfAFN","title":"Why is Apple Watch Sleep Score null?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/apple-sleep-score-not-exposed-by-healthkit","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Apple's Sleep Score currently appears only on the watch/device and is not synced into Apple Health, so it isn't readable through HealthKit and comes through as…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"dlOeeNN8CZWyLTWnXtqN","title":"Are Google Fit and Health Connect the same provider?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/googlefit-vs-health-connect-distinction","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"They are distinct providers","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"WxbPmvLY2ZhmvGBrXpPQ","title":"Why does Apple Health nutrition data have no timestamps?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/apple-nutrition-daily-totals-only","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Apple Health nutrition values do carry per-entry timestamps.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"rnoOKHfu5MwFF99JIVN1","title":"Why does this provider's nutrition payload lack meal entries?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/nutrition-no-meal-level-detail","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Individual meal data is not currently provided by this nutrition provider's API.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"AgO260haeg4y9kT5F9d1","title":"How do I get weight data from MyFitnessPal?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/myfitnesspal-no-body-weight","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"MyFitnessPal does not provide a body payload, because weight data is not accessible through the MyFitnessPal API.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"pU4Vfhi5bR7Nie6hiEUx","title":"Can I get raw uncalibrated CGM sensor values?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/raw-uncalibrated-cgm-not-available","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Terra does not provide access to raw or uncalibrated CGM sensor data.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"NekH8oVt9185eLxM8UF5","title":"Which regions does Keto-Mojo support?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/ketomojo-supported-regions","siteSpaceId":"sitesp_2ppMq","icon":"life-ring","description":"Ketomojo is supported in two regions: US and EU.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"jM6BH3wgZ70JP3NVLSbI","title":"Why are WHOOP sauna sessions missing from workout data?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/whoop-sauna-missing-no-strain","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"This is a WHOOP limitation, not a Terra one.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"HUoo1G2kKGwtQk9obNob","title":"Is Vald strength-testing data supported?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/vald-team-sports-beta-integration","siteSpaceId":"sitesp_2ppMq","icon":"life-ring","description":"Vald is supported and exposes test/measurement data.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"Cx1kFPu7UoOAkGwJSBft","title":"Do you support sleep data from COROS watches?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/coros-limited-sleep-detail","siteSpaceId":"sitesp_2ppMq","icon":"life-ring","description":"Sleep data is supported for COROS, but the COROS API only exposes very limited sleep information.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"J7yhQ5RfkOh0YO0MWEtz","title":"Can I get daily payloads for MapMyFitness and Strava?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/daily-payload-availability-aggregation","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Daily payloads aggregate values recorded both during and outside workouts, which only some providers expose.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"rY0rOoW5Ug8nrP1rj6pF","title":"Why does Garmin swim data show more laps than the app?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/garmin-swim-laps-vs-lengths","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"For Garmin swimming activities, the laps array is mapped from Garmin 'lengths' (one per pool length) rather than the laps the user marks on the watch, which is…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"FQ1HQdsWZU5GhEXVHzFa","title":"Which providers return MET minutes?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/met-minutes-provider-coverage","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"MET minutes availability depends on the source provider","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"SdpBW0UTgmEPPEsC7FC5","title":"How regular are SpO2 and HRV samples from watches?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/cgm-spo2-hrv-sample-regularity","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Sample regularity is determined by the device.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"49J7et26YhnoO15iVVMo","title":"Which smart scales have the most reliable data flow?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/smart-scale-reliability","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"WiFi-connected scales can be unreliable at uploading readings to the provider cloud, especially when users do not open the companion app.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"3GdjF5cit3XM1acxfXVd","title":"Is rr_interval_ms available for Fitbit?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/fitbit-rr-interval-not-exposed","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Fitbit does not expose raw inter-beat (RR) intervals through its HRV endpoint; it returns low-to-high frequency band ranges rather than IBI values directly, so…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"IJQG94hPyRRYHJhOyYaU","title":"Is Garmin hydration data exposed?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/garmin-hydration-not-provided","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Garmin does not provide hydration data, so hydration fields are null for Garmin users.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"f1d2uTlg58vMQygbtXxJ","title":"How do I get historic Garmin menstrual cycles?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/garmin-historical-menstruation-via-api-pull","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Historical menstruation data from Garmin is retrieved the same way as any other historical data: via the historical data-retrieval endpoints.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"8mdgmC1lMgJCDPtSlVM3","title":"Does the activity webhook include GPS and lap data?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/garmin-activity-gps-laps-location","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Activity payloads include","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"vT4CtBajyXdpr3cvB567","title":"Are Apple Health clinical records available?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/apple-health-clinical-records-unsupported","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Apple Health clinical health records are not currently supported through Terra.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"drMk6fax2sKK1cvBgc7A","title":"Why is bpm -1 in Apple heart rate samples?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/apple-bpm-minus-one-source-data","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"A bpm value of -1 typically originates from the source data in Apple Health, not from Terra processing.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"ITmMY4IB1h1gGfcO1usn","title":"Can I get detailed Apple workout routes, HR zones, laps?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/apple-detailed-workout-data-available","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Detailed Apple workout data is available wherever it also exists in Apple Health.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"onPQOX39e7Nf1ooyVqlN","title":"Do I get data events if a device isn't worn?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/no-data-when-device-not-worn","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"If a user stops wearing their device, no new data is generated, so you will not receive data events.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"aT0Ovvlkug5VrCvVCVw1","title":"Why does Polar Verity Sense send no daily or sleep data?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/session-only-devices-no-daily-sleep","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Some Polar devices, like the Verity Sense, are session-only sensors rather than all-day trackers, so they do not produce daily or sleep summaries.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"Yn8vuEFu2QK8QhbGSPS2","title":"Does Fitbit retrieve steps once daily or intraday?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/fitbit-intraday-step-frequency","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Terra uses Fitbit's intraday step endpoint, so step data is retrieved multiple times per day (roughly 10-20 times) via Fitbit webhooks rather than once daily.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"1jTFumZVlLIC9nTExzYW","title":"Why are Huawei heart rate samples once per minute?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/huawei-hr-downsampled-upstream","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Huawei's public Health Kit only exposes the com.huawei.instantaneous.heart_rate stream, stored at roughly one sample per minute, plus activity-level aggregate…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"bsmYYHEaN20k9XA7Hh7K","title":"How do I read partial field availability on the support page?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/support-page-partial-field-availability","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"On the wearable-data support page, a partial-support indicator means data may arrive from that device but not all fields will be populated.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"0JrUFN1Qt1NrdNd5Kje4","title":"Why are Garmin step samples empty but totals correct?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/garmin-step-samples-empty-epochs-webhook","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"This is expected Garmin behaviour.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"pxKUagyYrdnPq1V061pa","title":"Is Oura Ring 4 data accessible via Terra?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/oura-coverage-ring4-payloads","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Yes, Oura Ring 4 is fully supported.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"f1nfKhWw7O4Ws9vWYNlN","title":"Are Oura women's health features available?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/oura-womens-health-not-exposed","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Oura's Cycle Insights and menopause tracking are not available through the integration, because Oura does not expose those features via its third-party API.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"amJLwt2hVzV3PEf0SRn8","title":"Why are COROS sleep stages and sleep score missing?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/coros-sleep-stages-not-exposed","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"COROS's partner API does not expose sleep stages or a sleep score, so those fields cannot be delivered even though they appear in the COROS Training Hub UI.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"paulV495ra1w2MwaDvzI","title":"Why is Health Connect glucose missing timezone and device_data?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/health-connect-glucose-timezone-device-data","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"For Health Connect glucose, timestamps are sent as the UTC instant without a timezone suffix, so parse them as UTC and apply the user's timezone yourself.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"G1mymbap1E5JuXpGeC4K","title":"Why is Apple Health body composition data missing?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/apple-body-composition-fields-missing","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Apple Health does not have skeletal muscle mass or visceral fat as data types, so there is nothing to read or pass on for an Apple connection.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"VqSSvQZKbwiKDLEbV80q","title":"Can I compute HR zones from hr_samples?","pathname":"/faq/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/compute-hr-zones-from-samples","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"hr_samples from the Activity event are the right input for computing your own zones.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"3o0dsXDfOkg06HF7dATz","title":"Data model, fields and units","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Data model, fields and units","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"jmat0zSZSXXdRVh5pDeG","title":"Why are so many data fields null?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/null-fields-are-provider-dependent","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Null or empty fields almost always mean the provider's API does not expose that metric (even if it appears in their consumer app), not a Terra error.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"icUqXcNrjjDrsK4XQHfG","title":"Where do Garmin VO2 max and sleep score appear?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/garmin-metric-locations-in-data-model","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Garmin metrics are split across payload types, so inspecting only the daily webhook makes them look empty.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"fmcyk6nk0Wz2ieRbWGWb","title":"Where do I find field definitions and enum values?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/field-definitions-and-enum-lookup","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Full field-by-field definitions for every payload type are in the API reference data models section, and enum values like ActivityType are listed there too.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"8AFjJFy36G5H5fQyUxWJ","title":"Is the meal timestamp consumed time or logged time?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/nutrition-meal-timestamp-meaning","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"The meal timestamp reflects whatever the upstream provider returns.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"UP1Wlhf2XqFVHFrf2vTK","title":"Why is sleep duration shorter than the session window?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/sleep-duration-shorter-than-window","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Sleep state durations are computed from the hypnogram samples the provider returns.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"3vIhb2TI8rLP1lDxptiv","title":"Why doesn't activity end time equal start plus active seconds?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/activity-elapsed-vs-active-seconds","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"The two durations measure different things, so a mismatch is expected.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"I059NSd7cPBkt6K2DWYb","title":"What's the difference between resting and average HR in sleep?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/resting-vs-average-hr-scope","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"The two fields cover different scopes within the sleep session.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"gGWyfeP0OHs2nkI4fEMt","title":"Can I get data in imperial units instead of metric?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/units-metric-only-no-imperial","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"All data is normalised to the standard metric/SI units defined in Terra's data models, regardless of the end user's device or provider unit settings.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"9etYBg6rRnuBx7HkKY5a","title":"What units and scales do health and enrichment scores use?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/score-and-enrichment-units-scales","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Provider scores (activity, sleep, recovery) are unit-less values on a 1-100 scale, calculated by the providers themselves, so 'good' can differ between brands.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"cApMO9nDZq2kQIHn53G1","title":"What is the difference between body and daily payloads?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/daily-vs-body-payload-differences","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Daily and Body payloads cover different things, with some deliberate overlap.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"CRHdEbuYvt7I5CHdyIFH","title":"How do I build sleep stage charts from hypnogram samples?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/hypnogram-single-timestamp-reconstruction","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Yes, you can build a sleep stage chart from single-timestamp hypnogram samples.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"sDC4PKz4smkTKEpJOzoV","title":"Why is a webhook field not in the documented schema?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/schema-source-of-truth-extra-fields","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"The authoritative schema is the published OpenAPI specification in the public GitHub repository, and the REST API reference is the source of truth for field…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"gh0OSeErCtGdmwmHEM4x","title":"What's the difference between the three sleep scores?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/three-sleep-scores-explained","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"There are three sleep scores","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"cj9Pdp9FomghASo6WWDz","title":"Does inactivity_seconds include sleep?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/inactivity-seconds-includes-sleep","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"For providers that don't report inactive time directly (like Garmin), inactivity_seconds is computed as 24 hours minus active time.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"w1aIrt4pavnLTKdJAYy5","title":"What units is the sleep temperature delta in?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/temperature-delta-units","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"The temperature delta field in sleep payloads is in degrees Celsius.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"EOMz2ZsizpVM3Xlyuwe3","title":"Why isn't activity name one of the Terra activity enums?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/activity-name-vs-type-enum","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"metadata.name carries the user's custom activity title from the provider and can be any free-text string.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"8BUbem6uUgXGp9NOZTBD","title":"How does the net carbohydrates field work across providers?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/net-carbohydrates-field-and-provider-variance","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"The nutrition data model includes a macros.net_carbohydrates_g field even where the docs lag.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"AH5EdfMZcU7m2ivAIePz","title":"How do I explore the FHIR output format?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/fhir-format-documentation","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"To explore the FHIR format, switch a testing environment to FHIR processing and use the data generator to send sample payloads to your webhook.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"ua055mPBLhHDdMmn67gl","title":"Is the device-to-phone sync timestamp in the payload?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/sync-timestamp-not-exposed","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Terra does not store or expose the exact timestamp at which a wearable synced to its companion phone app.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"ohsfdl4GwVWTddmjzqK4","title":"What's in active durations and intensity buckets?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/active-durations-and-intensity-buckets","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"In Daily payloads, active_durations_data aggregates the whole day's activity","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"BjEhDgUm4NjWGBdJrvwY","title":"Are activity payloads standardised across providers?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/activity-model-standardized","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Terra standardises all activity data into a single unified Activity model regardless of provider, covering movement, heart rate, power, distance, calories and…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"L8uuIDb2gKPbJ1ux1zG5","title":"Does Terra smooth samples, and why do array lengths differ?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/no-smoothing-sample-array-length-mismatch","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Terra applies no smoothing or post-processing to sample data; values are piped through as the provider supplies them, so any smoothing you see is applied at…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"hOVk14WKwDyL15G02Y8g","title":"Are weight and body fat supported in body payloads?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/body-measurements-supported","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Body measurement data is supported in the body payload across all environments, including production.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"C3tDp6negVjmGlGbTdw0","title":"What is RR_INTERVAL and which devices stream speed?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/rr-interval-and-streaming-coverage","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"RR_INTERVAL is the time between two consecutive R-waves (R-peaks of consecutive QRS complexes), typically provided by chest and arm straps alongside heart rate.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"h2njwCaJWmgDjy8N5Mzf","title":"Why is a WHOOP activity mapped to the wrong type?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/activity-type-mislabel-defaults-to-other","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Activity type mislabelling usually stems from the provider sending a generic or unmapped type code, which Terra maps to a default.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"KleCgMXjDu1nIo7N3Cco","title":"Is visceral_fat_level a percentage?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/visceral-fat-level-units","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"visceral_fat_level is the raw numeric index passed through from the scale device.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"voiEEAuz26jtG8uCFQ7A","title":"What does the timestamp_localization metadata field mean?","pathname":"/faq/help-topics/data-api-sdk/data-model-fields-and-units/metadata-field-meanings","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"The timestamp_localization field in payload metadata indicates whether the provider's timestamps are truly localized","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"3FbrJkdRUfNGFqsxbL8Q","title":"Authentication, users and connection state","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Authentication, users and connection state","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"cjmqQs1FgMu1MpxEOQDM","title":"How do I deauthenticate users in bulk?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/deauthenticate-users","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"To disconnect a specific user, call /auth/deauthenticateUser with the user's user_id (this is API-only, not available in the dashboard).","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"ZsdqRmWqb3DWYvmM3omn","title":"Why are there multiple Terra users for one reference_id?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/multiple-terra-users-per-reference-id","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"A single provider account maps to exactly one Terra user.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"nQl7qpPvoc793ECx3bTI","title":"How do I detect whether a user connected a wearable?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/detect-connection-and-list-users","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Use the /userinfo endpoint, optionally filtering by your reference_id, to list a user's connections and all associated user_ids.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"2GhIKxYB3VyhCUcegjKB","title":"Why are multiple user_ids created for one reference_id?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/user-uniqueness-reference-id","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"Each Terra user_id represents a single user-provider connection, and every data request is scoped to one user_id (one call returns one provider's data).","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"a0PYk7jh7ljAFmndSC0s","title":"Why does getUserId return null after init?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/verify-connection-getuserid-not-checkauth","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"checkAuth is deprecated and only returns a boolean with no error context.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"igFm3KhdWTL4EX3lVYPM","title":"How do I detect an existing native SDK connection?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/detect-existing-connection-disconnect","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Use the mobile SDK's getUserId function for the connection type to detect an existing native connection.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"kvFuqmPJutmvVKnM0UIL","title":"How do I start user authentication?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/auth-flow-start","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"There are two ways to authenticate users","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"Iu9sa22qfm8I6Ci2jRkQ","title":"Can I share one reference_id across multiple users?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/reference-id-uniqueness-per-user","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Sharing a single reference_id across multiple end users is not supported.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"hBpGhOrQ5Wazm3f1ctZe","title":"How do I get a user's MyFitnessPal username from user_id?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/get-provider-username-via-athlete","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"Call the Athlete endpoint to get the provider-side username from a Terra user_id","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"R5GI5yYTmLd3ya4qGEj6","title":"How do I verify a connection with userInfo?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/userinfo-verification-flow","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Verify a connection by calling GET /v2/userInfo with the user_id taken from the user.user_id field of the auth_success webhook payload, not the widget redirect…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"ZZAVRP3baNaXz3h223iL","title":"What triggers an Omron deauth event?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/omron-deauth-event-trigger","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"An Omron deauth webhook is triggered by a call to the /deauthenticateUser endpoint, which fires this event.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"RHMvn8uMfWABReYzw9FO","title":"Why no new auth event when Apple Health reconnects?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/apple-no-auth-event-on-reconnect","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"This is expected behaviour.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"FFqT6gRqgrXAkTnm1hpC","title":"Why does InBody error that the API version is unsupported?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/expired-auth-link","siteSpaceId":"sitesp_2ppMq","icon":"triangle-exclamation","description":"A required components unavailable on your version error is often not a version problem at all, but an artifact of an expired authentication link.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"lDmue5BjTyYopkXmggtH","title":"Can I get the provider OAuth tokens Terra holds?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/provider-oauth-tokens-not-exposed","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Terra cannot expose the provider OAuth tokens it manages.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"lzSSzu04lvwZ1jYEAeQs","title":"Is there a pending state or timeout for initConnection?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/initconnection-no-pending-state","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"initConnection creates the connection synchronously on Terra's backend, so there is no lingering 'pending' state.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"EmnnCqKrJ1fZaz9vfB2I","title":"Can providers connect without the widget?","pathname":"/faq/help-topics/data-api-sdk/authentication-users-and-connection-state/widget-optional-direct-api-auth","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"The widget is a convenience for the front-end auth flow, not a requirement.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Authentication, users and connection state","icon":"code"}]},{"id":"FTkZvSfRYC52bGvWoGMh","title":"API endpoints, errors and migrations","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"API endpoints, errors and migrations","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"rpwSTU5P0Cw2yiZUAsAk","title":"Why does the GET API return 200 with no data array?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/to-webhook-default-and-empty-response","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"By default, data GET requests use to_webhook=true, so data is delivered asynchronously to your configured webhook and the immediate response contains only user…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"nPhWfVguBKRYrsIwutjf","title":"Should I migrate to the access.tryterra.co endpoint?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/migrate-to-new-api-infrastructure","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"If you received the migration email, switch REST requests to the new base URL https://access.tryterra.co/api/v2.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"XNYOg9rpLsQuQhPS5QkR","title":"Why do I get a 400 connection does not support data type error?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/unsupported-data-type-per-provider","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"A 400 connection does not support requested data type means the connected provider does not offer that data type.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"kRdRjj7fcPWV44na8VMM","title":"Why am I getting a 403 on generateWidgetSession?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/rate-limits-and-no-bans","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"A 403 on this endpoint is usually a configuration or scope issue, not an account block.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"HnMkhTrDWQyuIbX0n8qH","title":"Why does the API return \"Request is processing\" instead of data?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/garmin-async-processing-and-cache","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"For some providers (notably Garmin), the first REST request for a given period returns Request is processing, try again later while the data is fetched…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"LRT5uKkFGRJMK3akcrIu","title":"Why does authenticateUser fail for some provider names?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/sdk-vs-web-providers","siteSpaceId":"sitesp_2ppMq","icon":"triangle-exclamation","description":"Providers marked setup: 'SDK' in /v2/integrations/detailed (Apple Health, Google Fit / Health Connect) cannot be used with /v2/auth/authenticateUser, which is…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"dlH5OIcAWN82vrcniFVH","title":"Is the JavaScript SDK deprecated?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/js-sdk-deprecation-backend-sdk-versions","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"The legacy JavaScript npm package still functions but no longer receives updates and was removed from the docs.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"HgW8dPF2pXpjxbLOU50I","title":"Why does generateWidgetSession return a 500?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/widget-session-providers-string-format","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"For generateWidgetSession, the providers field must be a single comma-separated string (for example, \"GARMIN,FITBIT,OURA\"), not a JSON array or list.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"woNiaFr0Fdbdl8CR0oLn","title":"Why does a Hevy activity pull return 404?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/hevy-unsupported-data-type-404","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Some providers only support a subset of data types.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"BJmjoU5Ch8ekganxnL36","title":"Why do some auth URLs error out?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/auth-url-errors","siteSpaceId":"sitesp_2ppMq","icon":"triangle-exclamation","description":"If an integration is absent from the supported-integrations list in the docs, it has likely been deprecated.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"wmWwV8nnT5fnmYgedi2k","title":"How do I migrate WHOOP from V1 to V2?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/whoop-v1-to-v2-migration","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"To move from WHOOP API V1 to V2, change the webhook endpoint version from V1 to V2 in the WHOOP developer dashboard.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"NOEgdINNMczKAfsxKvrI","title":"Where did the activity type enum docs move?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/garmin-enum-docs-moved","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"The activity type enums documentation moved during the docs reorganisation and now lives in the API reference section of the docs.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"SqURUeGRmfM1BLdVfQYw","title":"Why is the OpenAPI spec docs link broken?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/openapi-spec-link-broken","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"If the OpenAPI specification page link is broken, the spec is also published in Terra's public openapi GitHub repository, which you can use in the meantime.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"eLvDHa1AsytHz9OlsWpX","title":"How do I delete lab report uploads?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/data-deletion-via-ticket","siteSpaceId":"sitesp_2ppMq","icon":"trash","description":"Lab report / upload deletion is currently handled by opening a support ticket.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"PHnNMB1B9IUEPP4NuHS9","title":"Why does Team API create-coach return an invalid token error?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/token-casing-self-resolved","siteSpaceId":"sitesp_2ppMq","icon":"key","description":"An invalid-token or region error on Team API create-coach can be caused by incorrect casing in the token.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"SKEw1BSgtDQNcOFpFXHR","title":"Why does authenticateUser return a malformed request body error?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/request-body-strict-typing","siteSpaceId":"sitesp_2ppMq","icon":"triangle-exclamation","description":"A malformed request body error usually means a field is the wrong type, for example reference_id must be a string, not an integer.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"fKW5QjCYupOtrYMFI5uo","title":"Why does /activity return invalid user id after auth?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/environment-mismatch-invalid-user-id","siteSpaceId":"sitesp_2ppMq","icon":"triangle-exclamation","description":"An invalid user id error on a user that looks authenticated usually means the request credentials belong to a different environment than the user.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"mVXQs01L1UPRb5hSPvOA","title":"Why does the duplicate-workout-name error differ by provider?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/provider-error-string-normalisation","siteSpaceId":"sitesp_2ppMq","icon":"triangle-exclamation","description":"Error detail strings differ across providers because Terra normalises some providers' error conditions into a consistent message, while passing others through…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"BqV5kEtPzwpZJDJ3LQoa","title":"How do I point the terra-api npm client at the new endpoint?","pathname":"/faq/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/npm-client-custom-baseurl-new-endpoint","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"You can route to the new direct endpoint today, without waiting for a package release, by passing a custom baseUrl to the SDK client constructor (set it to the…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"API endpoints, errors and migrations","icon":"code"}]},{"id":"YhWtYFwHMAhK1X1yXAgC","title":"Historical data and backfill","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Historical data and backfill","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"BIR3pxVRJ7qSC7TdPkyR","title":"Why does Apple Health backfill return empty arrays?","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill/apple-health-sdk-backfill","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"Apple Health data lives on the device, so historical data cannot be backfilled through the web/REST API.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"tw6hglbQm0LV2isaKnyw","title":"Why does a historical fetch return a 504 timeout?","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill/historical-fetch-size-timeouts-504-413-500","siteSpaceId":"sitesp_2ppMq","icon":"triangle-exclamation","description":"Large synchronous historical pulls (to_webhook=false) can exceed the response-size limit or the ~30s gateway timeout, returning 504 / 413 / 500, especially…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"N7ZAzPqwpMOMvKrv6dr9","title":"Why am I hitting rate limits during a backfill?","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill/provider-rate-limits-backfill","siteSpaceId":"sitesp_2ppMq","icon":"triangle-exclamation","description":"A 429 carrying a provider rate-limit message means the upstream provider's per-user quota is exhausted, not a Terra limit.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"Usq1qUxJd8GAXFMSv6oj","title":"When is historical data available after connect?","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill/mobile-native-no-backfill-sdk-fetch","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Mobile-native sources read from data stored on the user's phone, not a cloud history.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"YqAVCfGBHe2E7aLCsdNT","title":"Can the SDK retrieve historical data, and over what period?","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill/sdk-backfill-historical-retrieval","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"SDK-provider data can flow automatically once a user connects, if the scheduler is on.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"VN65prEKWiknZ9AOGHJh","title":"Why did old Garmin payloads arrive without my request?","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill/garmin-unrequested-historical-payloads","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"This is expected behaviour given Garmin's API design, not an error on your side.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"Ab4eRUCaa7pJxabw2DpX","title":"How do CGM glucose webhook payloads work?","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill/cgm-glucose-body-payload-delivery-history","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Payload structure: each body payload contains all glucose samples for a given calendar date in the user's local timezone, and updates are supersets of previous…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"PwOahtJFV6QRFEyekp0n","title":"Can I default Garmin historical data permission on?","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill/garmin-historical-data-permission-off-default","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"Historical data permission is off by default for Garmin connections and cannot be changed.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"k39eEIMA0QsGuuNjB6TO","title":"Why is a workout timestamp weeks in the past?","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill/apple-late-historical-workout-timestamps","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Workout timestamps reflect when the activity was originally performed, not when it was synced.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"WMVUeCQFTI6CxViUU8PU","title":"Can I see the COROS historical-consent choice?","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill/coros-historical-consent-not-surfaced","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"The COROS historical-data consent prompt is shown during their OAuth flow, but COROS does not return the user's choice in the token response, so Terra cannot…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"3zqd7XoXjJB6K8HbNGRe","title":"Are there limits on Wahoo backfill requests?","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill/wahoo-backfill-no-rate-limit","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"We are not currently aware of specific rate limits on Wahoo workout backfill requests, but provider behaviour can change.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"IG3sf0CJu6Tkgp6uW4bK","title":"How do I detect backfill completion with S3 destinations?","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill/s3-reference-id-and-backfill-completion","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"reference_id is only populated if you pass it when connecting users (in the widget session or the generateAuthToken call); otherwise it is null.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"gnBEFCfDNUPsnOZ95yBY","title":"Why isn't the backfill / Sync Now button working?","pathname":"/faq/help-topics/data-api-sdk/historical-data-and-backfill/historical-date-param-format","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"When triggering a historical pull or backfill, the start and end date parameters must be a plain date (YYYY-MM-DD), not a full ISO timestamp with time and…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"XR4WFoyLfjeUOHBjbqrC","title":"Account config, environments and going live","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Account config, environments and going live","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"50b70m50pJxd7ISVZxVY","title":"What does 'user limit reached' mean in testing?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/test-staging-user-limit","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"Testing and staging environments have a fixed cap on connected users each.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"EriWNQgIOrc6dpsR9Lvs","title":"Can samples be enabled per provider instead of globally?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/samples-gps-config","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"The account-wide samples toggle for webhooks cannot be set per provider.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"7kyYLLc3DJ3OzgEj67xu","title":"Why does the API return a no-permissions error for a data type?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/scopes-permissions-config","siteSpaceId":"sitesp_2ppMq","icon":"triangle-exclamation","description":"The error You do not have permissions for this data category usually means that data type is disabled in your dashboard configuration.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"1uJg3EjNHadsVjLyJ9xB","title":"How does the 2026 Google Fit deprecation affect me?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/google-fit-2026-deprecation","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Terra's 'Google Fit' provider is implemented via the mobile SDK reading from Health Connect on-device, not the deprecated Google Fit REST API, so it is already…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"FD78qrPtMwrmAotfARGe","title":"How do I get a sandbox or test account for QA?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/test-tooling-and-sandbox","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"Here's the tooling for QA testing","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"aKzOIVbiN4d5lFtsKfp2","title":"What extra steps are needed to go to production?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/go-live-no-approval-needed","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"No additional validation or approval from Terra is required to go to production.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"bLbwgm2NDrKZ8Hal6Ev0","title":"Do I need my own Strava API app?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/strava-own-app-and-quota","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"Register your own Strava API app to get a dedicated rate-limit bucket separate from other Terra customers.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"8KCY1f0KdhfN9l1WGNGQ","title":"Why is the scopes field empty for on-device connections?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/samsung-empty-scopes-field","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"For SDK-based on-device connections, the scopes field is informational and used mainly for debugging, so it can be empty without affecting data flow.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"uHtBa3R9YMtOv2rqYQNQ","title":"Does disabling a provider disconnect connected users?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/disabling-provider-keeps-connections","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Disabling a provider in your dashboard does not deauthenticate users who already connected.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"0A661XD3TfA3ERzVFXFC","title":"Which providers show data-type toggles during auth?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/auth-scope-toggles-and-sync-behavior","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Whether end users see toggles to choose which data types to share is provider-specific","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"eXs3BSmtCaQwdQFedYJ9","title":"How do I meet Garmin's brand attribution requirement?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/garmin-brand-attribution-requirement","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Garmin's brand guidelines require that users can clearly see when displayed data originates from Garmin devices.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"PvPFuKvOVYuRCkg1exAk","title":"How do I handle the Fitbit-to-Google migration?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/fitbit-to-google-migration","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"For the Fitbit-to-Google account migration, keep using the Fitbit connection for both new and existing users.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"AZiCQL9jSdO776M1y9t6","title":"Can the payload simulator send FIT files?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/payload-simulator-fit","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"The payload simulator follows your account's processing format.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"VvB5aZ8pPFkgXUBUbcYe","title":"Why am I hitting the staging user limit?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/expo-duplicate-test-users-staging-limit","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Expo can regenerate device IDs during development, which creates duplicate test users and can exhaust the staging user limit.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"IwRpEI5il3RVdT7dpAfJ","title":"How do I handle VAPT findings against the SDK?","pathname":"/faq/help-topics/data-api-sdk/account-config-environments-and-going-live/vapt-security-findings-on-sdk","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Common VAPT findings on the SDK, and how to handle each","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Account config, environments and going live","icon":"code"}]},{"id":"4lpuFS7WsLVdg64taG79","title":"Realtime streaming and BLE","pathname":"/faq/help-topics/data-api-sdk/realtime-streaming-and-ble","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Realtime streaming and BLE","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"G8irbAms0uJ7YCzR8q9q","title":"Which providers support real-time streaming?","pathname":"/faq/help-topics/data-api-sdk/realtime-streaming-and-ble/streaming-api-capabilities-devices","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"Terra's real-time Streaming API (Real-Time SDK / TerraRT) only works with devices that broadcast continuously over BLE or ANT+, for example certain…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Realtime streaming and BLE","icon":"code"}]},{"id":"MCO4KT1pkSKcO0z34G3O","title":"Why does BLE realtime throw 'no supported characteristics'?","pathname":"/faq/help-topics/data-api-sdk/realtime-streaming-and-ble/ble-realtime-supported-devices","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Real-time BLE streaming only works with devices that broadcast over a recognised standard BLE characteristic (for example heart rate).","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Realtime streaming and BLE","icon":"code"}]},{"id":"p0NGvcaUthxYYrejwM3E","title":"Why does realtime streaming return success but no events?","pathname":"/faq/help-topics/data-api-sdk/realtime-streaming-and-ble/realtime-streaming-ble-broadcast-required","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Real-time streaming only works with devices that actively broadcast heart rate over BLE.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Realtime streaming and BLE","icon":"code"}]},{"id":"NREfaekCA2GBG1pR0BG6","title":"Can Garmin watches stream heart rate over BLE in real time?","pathname":"/faq/help-topics/data-api-sdk/realtime-streaming-and-ble/realtime-ble-streaming-capabilities","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Real-time streaming via TerraRT works only for the metrics a device actually broadcasts over BLE.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Realtime streaming and BLE","icon":"code"}]},{"id":"Due6eH6LteJCy43HeGZB","title":"How do I make Apple Watch streaming work from Flutter?","pathname":"/faq/help-topics/data-api-sdk/realtime-streaming-and-ble/apple-watch-streaming-watchos-companion","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Apple Watch streaming requires a separate watchOS companion target, managed natively in Xcode and written in Swift, even when the main app is Flutter or React…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Realtime streaming and BLE","icon":"code"}]},{"id":"gzWqVs1AGn2GCSE2dEqz","title":"Why does iOS realtime streaming fail TestFlight upload?","pathname":"/faq/help-topics/data-api-sdk/realtime-streaming-and-ble/ios-streaming-info-plist-bluetooth-keys","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"iOS realtime streaming needs Bluetooth (and optionally Motion) usage-description keys in Info.plist so permissions are requested at first launch and submission…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Realtime streaming and BLE","icon":"code"}]},{"id":"CP0s5IJw0X89gIieCAUz","title":"How do I keep BLE streaming alive when iOS is backgrounded?","pathname":"/faq/help-topics/data-api-sdk/realtime-streaming-and-ble/realtime-keep-alive-backgrounded-ios","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Continuous websocket realtime streaming cannot run while the iOS app is backgrounded.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Realtime streaming and BLE","icon":"code"}]},{"id":"iglOEZQCk6xAJxWlktEt","title":"How do I test realtime streaming without a wearable?","pathname":"/faq/help-topics/data-api-sdk/realtime-streaming-and-ble/test-realtime-without-wearable-phone-sensors","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"The data generator/simulator does not yet support realtime streaming simulation, it covers the Unified API and mobile SDK only.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Realtime streaming and BLE","icon":"code"}]},{"id":"lLNopOoS7gJxGHFAOjU8","title":"Why does my watch streaming session hang?","pathname":"/faq/help-topics/data-api-sdk/realtime-streaming-and-ble/terra-instance-singleton-watch-hang","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"If a TerraRT streaming session hangs and stopExercise callbacks never fire, check whether the Terra() instance is being created more than once (for example…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Realtime streaming and BLE","icon":"code"}]},{"id":"2Va10l4Z63zU5vVuewYU","title":"Extra features: scores, graphs, teams, nutrition, CGM","pathname":"/faq/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Extra features: scores, graphs, teams, nutrition, CGM","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"MboHXIqpwMObfqWphaSD","title":"Why are data_enrichment health scores null?","pathname":"/faq/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/health-scores-data-enrichment-null","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Terra Health Scores under data_enrichment are gated by input-metric availability, not by provider, and there are several reasons they come back null","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Extra features: scores, graphs, teams, nutrition, CGM","icon":"code"}]},{"id":"04T9gZIgiUT9nHpA4P8Z","title":"How do I dedup updated vs new meals across nutrition webhooks?","pathname":"/faq/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/nutrition-meals-upsert-no-stable-id","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Treat meals within a nutrition payload like samples, not ID-dependent records.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Extra features: scores, graphs, teams, nutrition, CGM","icon":"code"}]},{"id":"p2JQKQOMSocL9vFMOIR3","title":"Is the Teams API available and how do I use it?","pathname":"/faq/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/teams-api-beta","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"The Teams API is in semi-public beta ahead of full release, and is webhook-based.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Extra features: scores, graphs, teams, nutrition, CGM","icon":"code"}]},{"id":"DRbS5j35BEstuCoMgOUJ","title":"How do I implement the Health Rewards feature?","pathname":"/faq/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/rewards-and-health-scores","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"Health Rewards has no dedicated data-collection API endpoints in the webhook model.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Extra features: scores, graphs, teams, nutrition, CGM","icon":"code"}]},{"id":"4MOKmvotN6tdAjWOqv3K","title":"How do I use the Graph API to display per-user data?","pathname":"/faq/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/graphs-feature","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"The Graph API generates per-user charts (sleep, HR, steps, glucose and more).","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Extra features: scores, graphs, teams, nutrition, CGM","icon":"code"}]},{"id":"KzQLqM4MY5dYOZp7xvMW","title":"Can I send workouts to Apple, Garmin and COROS watches?","pathname":"/faq/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/planned-workout-push-to-watch","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Pushing a workout to a watch is exactly what the Planned Workouts API is for: define a structured workout as a template, then schedule it to a user and it…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Extra features: scores, graphs, teams, nutrition, CGM","icon":"code"}]},{"id":"0AYZjEi33PHIHW1stq8w","title":"How do Garmin planned workouts handle completion and updates?","pathname":"/faq/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/garmin-planned-workout-lifecycle","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"Terra's Garmin planned-workout adapter uses Garmin's Workout Schedule endpoint.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Extra features: scores, graphs, teams, nutrition, CGM","icon":"code"}]},{"id":"YF0s4F4kCBN6cNJzEiYe","title":"Why do nutrition provider activity events have null summary_id?","pathname":"/faq/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/nutrition-provider-null-activity-events","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Some nutrition-focused providers (for example, Nutracheck) do not supply a summary ID or accurate start/end times for workouts, so their activity payloads can…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Extra features: scores, graphs, teams, nutrition, CGM","icon":"code"}]},{"id":"R6A57TcfQE4SzQJxwMVr","title":"Can I look up food details from the nutrition meal id?","pathname":"/faq/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/nutrition-meal-name-null-id-not-lookupable","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"The meal id in a nutrition payload is a provider-specific passthrough identifier and cannot be looked up via the API to retrieve food details.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Extra features: scores, graphs, teams, nutrition, CGM","icon":"code"}]},{"id":"KWYaq8pcm0Jak8F43Ggg","title":"Which hosted graph session types exist?","pathname":"/faq/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/custom-hosted-graph-session-types","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Only some metrics have named hosted graph session types (for example SLEEP_HRV_SUMMARY, SLEEP_RESPIRATORY_RATE_SUMMARY).","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Extra features: scores, graphs, teams, nutrition, CGM","icon":"code"}]},{"id":"51w1zYfrApWew5JcSU6q","title":"My data isn't arriving","pathname":"/faq/help-topics/no-data","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Data not showing up, stopped, delayed, or missing from payloads.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"}]},{"id":"nmzcRaYs57yK5ncgMM6A","title":"Connected but no data arriving","pathname":"/faq/help-topics/no-data/connected-but-no-data-arriving","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Connected but no data arriving","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"}]},{"id":"hCtPSxqsEfrhBK9dlsQE","title":"Why is no Samsung Health data syncing after I connected?","pathname":"/faq/help-topics/no-data/connected-but-no-data-arriving/samsung-healthconnect-sdk-pull-required","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Samsung Health is a mobile-SDK integration read through Health Connect (Samsung writes into Health Connect, the SDK reads from there), so there is no…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connected but no data arriving","icon":"wifi-slash"}]},{"id":"PPsCqIWwhrWGVNHJmlMR","title":"Why does my Huawei connection send no data?","pathname":"/faq/help-topics/no-data/connected-but-no-data-arriving/huawei-permissions-and-toggles-required","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Huawei connecting without data almost always traces to a permission or toggle on the user's side, or missing key scopes.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connected but no data arriving","icon":"wifi-slash"}]},{"id":"V9wGrpcpVlD7WpcauR7J","title":"Is there a more reliable Samsung Health connection path?","pathname":"/faq/help-topics/no-data/connected-but-no-data-arriving/samsung-direct-route-recommended","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"When Samsung via Health Connect is unreliable, the recommended path is Terra's direct Samsung Health route, which does not require Health Connect and delivers…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connected but no data arriving","icon":"wifi-slash"}]},{"id":"jSpZwVDUOvxqY6O5URLZ","title":"Why isn't my Renpho body measurement data showing up?","pathname":"/faq/help-topics/no-data/connected-but-no-data-arriving/renpho-legacy-accounts-only","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"The Renpho integration currently supports end users on older (legacy) Renpho accounts.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connected but no data arriving","icon":"wifi-slash"}]},{"id":"34J4PWp7OAqsuq2CgSwB","title":"What does google_no_datasource mean?","pathname":"/faq/help-topics/no-data/connected-but-no-data-arriving/google-fit-no-datasource","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"The google_no_datasource warning means Terra connected to the Google account but found no fitness data sources.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connected but no data arriving","icon":"wifi-slash"}]},{"id":"I7k44mQ0TjX9VZNOSmY2","title":"Why are Garmin/Samsung datasets empty?","pathname":"/faq/help-topics/no-data/connected-but-no-data-arriving/wrong-provider-account-connected","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Empty datasets often mean the user connected the wrong provider account.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connected but no data arriving","icon":"wifi-slash"}]},{"id":"KaK55rYOWZa140rku4od","title":"Why is my payload history empty?","pathname":"/faq/help-topics/no-data/connected-but-no-data-arriving/empty-payload-history-no-cloud-data","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"An empty payload history usually means the connected user has no new data synced to the provider's cloud for that period, not a Terra delivery failure.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connected but no data arriving","icon":"wifi-slash"}]},{"id":"c3SQw0wY5kd78W5z4M3m","title":"Why does my Fitbit data look wrong or barely match the Fitbit app?","pathname":"/faq/help-topics/no-data/connected-but-no-data-arriving/fitbit-wrong-account-connected","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The most common cause is that a different Fitbit account was connected than the one holding the user's data.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connected but no data arriving","icon":"wifi-slash"}]},{"id":"35FZEydwK4FcmUDEnyOq","title":"Webhooks & background delivery stopping","pathname":"/faq/help-topics/no-data/webhooks-background-delivery-stopping","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Webhooks & background delivery stopping","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"}]},{"id":"HFBT2JqJ2oZcowc0xkRF","title":"How do I enable Apple Health background delivery?","pathname":"/faq/help-topics/no-data/webhooks-background-delivery-stopping/apple-health-background-delivery-not-configured","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Apple Health flows from the on-device SDK to Terra's servers; there is no server-side pull, so a server-side GET /v2/{data_type}?to_webhook=true only returns…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Webhooks & background delivery stopping","icon":"wifi-slash"}]},{"id":"Jx2muPaR3UIrVnCVFGkG","title":"Why does WHOOP only deliver data on manual pull?","pathname":"/faq/help-topics/no-data/webhooks-background-delivery-stopping/whoop-webhook-v2-and-byoc-config","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"If WHOOP data arrives only on manual pull but not automatically, the issue is the webhook configuration in the WHOOP developer portal, not your own endpoint.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Webhooks & background delivery stopping","icon":"wifi-slash"}]},{"id":"N7HZa4dCARbkKGyx7KeY","title":"Why is Apple Health syncing infrequently?","pathname":"/faq/help-topics/no-data/webhooks-background-delivery-stopping/apple-health-sync-frequency-and-stalls","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Apple Health sync frequency is controlled by iOS, which pings the app to deliver new data only when there is new data and sufficient device resources.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Webhooks & background delivery stopping","icon":"wifi-slash"}]},{"id":"dVrKPKoz16E7YlOuFpVo","title":"Why am I getting auth but no Health Connect data webhooks?","pathname":"/faq/help-topics/no-data/webhooks-background-delivery-stopping/healthconnect-no-background-delivery","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Whether Health Connect data flows automatically after authentication depends on the scheduler.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Webhooks & background delivery stopping","icon":"wifi-slash"}]},{"id":"brZJagu5EdA4qvgzSFm7","title":"How are background sync gaps and payload size handled?","pathname":"/faq/help-topics/no-data/webhooks-background-delivery-stopping/background-sync-gaps-and-payload-chunking","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Background sync gaps are usually end-user-side: the wearable hasn't synced to its app, battery-saving mode is on, or (for mobile SDKs) background refresh is…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Webhooks & background delivery stopping","icon":"wifi-slash"}]},{"id":"kkFFqJmEkxEMmrlu1eDr","title":"What's the recommended delivery method?","pathname":"/faq/help-topics/no-data/webhooks-background-delivery-stopping/upgrade-api-version-for-delivery","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Delivery instability is generally not specific to a destination like Firebase.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Webhooks & background delivery stopping","icon":"wifi-slash"}]},{"id":"llf95djnf5GKiKl7CbRF","title":"Why do Samsung users lose sync after the app sits idle?","pathname":"/faq/help-topics/no-data/webhooks-background-delivery-stopping/samsung-background-battery-sync-loss","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"On Samsung devices, both Health Connect and your app must stay alive in the background for sync to continue.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Webhooks & background delivery stopping","icon":"wifi-slash"}]},{"id":"J16vziCMbCOaVJOYibby","title":"Connections expiring & disconnecting","pathname":"/faq/help-topics/no-data/connections-expiring-disconnecting","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Connections expiring & disconnecting","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"}]},{"id":"HhpHZzbcmK9auH2GzImE","title":"How do I fix a Whoop 'authorization expired' error?","pathname":"/faq/help-topics/no-data/connections-expiring-disconnecting/authorization-expired-user-reconnect","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"An 'Authorization expired, please reauthorize with the data provider' error means the provider-side token is no longer valid, usually because the end user…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connections expiring & disconnecting","icon":"wifi-slash"}]},{"id":"fh0JSy6Tr7GkSSYxiFuB","title":"How do I handle silent mobile disconnects?","pathname":"/faq/help-topics/no-data/connections-expiring-disconnecting/silent-mobile-disconnect-reinit","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Silent disconnects mainly affect mobile-based integrations like Apple Health and Health Connect.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connections expiring & disconnecting","icon":"wifi-slash"}]},{"id":"3443HQSqhgX5MUqghPbG","title":"How do I detect expired user connections?","pathname":"/faq/help-topics/no-data/connections-expiring-disconnecting/detect-expirations-via-webhooks-not-polling","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"To check whether a single connection is still valid, make a data request.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connections expiring & disconnecting","icon":"wifi-slash"}]},{"id":"82Ipyy0ecvAHBZ8Uab6I","title":"How do I disconnect a user?","pathname":"/faq/help-topics/no-data/connections-expiring-disconnecting/how-to-disconnect-delete-connection","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Disconnecting a user is handled backend-side, not in the mobile SDK and not from the dashboard.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connections expiring & disconnecting","icon":"wifi-slash"}]},{"id":"JtLMjkrqUxDnkrHcC03k","title":"Why is a user's Garmin activity missing with no webhook?","pathname":"/faq/help-topics/no-data/connections-expiring-disconnecting/garmin-user-revoked-access","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"A sudden, user-specific Garmin cutoff almost always means the user revoked access in Garmin Connect (Settings Connected Apps).","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connections expiring & disconnecting","icon":"wifi-slash"}]},{"id":"5N8LGvzK8Q2QBA65Kor0","title":"Why does my Withings fetch return a failed dependency error?","pathname":"/faq/help-topics/no-data/connections-expiring-disconnecting/withings-upstream-error-reconnect","siteSpaceId":"sitesp_2ppMq","icon":"triangle-exclamation","description":"A failed dependency / 502 on a Withings fetch means Withings' API returned an error on Terra's request, usually temporary downtime, revoked auth, or an account…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connections expiring & disconnecting","icon":"wifi-slash"}]},{"id":"dfpqX6kGRlD4uBTStsC9","title":"What causes a Fitbit DEAUTH event?","pathname":"/faq/help-topics/no-data/connections-expiring-disconnecting/fitbit-shared-oauth-deauth-second-app","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Fitbit allows only one active authorisation per user, so connecting the same Fitbit account through a second app revokes the first connection and fires a…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connections expiring & disconnecting","icon":"wifi-slash"}]},{"id":"KEIjOrczpGthmm1Hyhcn","title":"Historical backfill returns nothing","pathname":"/faq/help-topics/no-data/historical-backfill-returns-nothing","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Historical backfill returns nothing","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"}]},{"id":"htFEURnpkd1UutXoBbvS","title":"Why does Polar return no historical data?","pathname":"/faq/help-topics/no-data/historical-backfill-returns-nothing/polar-no-pre-auth-history-and-manual-excluded","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"Polar's API does not allow retrieving data recorded before the user authenticated, and historical retrieval is limited to roughly 30 days back from the…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Historical backfill returns nothing","icon":"wifi-slash"}]},{"id":"X2nMqT78FRoTV7ZJXKU3","title":"Can Terra backfill historical Samsung Health data?","pathname":"/faq/help-topics/no-data/historical-backfill-returns-nothing/samsung-sdk-no-backfill-or-historical-recovery","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"Samsung Health data comes from the device via Health Connect, not a cloud API, so there is no server-side endpoint to resend or backfill historical days.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Historical backfill returns nothing","icon":"wifi-slash"}]},{"id":"H4D03S4QM1lN1BBJFF8S","title":"Why is Garmin historical backfill returning empty?","pathname":"/faq/help-topics/no-data/historical-backfill-returns-nothing/garmin-historical-export-toggle-off","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"Garmin historical retrieval requires the historical-data sharing option to be granted on Garmin's consent screen, which can default to OFF (and was defaulted…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Historical backfill returns nothing","icon":"wifi-slash"}]},{"id":"Zvb4zx3LIABVDHfBbaTN","title":"Why does my Garmin backfill return empty payloads?","pathname":"/faq/help-topics/no-data/historical-backfill-returns-nothing/garmin-async-empty-then-bursts","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"Garmin delivers historical data asynchronously, so a backfill request can return success (Data sent to destination) with initially empty payloads, then data…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Historical backfill returns nothing","icon":"wifi-slash"}]},{"id":"hXflyL4LWgUwmvJXJlcx","title":"Why does Apple Health backfill return empty for a date range?","pathname":"/faq/help-topics/no-data/historical-backfill-returns-nothing/apple-health-historical-access-restricted","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"When a user first authorizes a new app for HealthKit, iOS may restrict access to some historical data even though the Health app shows it.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Historical backfill returns nothing","icon":"wifi-slash"}]},{"id":"ValYL8j7R7v6af31ev55","title":"Why does Coros backfill return nothing?","pathname":"/faq/help-topics/no-data/historical-backfill-returns-nothing/coros-limited-history-and-native-only","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"Both behaviours are provider-side limitations on Coros, not Terra.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Historical backfill returns nothing","icon":"wifi-slash"}]},{"id":"lF6m0o4EvPF6UglD8yPM","title":"Can I backfill missing historical data?","pathname":"/faq/help-topics/no-data/historical-backfill-returns-nothing/historical-backfill-endpoints-and-gaps","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"Yes.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Historical backfill returns nothing","icon":"wifi-slash"}]},{"id":"HOt9BeW2XRIsjRtnV1QI","title":"Why do historical requests only partially arrive?","pathname":"/faq/help-topics/no-data/historical-backfill-returns-nothing/async-historical-rate-limits","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"Historical data requests are processed asynchronously, so the API can return success while the upstream fetch later fails due to provider rate limits.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Historical backfill returns nothing","icon":"wifi-slash"}]},{"id":"C2w4EpnIZwCC4O35meRj","title":"Missing fields & data types in payloads","pathname":"/faq/help-topics/no-data/missing-fields-data-types-in-payloads","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Missing fields & data types in payloads","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"}]},{"id":"2NQB0WrKbY1rvJkzO2rq","title":"Why are Apple Health HR, sleep stages or GPS missing?","pathname":"/faq/help-topics/no-data/missing-fields-data-types-in-payloads/apple-health-missing-detailed-samples","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Missing detail in Apple Health payloads almost always means the source did not record it, or a HealthKit permission was not granted, not a pipeline failure.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Missing fields & data types in payloads","icon":"wifi-slash"}]},{"id":"l9cmOKpwgOtQu6UTUkoK","title":"Why does Fitbit data look duplicated or missing?","pathname":"/faq/help-topics/no-data/missing-fields-data-types-in-payloads/fitbit-native-only-and-snapshot-behaviour","siteSpaceId":"sitesp_2ppMq","icon":"trash","description":"Fitbit's API only syncs data recorded by Fitbit's own devices, so third-party data routed into the Fitbit app will not arrive.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Missing fields & data types in payloads","icon":"wifi-slash"}]},{"id":"9IPhbcSzEGwAO2v2fEn3","title":"Why isn't third-party activity in Garmin Connect reaching Terra?","pathname":"/faq/help-topics/no-data/missing-fields-data-types-in-payloads/garmin-thirdparty-imports-excluded","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Garmin's Wellness API only returns activities recorded natively on a Garmin device.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Missing fields & data types in payloads","icon":"wifi-slash"}]},{"id":"R3uFncHAlyecsaH8ktyH","title":"Why have my Fitbit heart rate fields gone null?","pathname":"/faq/help-topics/no-data/missing-fields-data-types-in-payloads/fitbit-samples-scope-empties-summaries","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Fitbit heart-rate summary fields are computed from the heart-rate samples the provider sends, so disabling the samples scope in your dashboard also empties the…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Missing fields & data types in payloads","icon":"wifi-slash"}]},{"id":"3prpSz9C7xFgXegs5A5f","title":"Why is sleep null in my Fitbit daily payload?","pathname":"/faq/help-topics/no-data/missing-fields-data-types-in-payloads/sleep-is-separate-data-type","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Sleep is delivered as a dedicated sleep data type, not inside the daily payload.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Missing fields & data types in payloads","icon":"wifi-slash"}]},{"id":"IKSQZuWagNB9ByHD3fXH","title":"Why are glucose and temperature samples missing?","pathname":"/faq/help-topics/no-data/missing-fields-data-types-in-payloads/with-samples-flag-required","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Sample-level data such as glucose and temperature readings is only included when the request sets with_samples=true.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Missing fields & data types in payloads","icon":"wifi-slash"}]},{"id":"q6TyQFZFmvYbCu9MzqX5","title":"Auth, scopes & user ID matching","pathname":"/faq/help-topics/no-data/auth-scopes-user-id-matching","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Auth, scopes & user ID matching","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"}]},{"id":"yVzGysQt1MCsa9M8Q7Pr","title":"Why does user_id not match between UI and webhooks?","pathname":"/faq/help-topics/no-data/auth-scopes-user-id-matching/same-account-multiple-reference-ids-duplicates","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"This is expected behaviour driven by reference_id.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Auth, scopes & user ID matching","icon":"wifi-slash"}]},{"id":"XyOLUNeFsBPJbuS0fNZx","title":"Why does my redirect fail with missing_scopes?","pathname":"/faq/help-topics/no-data/auth-scopes-user-id-matching/missing-or-insufficient-scopes-on-auth","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"These errors mean the end user did not grant the scopes the integration requires, so have them reauthenticate and grant the missing access.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Auth, scopes & user ID matching","icon":"wifi-slash"}]},{"id":"uWGZCm8i2j6hAwnjlRGx","title":"How do I handle a changed Terra user ID after reauth?","pathname":"/faq/help-topics/no-data/auth-scopes-user-id-matching/reauth-webhook-user-id-changes","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"When a Terra user ID changes, the user reauthenticated (reconnected the same provider account under the same reference_id).","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Auth, scopes & user ID matching","icon":"wifi-slash"}]},{"id":"TNrgYB7hniPnNehRbBjB","title":"Delivery delays & lag","pathname":"/faq/help-topics/no-data/delivery-delays-lag","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Delivery delays & lag","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"}]},{"id":"tRx38pJ4E90RzhJ9OAgO","title":"Why is my Oura data late, and can I force a sync?","pathname":"/faq/help-topics/no-data/delivery-delays-lag/oura-app-vs-cloud-delay","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Oura's mobile app and cloud are separate systems, and Terra can only access cloud data.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Delivery delays & lag","icon":"wifi-slash"}]},{"id":"tDrgXLabebMDDO2LFdcX","title":"Why is my Garmin webhook delivery delayed by about an hour?","pathname":"/faq/help-topics/no-data/delivery-delays-lag/garmin-push-only-delivery-delay","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Terra delivers Garmin data within seconds of receiving Garmin's push.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Delivery delays & lag","icon":"wifi-slash"}]},{"id":"SogbiZOG6lt21UXX8VOe","title":"Why does weight from phone health apps arrive with delays?","pathname":"/faq/help-topics/no-data/delivery-delays-lag/phone-platform-sync-lag","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Delays for phone-based health platforms are usually phone-to-cloud sync lag, not the API.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Delivery delays & lag","icon":"wifi-slash"}]},{"id":"X7vTpTVaCCdMFvTTdX81","title":"Why are my Google activities arriving with a delay?","pathname":"/faq/help-topics/no-data/delivery-delays-lag/google-health-connect-data-delay-reinit","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"There are two cases, depending on how Google is connected.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Delivery delays & lag","icon":"wifi-slash"}]},{"id":"IyjT63kVGmOPriLEWlrw","title":"Connecting a provider","pathname":"/faq/help-topics/connecting","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Connecting providers, the auth widget, credentials, OAuth and approvals.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"}]},{"id":"IOpVNlV8xvCKWMJbUXf4","title":"Setting up provider credentials (bring-your-own keys)","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Setting up provider credentials (bring-your-own keys)","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"W2D6qwqriGaWTJrSwR4Q","title":"How do I set up WHOOP provider credentials?","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/whoop-byo-credentials-setup","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"WHOOP is a bring-your-own-credentials provider.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"rttPKDD8JhrRLNk3yy8K","title":"How do I set up Huawei?","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/huawei-byo-credentials-healthkit","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Huawei requires dedicated, customer-owned credentials, not shared ones, so widget redirects 500 until they are set up.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"KZWVDj8iKqNnoHENZV4L","title":"How do I set up my Strava credentials?","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/strava-byo-credentials-callback-domain","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Strava is a bring-your-own-credentials source, so a \"credentials required\" message is expected.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"B5ggjwwUC0uVatfEKoax","title":"How do I set up a bring-your-own-credential provider?","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/byo-credentials-generic-provider-key","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Some providers require you to obtain API credentials directly from the provider before the connection will work.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"Us5tBGkNvJ0NIH48lEm4","title":"What credentials do I need for InBody?","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/inbody-no-dedicated-credentials-needed","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The InBody integration works with end-user accounts directly: users authenticate with the same username and password they use in the InBody app.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"vZoi1tEIZojqEixAaPmv","title":"Do I need my own developer keys for Dexcom?","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/dexcom-own-keys-production-access","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Dexcom always uses your own developer credentials, never Terra's shared/aggregate keys, and requires a direct partnership between you and Dexcom.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"zwPdPQlA8LYz0Mn3fLG9","title":"Why is my Huawei redirect_uri not registered?","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/provider-callback-url-registration","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Provider OAuth errors like redirect_uri not registered or Unauthorized after the user authorises mean the Terra callback URL isn't registered, or doesn't…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"X0uHn77ohYp2bBaGfCvN","title":"Why can't I save my WHOOP redirect URL?","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/whoop-redirect-url-save-error","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"If the WHOOP developer portal rejects your redirect URL, check for stray whitespace at the start of the URL.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"NRrNtpTejfrzPSzscWOD","title":"Why does Strava return redirect_uri invalid?","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/strava-redirect-uri-invalid","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"A Strava redirect_uri invalid error means the Authorization Callback Domain in your Strava app doesn't match Terra's actual redirect host.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"2oxXWQ6HOhhcpZfApaQu","title":"What Strava credentials do I enter in Terra?","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/strava-access-refresh-tokens-not-needed","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"When registering your own Strava app, only the Client ID and Client Secret go into your Terra source settings.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"KEhQFtBADbRasucELrge","title":"Do I need a separate Dexcom EU setup for European users?","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/dexcom-eu-separate-credentials","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Yes.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"XmqwszTN4pk0YZf2ACn2","title":"Do I need separate provider apps and DNS per environment?","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/single-provider-credentials-environments-dns","siteSpaceId":"sitesp_2ppMq","icon":"lock","description":"You don't need a separate provider app or extra DNS records per Terra environment.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"0Eu7MOohcKH5UpVhhrtF","title":"How do I set the Dexcom redirect URL and region?","pathname":"/faq/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/dexcom-redirect-url-and-region","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"For a custom-subdomain Dexcom setup, the redirect URL must point at the subdomain whose CNAME points to our load balancer, not at your apex domain.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"hGMZ726ZBCjYGDzGq6qP","title":"Apple Health, Health Connect and mobile SDK","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Apple Health, Health Connect and mobile SDK","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"llcNbiohDFaySF2mI3Ms","title":"Why is user_id None for Apple Health in the widget?","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk/sdk-provider-needs-deeplink-initconnection","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"SDK-based providers (Apple Health, Samsung Health, Health Connect) cannot complete a connection through the web widget alone, which is why the widget returns a…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Apple Health, Health Connect and mobile SDK","icon":"plug"}]},{"id":"XYKdaqC5gZsTHItK97Jb","title":"Why doesn't use_terra_avengers_app open the native app?","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk/use-terra-avengers-companion-app","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"use_terra_avengers_app must be passed inside the JSON body of /auth/generateWidgetSession (for example {\"reference_id\": \"...\", \"use_terra_avengers_app\": true}).","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Apple Health, Health Connect and mobile SDK","icon":"plug"}]},{"id":"9BCwEZ9qfuAsclqLmget","title":"How do I set up Samsung Health (direct vs Health Connect)?","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk/samsung-health-android-only-routes","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Samsung Health is an on-device integration that requires a native Android app.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Apple Health, Health Connect and mobile SDK","icon":"plug"}]},{"id":"NreWsGGqcDVFmllzUVmE","title":"What can I test while Samsung approval is pending?","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk/samsung-health-connect-fallback-and-dev-mode","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"While awaiting Samsung partnership approval, you can develop and test against Health Connect as a drop-in.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Apple Health, Health Connect and mobile SDK","icon":"plug"}]},{"id":"9FDRD6jX08ye6ygdWrH4","title":"Why does Samsung Health throw AuthorizationException 2000 in release but work in debug?","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk/samsung-production-sdk-switch-and-signing","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"There's no Samsung Developer ID to add on the Terra SDK or in your app code.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Apple Health, Health Connect and mobile SDK","icon":"plug"}]},{"id":"qxh2y73zEQTVtkX5W3bA","title":"Google (web) vs Google Fit (Health Connect) connection?","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk/google-vs-googlefit-connection-types","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"These are two different data sources, and neither is tied to a specific tracker; both are aggregators that surface whatever apps and devices have written into…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Apple Health, Health Connect and mobile SDK","icon":"plug"}]},{"id":"g6Hb8I627W4sxhcdGKHz","title":"Why do I get 'health_connect is disabled on this dev-id'?","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk/health-connect-disabled-devid-toggle","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The error health_connect is disabled on this dev-id means Health Connect isn't yet enabled for that dev_id in the dashboard.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Apple Health, Health Connect and mobile SDK","icon":"plug"}]},{"id":"AgOTBhLhZukAP0NPp5fw","title":"Why does Health Connect show grey but provider shows connected?","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk/health-connect-grey-write-side","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Terra does not manage your app writing data into Health Connect; that flow is handled by your own integration.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Apple Health, Health Connect and mobile SDK","icon":"plug"}]},{"id":"80XLbZUNG0NSjN3F1Be3","title":"Why doesn't the Health Connect permission dialog appear?","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk/health-connect-permission-dialog-once","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"This is expected.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Apple Health, Health Connect and mobile SDK","icon":"plug"}]},{"id":"3r20RHvlB23DZyhggs4A","title":"Why does Apple Health permission never show with success:false?","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk/apple-health-permission-screen-build-config","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"If Apple Health's permission prompt never appears and initConnection returns success:false, check two things","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Apple Health, Health Connect and mobile SDK","icon":"plug"}]},{"id":"U9qmTDOhHHYlo0RfGAc5","title":"Why does Apple Health show an invalid link error?","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk/apple-deeplink-invalid-link-error","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"An invalid link error when connecting Apple Health usually means the app's deep-link setup is incorrect or unhandled.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Apple Health, Health Connect and mobile SDK","icon":"plug"}]},{"id":"KItlA5MgrJJ3nBkx4xdi","title":"Why does the HealthKit permission sheet only show once?","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk/apple-healthkit-permission-sheet-once","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Apple shows the HealthKit permission sheet only once per app, per device install.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Apple Health, Health Connect and mobile SDK","icon":"plug"}]},{"id":"OcXQw3tsrkuGmIckqw6U","title":"Why does the Samsung connection redirect to Health Connect?","pathname":"/faq/help-topics/connecting/apple-health-health-connect-and-mobile-sdk/samsung-route-default-redirects-to-health-connect","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"There are two Samsung Health integration routes.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Apple Health, Health Connect and mobile SDK","icon":"plug"}]},{"id":"ftCSbh4WZ29XfltQel7N","title":"Regional and account restrictions","pathname":"/faq/help-topics/connecting/regional-and-account-restrictions","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Regional and account restrictions","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"OMIQTU04F7cb8tSDTXAf","title":"Why can't I connect MyFitnessPal?","pathname":"/faq/help-topics/connecting/regional-and-account-restrictions/mfp-username-and-diary-key-setup","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"MyFitnessPal connects with your MFP username and a diary key, not your email or account password.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Regional and account restrictions","icon":"plug"}]},{"id":"yFLHieyicQtEJqyoTpQr","title":"Which provider covers Xiaomi and Mi Band data?","pathname":"/faq/help-topics/connecting/regional-and-account-restrictions/zepp-xiaomi-rename-device-compatibility","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The Xiaomi integration was renamed to ZEPP at the provider's request.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Regional and account restrictions","icon":"plug"}]},{"id":"WP6DvsnsmXxPTs0sGivA","title":"Why does Omron login fail outside the US or EU?","pathname":"/faq/help-topics/connecting/regional-and-account-restrictions/omron-region-locked-eu-us-only","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Omron splits accounts by regional backend, and Terra integrates only the EU cloud (OMRON, ohiomron.eu) and the US cloud (OMRONUS, ohiomron.com).","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Regional and account restrictions","icon":"plug"}]},{"id":"WRwk3Sto6wBHuSBY0zzY","title":"Why does my MyFitnessPal diary sharing revert to private?","pathname":"/faq/help-topics/connecting/regional-and-account-restrictions/mfp-diary-sharing-setting-moved-reverts","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"MyFitnessPal controls the diary-sharing setting, not Terra.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Regional and account restrictions","icon":"plug"}]},{"id":"Z5xBK611U1WkZoapI6at","title":"Why does Komoot login fail with invalid credentials?","pathname":"/faq/help-topics/connecting/regional-and-account-restrictions/komoot-discontinued","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The Komoot integration is no longer supported, so users cannot connect Komoot accounts at this time.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Regional and account restrictions","icon":"plug"}]},{"id":"vSxtm88y4zWK4gB5EHyh","title":"Can Hammerhead users connect with SRAM credentials?","pathname":"/faq/help-topics/connecting/regional-and-account-restrictions/hammerhead-no-sram-login","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"No, SRAM account credentials are not currently supported for connecting Hammerhead through Terra.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Regional and account restrictions","icon":"plug"}]},{"id":"kOCwLM8gk5yLLxvIzjID","title":"Is Huawei supported and how do I set it up?","pathname":"/faq/help-topics/connecting/regional-and-account-restrictions/huawei-dedicated-credentials-required","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Huawei is supported, but requires applying for dedicated credentials on Huawei's developer platform before use.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Regional and account restrictions","icon":"plug"}]},{"id":"9X0xO0MtXEBYAxafA8ox","title":"Does Oura need extra setup before production?","pathname":"/faq/help-topics/connecting/regional-and-account-restrictions/oura-no-extra-setup-for-production","siteSpaceId":"sitesp_2ppMq","icon":"rocket","description":"Oura requires no additional setup on your side before going to production.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Regional and account restrictions","icon":"plug"}]},{"id":"RoTyCY1o7oZDJ48P526m","title":"Choosing and managing connections in the widget","pathname":"/faq/help-topics/connecting/choosing-and-managing-connections-in-the-widget","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Choosing and managing connections in the widget","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"ejQ6Nk4vg4dskLTPBFRc","title":"Can end users manage their own connections?","pathname":"/faq/help-topics/connecting/choosing-and-managing-connections-in-the-widget/show-disconnect-existing-connections","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Yes.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Choosing and managing connections in the widget","icon":"plug"}]},{"id":"SvX7Lytaij9eZhhPRdMo","title":"How do I show only one provider in the widget?","pathname":"/faq/help-topics/connecting/choosing-and-managing-connections-in-the-widget/restrict-or-preselect-providers","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Pass the providers field in the /auth/generateWidgetSession body to control which providers appear and override the dashboard default list (for example…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Choosing and managing connections in the widget","icon":"plug"}]},{"id":"Skl15Qde0jURzdwUmC6f","title":"Why is a provider missing from the Connect widget?","pathname":"/faq/help-topics/connecting/choosing-and-managing-connections-in-the-widget/provider-enabled-mismatch-or-missing-source","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"If a provider is missing from the widget, or a widget session looks expired immediately for one provider while others work, the source is either not enabled or…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Choosing and managing connections in the widget","icon":"plug"}]},{"id":"DAiqBwxmkW9SfK3As5eP","title":"Is an integration supported if missing from the public list?","pathname":"/faq/help-topics/connecting/choosing-and-managing-connections-in-the-widget/integrations-list-source-of-truth","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The authoritative list of supported integrations is the /v2/integrations API endpoint and the integrations list in your dashboard.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Choosing and managing connections in the widget","icon":"plug"}]},{"id":"fJfkNQYpCUR92PhrNUH9","title":"Can I customise the connection screen layout?","pathname":"/faq/help-topics/connecting/choosing-and-managing-connections-in-the-widget/widget-end-screen-redirects-customisation","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"You can customise the widget's end screens by passing auth_success_redirect_url and auth_failure_redirect_url in the /auth/generateWidgetSession body, sending…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Choosing and managing connections in the widget","icon":"plug"}]},{"id":"c7ofSXydRHjZEH75UacW","title":"OAuth, WebView and sign-in failures","pathname":"/faq/help-topics/connecting/oauth-webview-and-sign-in-failures","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"OAuth, WebView and sign-in failures","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"ejtxxP2fZP1YGpuLwAJl","title":"Why does OAuth fail inside an in-app WebView?","pathname":"/faq/help-topics/connecting/oauth-webview-and-sign-in-failures/oauth-webview-blocked-use-native-browser","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Google blocks OAuth authentication inside embedded WebViews under its 'Use secure browsers' policy (the hidden URL bar prevents domain verification).","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"OAuth, WebView and sign-in failures","icon":"plug"}]},{"id":"KxILO35N3s8zzryZI8Md","title":"Why does the provider sign-in form clear my password?","pathname":"/faq/help-topics/connecting/oauth-webview-and-sign-in-failures/provider-signin-form-fails-credentials","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"When a provider's sign-in form clears the password or the continue button stays greyed out with no Terra error, the issue is on the provider's side.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"OAuth, WebView and sign-in failures","icon":"plug"}]},{"id":"hXIBcu6Mj9vX7EGphY8n","title":"Why does provider OAuth fail in my app's web view?","pathname":"/faq/help-topics/connecting/oauth-webview-and-sign-in-failures/open-auth-in-real-browser-not-webview","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Provider OAuth pages restrict iframes, sandboxed windows and embedded WebViews (which hide the URL bar), so identity providers like Google block them and the…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"OAuth, WebView and sign-in failures","icon":"plug"}]},{"id":"7VRH0UwpzKRv1eea739F","title":"Why can't my user complete provider auth in the in-app webview?","pathname":"/faq/help-topics/connecting/oauth-webview-and-sign-in-failures/provider-auth-fails-in-inapp-webview-generic","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"When a provider login fails inside an in-app webview, ask the end user to open the authentication page in a full external/system browser.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"OAuth, WebView and sign-in failures","icon":"plug"}]},{"id":"AupEgXuGkMiFWv8sx8fj","title":"Why doesn't the browser redirect after the success screen?","pathname":"/faq/help-topics/connecting/oauth-webview-and-sign-in-failures/auth-success-redirect-not-firing","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"After a successful connection the widget only redirects to your endpoint if auth_success_redirect_url was passed in the body of your auth request.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"OAuth, WebView and sign-in failures","icon":"plug"}]},{"id":"1vuLOxH9dyQqL2w8HsqD","title":"Why do users skip the provider login page?","pathname":"/faq/help-topics/connecting/oauth-webview-and-sign-in-failures/skipped-login-already-authenticated","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"If the end user's browser already has an active session with the provider, the OAuth flow skips the credential prompt and goes straight to the success page.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"OAuth, WebView and sign-in failures","icon":"plug"}]},{"id":"mecBAhPcFM3HlQFsvVS5","title":"How do I verify auth redirect URLs are legitimate?","pathname":"/faq/help-topics/connecting/oauth-webview-and-sign-in-failures/verify-redirect-legitimacy","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Auth redirects do not carry a signed header like webhooks do.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"OAuth, WebView and sign-in failures","icon":"plug"}]},{"id":"mpNAfnBTi3QRB1ynNTh0","title":"Connection errors and API responses","pathname":"/faq/help-topics/connecting/connection-errors-and-api-responses","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Connection errors and API responses","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"Hjli6gR5wYQdc3JvmPZ3","title":"Why do my requests return 401 in production?","pathname":"/faq/help-topics/connecting/connection-errors-and-api-responses/env-credential-mismatch-401-invalid-token","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"401 / invalid-token errors almost always mean credentials are mismatched across environments.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Connection errors and API responses","icon":"plug"}]},{"id":"bmIszl9ESu98xuRLo9xD","title":"Why do I get 'app is blocked' on Google Fit OAuth?","pathname":"/faq/help-topics/connecting/connection-errors-and-api-responses/google-fit-app-blocked-write-scopes","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The app is blocked error during Google Fit authentication happens when write permission scopes are enabled in your dashboard.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Connection errors and API responses","icon":"plug"}]},{"id":"99RqBczrcpAZ5mU2hKm5","title":"Why do I get 'insufficient permissions for data type' on Google?","pathname":"/faq/help-topics/connecting/connection-errors-and-api-responses/google-insufficient-scope-data-type","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"A connection_error reading insufficient permissions for data type fires when Terra polls a data type the user's OAuth token doesn't cover, for example Google…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Connection errors and API responses","icon":"plug"}]},{"id":"ZwhXnSyABnWwY705VLWv","title":"Why does Google connect return a google_no_datasource warning?","pathname":"/faq/help-topics/connecting/connection-errors-and-api-responses/google-no-datasource-warning","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The google_no_datasource warning means the connected Google account has no devices or health data sources attached, usually because the user picked the wrong…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Connection errors and API responses","icon":"plug"}]},{"id":"haIz8s1pspB1mCYdYvuy","title":"Why does Fitbit show 'rate limit exceeded' right after connecting?","pathname":"/faq/help-topics/connecting/connection-errors-and-api-responses/fitbit-rate-limit-after-connect","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"A rate limit exceeded message right after a user connects usually means the initial data backfill temporarily hit provider rate limits.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Connection errors and API responses","icon":"plug"}]},{"id":"740ziYQNo2abfRPXwhgg","title":"Why does the OAuth redirect hang or return missing_scopes?","pathname":"/faq/help-topics/connecting/connection-errors-and-api-responses/webhook-30s-timeout-and-historical-data","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Two separate things are happening here.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Connection errors and API responses","icon":"plug"}]},{"id":"EsRzOx4TFkWvAdn9TRvH","title":"Why does the auth endpoint return 422 errors?","pathname":"/faq/help-topics/connecting/connection-errors-and-api-responses/reference-id-must-be-string-422","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"A 422 on the authentication endpoint is most commonly caused by sending reference_id as an integer.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Connection errors and API responses","icon":"plug"}]},{"id":"LtzIpV51RAci9px5Hc0G","title":"Why does generateWidgetSession return a 500?","pathname":"/faq/help-topics/connecting/connection-errors-and-api-responses/generatewidgetsession-500-no-sources","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"A 500 with an HTML error page from generateWidgetSession is typically caused by having no data sources enabled in the environment matching the dev-id you are…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Connection errors and API responses","icon":"plug"}]},{"id":"JFzMtvHxV9wDmgOzr7dk","title":"Why is my staging widget blocked before provider auth?","pathname":"/faq/help-topics/connecting/connection-errors-and-api-responses/staging-testing-50-user-cap","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Staging and testing environments are each capped at 50 connected users, independent of your production plan.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Connection errors and API responses","icon":"plug"}]},{"id":"QhZfkIzF62ex4nFGb6qK","title":"End-user authentication and SSO","pathname":"/faq/help-topics/connecting/end-user-authentication-and-sso","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"End-user authentication and SSO","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"6z6J23tdohTqgbGb3Lp0","title":"Can SSO users connect a password-based provider?","pathname":"/faq/help-topics/connecting/end-user-authentication-and-sso/credential-based-provider-no-sso-login","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"For providers connected via email and password (for example Flo, Clue), accounts created with social SSO such as Sign in with Apple or Google sign-in cannot be…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"End-user authentication and SSO","icon":"plug"}]},{"id":"etDEnydtHIlauLVqDftU","title":"Can one user connect multiple providers via the widget?","pathname":"/faq/help-topics/connecting/end-user-authentication-and-sso/multiple-providers-one-user","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Yes.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"End-user authentication and SSO","icon":"plug"}]},{"id":"VuY9jaFAm0UUGnWEdFl8","title":"Why can't Apple/Google social-login users sign in?","pathname":"/faq/help-topics/connecting/end-user-authentication-and-sso/social-login-no-password","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Credential-based integrations on the Terra auth page only support email and password login.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"End-user authentication and SSO","icon":"plug"}]},{"id":"Ich4DnboXk1tGudn08Vr","title":"Why do provider OAuth pages always show in English?","pathname":"/faq/help-topics/connecting/end-user-authentication-and-sso/provider-page-language-not-controllable","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The language parameter on session / auth-URL generation only controls the Terra widget interface, not the provider's own login page.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"End-user authentication and SSO","icon":"plug"}]},{"id":"LSg55EvqC5BrQndSFPOX","title":"How do I generate a per-user auth URL backend-only?","pathname":"/faq/help-topics/connecting/end-user-authentication-and-sso/backend-only-auth-link-flow","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"For a backend-only setup with no frontend","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"End-user authentication and SSO","icon":"plug"}]},{"id":"8H8pQK6fBhIWbwHMGn93","title":"Getting a provider developer app approved","pathname":"/faq/help-topics/connecting/getting-a-provider-developer-app-approved","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Getting a provider developer app approved","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"4Am81exHBtQS6JiqhjiV","title":"How do I lift Strava's one-athlete limit?","pathname":"/faq/help-topics/connecting/getting-a-provider-developer-app-approved/strava-production-app-and-athlete-limit","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Strava apps start in development mode, which limits you to one connected athlete.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Getting a provider developer app approved","icon":"plug"}]},{"id":"31nCi2yehG7gIfVzhqp7","title":"Do I need a WHOOP device to create a developer account?","pathname":"/faq/help-topics/connecting/getting-a-provider-developer-app-approved/whoop-device-required-for-account","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Creating a WHOOP developer account now requires an active WHOOP device and membership.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Getting a provider developer app approved","icon":"plug"}]},{"id":"vAEKij2oycaa2KbN0Pew","title":"How do I get my WHOOP developer app approved?","pathname":"/faq/help-topics/connecting/getting-a-provider-developer-app-approved/whoop-approval-slow-no-expedite","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"WHOOP handles developer app approval directly and timelines vary, typically one to two weeks.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Getting a provider developer app approved","icon":"plug"}]},{"id":"1ETPDq4hVRUwi7bJ5bkp","title":"Connected but no data arriving","pathname":"/faq/help-topics/connecting/connected-but-no-data-arriving","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Connected but no data arriving","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"DIe6Cu8ZAxotAUlQco8Q","title":"Why isn't my Renpho body measurement data showing up?","pathname":"/faq/help-topics/connecting/connected-but-no-data-arriving/renpho-legacy-accounts-only","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The Renpho integration currently supports end users on older (legacy) Renpho accounts.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Connected but no data arriving","icon":"plug"}]},{"id":"EaaxmIUlTb9DRWJ1FnaH","title":"Realtime, BLE and mobile delivery","pathname":"/faq/help-topics/connecting/realtime-ble-and-mobile-delivery","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Realtime, BLE and mobile delivery","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"Q28apGgIBOZQKFQclzud","title":"Why was my app rejected over health permission justifications?","pathname":"/faq/help-topics/connecting/realtime-ble-and-mobile-delivery/app-store-health-permission-rejection","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"When the Play Store rejects your app over its health/nutrition data permissions policy, respond to the review with a clear explanation of how your app uses…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Realtime, BLE and mobile delivery","icon":"plug"}]},{"id":"VmnX7xe3GuOkMsT2U1eU","title":"Billing & account","pathname":"/faq/help-topics/billing-account","siteSpaceId":"sitesp_2ppMq","icon":"gear","description":"Your dashboard account, API keys, environments and going to production.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"}]},{"id":"N4d8BS6hsme2EXhms5qI","title":"Dashboard, users and connections","pathname":"/faq/help-topics/billing-account/dashboard-users-and-connections","siteSpaceId":"sitesp_2ppMq","icon":"gear","description":"Dashboard, users and connections","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"}]},{"id":"4LCunRy9foSdysMX2Nou","title":"How do I delete a duplicate user or connection?","pathname":"/faq/help-topics/billing-account/dashboard-users-and-connections/delete-deauth-users","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The dashboard user list is read-only, with no delete button.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Dashboard, users and connections","icon":"gear"}]},{"id":"ccomrSeQDKu7X2CdnDmj","title":"Where do I find my dev ID and API keys?","pathname":"/faq/help-topics/billing-account/dashboard-users-and-connections/find-dev-id-and-api-keys","siteSpaceId":"sitesp_2ppMq","icon":"key","description":"Your dev ID is shown in the Terra dashboard under the API Keys button at the top right of the screen.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Dashboard, users and connections","icon":"gear"}]},{"id":"tWFL0fkkYN7e11EaBzVD","title":"How do I rotate my API keys and webhook secret?","pathname":"/faq/help-topics/billing-account/dashboard-users-and-connections/api-key-webhook-secret-rotation","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"API key and webhook secret rotation is coordinated with the Terra team rather than self-service in the dashboard.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Dashboard, users and connections","icon":"gear"}]},{"id":"wQStP6bHtXGrDrNsDQc3","title":"Can I edit a connection's reference ID via the SDK?","pathname":"/faq/help-topics/billing-account/dashboard-users-and-connections/edit-reference-id","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"You can edit the reference_id of an existing user connection from the Terra dashboard, by clicking the pencil icon next to the reference ID.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Dashboard, users and connections","icon":"gear"}]},{"id":"8QvrAlMrYrQAEKSPEeWC","title":"Were my team invites actually sent?","pathname":"/faq/help-topics/billing-account/dashboard-users-and-connections/team-invite-no-pending-indicator","siteSpaceId":"sitesp_2ppMq","icon":"gear","description":"Team invites are sent as soon as you submit them, even though the dashboard currently shows no pending-invite indicator.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Dashboard, users and connections","icon":"gear"}]},{"id":"gY5dLJQB4D8j4xQNcZ1y","title":"Why does my source card say 'apply for credentials'?","pathname":"/faq/help-topics/billing-account/dashboard-users-and-connections/apply-for-credentials-notice-not-error","siteSpaceId":"sitesp_2ppMq","icon":"key","description":"The \"apply for credentials\" message on a provider's source card is an informational note, not an error.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Dashboard, users and connections","icon":"gear"}]},{"id":"QKZrtAKb8dWbV9hwyICV","title":"Why don't widget providers match my connections?","pathname":"/faq/help-topics/billing-account/dashboard-users-and-connections/widget-provider-list-vs-sources","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The widget's provider list and your dashboard Sources panel come from the same place by default, but your app can override the list per session.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Dashboard, users and connections","icon":"gear"}]},{"id":"VBIL1TEUeAqFn94nsfef","title":"Why are my sources and API keys empty after signup?","pathname":"/faq/help-topics/billing-account/dashboard-users-and-connections/empty-dashboard-after-signup-provisioning","siteSpaceId":"sitesp_2ppMq","icon":"key","description":"This is almost always account provisioning still completing, not a broken account.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Dashboard, users and connections","icon":"gear"}]},{"id":"PjdPiDL3EO088Dlp3JlE","title":"Environments, config and going to production","pathname":"/faq/help-topics/billing-account/environments-config-and-going-to-production","siteSpaceId":"sitesp_2ppMq","icon":"gear","description":"Environments, config and going to production","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"}]},{"id":"ck37MeY5CDyqWcALWYyR","title":"Why are no users or connections showing in the dashboard?","pathname":"/faq/help-topics/billing-account/environments-config-and-going-to-production/environment-isolation-config-and-data","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The dashboard separates testing, staging, and production environments, and they are fully independent.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Environments, config and going to production","icon":"gear"}]},{"id":"Af7hCs9WlHN3vLecSCVc","title":"Can I replicate my testing config into production?","pathname":"/faq/help-topics/billing-account/environments-config-and-going-to-production/cannot-migrate-between-environments","siteSpaceId":"sitesp_2ppMq","icon":"rocket","description":"There's no automated way to clone a testing environment into production.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Environments, config and going to production","icon":"gear"}]},{"id":"gZYe4ERALtMU3v8nFuAC","title":"How do I move to production?","pathname":"/faq/help-topics/billing-account/environments-config-and-going-to-production/production-rollout-billing","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"Once your subscription is active you can begin authenticating users in your production environment straight away.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Environments, config and going to production","icon":"gear"}]},{"id":"Nuwf2kCLaHP0EcpuDsOG","title":"Data, payloads and destinations","pathname":"/faq/help-topics/billing-account/data-payloads-and-destinations","siteSpaceId":"sitesp_2ppMq","icon":"gear","description":"Data, payloads and destinations","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"}]},{"id":"lxWJOMiBbBLhfXM9odnQ","title":"Why can't I download old payload history?","pathname":"/faq/help-topics/billing-account/data-payloads-and-destinations/payload-history-one-week-retention","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"Payload History on the dashboard is available for recent payloads only, so older payloads can't be downloaded from there.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Data, payloads and destinations","icon":"gear"}]},{"id":"fv7J9flR1GdkwNLQFGre","title":"Why doesn't payload history metadata match the payload?","pathname":"/faq/help-topics/billing-account/data-payloads-and-destinations/payload-history-ids-after-deauth","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"When a connection is deauthenticated and reconnected, the dashboard's Payload History may fall back to showing an internal connection ID instead of the Terra…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Data, payloads and destinations","icon":"gear"}]},{"id":"9sTnS2rm78SRtuAoA7mT","title":"Why doesn't the payload simulator show sample arrays?","pathname":"/faq/help-topics/billing-account/data-payloads-and-destinations/payload-simulator-sample-arrays","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"The dashboard payload simulator does include sample arrays, for example the detailed samples within activity and daily payloads.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Data, payloads and destinations","icon":"gear"}]},{"id":"OcGfKySKPiW4SWbjThb2","title":"Why does my S3 destination show AccessDenied?","pathname":"/faq/help-topics/billing-account/data-payloads-and-destinations/s3-destination-iam-connection-test","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Grant the IAM role s3:GetObject, s3:PutObject, and s3:DeleteObject on the bucket for your S3 destination.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Data, payloads and destinations","icon":"gear"}]},{"id":"pTrYxIUoak80c8SRhVMF","title":"Support and getting help","pathname":"/faq/help-topics/billing-account/support-and-getting-help","siteSpaceId":"sitesp_2ppMq","icon":"gear","description":"Support and getting help","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"}]},{"id":"XLaVD1TlrKWCz055pCCc","title":"How do I contact Terra support?","pathname":"/faq/help-topics/billing-account/support-and-getting-help/support-channels-and-sla","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"Terra has no public Discord or community channel, and support runs through the dashboard ticketing system.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Support and getting help","icon":"gear"}]},{"id":"P3XxUSw4RVPEmVUA0BZE","title":"How do I open a support ticket?","pathname":"/faq/help-topics/billing-account/support-and-getting-help/support-channel-dashboard-widget-only","siteSpaceId":"sitesp_2ppMq","icon":"life-ring","description":"Currently the dashboard support widget is the only channel for opening tickets.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Support and getting help","icon":"gear"}]},{"id":"3zZG4z51HukA3r9BvA9X","title":"Usage limits and overage charges","pathname":"/faq/help-topics/billing-account/usage-limits-and-overage-charges","siteSpaceId":"sitesp_2ppMq","icon":"gear","description":"Usage limits and overage charges","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"}]},{"id":"DMBUMDIIDefigkbN631Y","title":"How many devices can I connect in testing or staging?","pathname":"/faq/help-topics/billing-account/usage-limits-and-overage-charges/testing-staging-device-limit","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Testing and staging environments each allow up to 50 connected users.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Usage limits and overage charges","icon":"gear"}]},{"id":"g3AEsGDFRIa1d3Yy5KJH","title":"Webhooks & destinations","pathname":"/faq/help-topics/webhook","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Webhook delivery, storage destinations, signatures, retries and routing.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"}]},{"id":"ia3uy3bpPQg7uriUwUqd","title":"Failures, errors and retries","pathname":"/faq/help-topics/webhook/failures-errors-and-retries","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Failures, errors and retries","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"HzO9jHOjtgjQ0PyJf6Ld","title":"Are my webhook 401/404/500 errors on Terra's side?","pathname":"/faq/help-topics/webhook/failures-errors-and-retries/response-codes-are-your-server","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"The HTTP status shown next to a webhook delivery in the dashboard is the response your endpoint (or a proxy in front of it) returned, not an error generated by…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Failures, errors and retries","icon":"webhook"}]},{"id":"jp5kdKvFiHHdm4EtlQvI","title":"Why is my webhook returning 504 errors?","pathname":"/faq/help-topics/webhook/failures-errors-and-retries/ack-fast-process-async-timeout","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"A 504 means your server did not respond within Terra's roughly 8-second delivery window.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Failures, errors and retries","icon":"webhook"}]},{"id":"jyIbXwP9k0HjR4yZgN8J","title":"When are failed webhooks redelivered, and can I resend them?","pathname":"/faq/help-topics/webhook/failures-errors-and-retries/retry-policy-and-redelivery","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Failed webhook deliveries are retried automatically with exponential backoff (roughly 5 min, 30 min, 1h, 2h, 4h, up to about 8 retries), always to your…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Failures, errors and retries","icon":"webhook"}]},{"id":"yBXuTLvMtxbjoawKbHCx","title":"Storage destinations: S3, SQS, Supabase, SQL, GCS","pathname":"/faq/help-topics/webhook/storage-destinations-s3-sqs-supabase-sql-gcs","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Storage destinations: S3, SQS, Supabase, SQL, GCS","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"Hg4C9MZ3h0hQpicEDX8h","title":"Why do my Supabase destination columns not match the docs?","pathname":"/faq/help-topics/webhook/storage-destinations-s3-sqs-supabase-sql-gcs/supabase-destination-schema","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"The Supabase destination uses both SQL tables and a storage bucket.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Storage destinations: S3, SQS, Supabase, SQL, GCS","icon":"webhook"}]},{"id":"65QQXw5E46PNjGtMWfsk","title":"Why is my S3 folder named like a date?","pathname":"/faq/help-topics/webhook/storage-destinations-s3-sqs-supabase-sql-gcs/version-prefix-folder-not-date","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"The dated-looking folder (for example 2022-03-16/) in your cloud-storage destination is the API version prefix, not a data date.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Storage destinations: S3, SQS, Supabase, SQL, GCS","icon":"webhook"}]},{"id":"wnJNswxBd1S60oIMTd7y","title":"How do I set up a Postgres SQL destination?","pathname":"/faq/help-topics/webhook/storage-destinations-s3-sqs-supabase-sql-gcs/sql-destination-schema-setup","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"The SQL destination requires a specific schema and tables to exist before delivery.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Storage destinations: S3, SQS, Supabase, SQL, GCS","icon":"webhook"}]},{"id":"VwfgK6oON6qn14QMxWEl","title":"Why does my SQS destination fail to connect?","pathname":"/faq/help-topics/webhook/storage-destinations-s3-sqs-supabase-sql-gcs/sqs-region-and-message-size","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"When configuring an SQS destination, the region you enter must match the region in your queue URL.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Storage destinations: S3, SQS, Supabase, SQL, GCS","icon":"webhook"}]},{"id":"rnN7YetXxAoW3CroS8WZ","title":"Why are my GCS files missing fields seen in webhooks?","pathname":"/faq/help-topics/webhook/storage-destinations-s3-sqs-supabase-sql-gcs/gcs-upsert-permissions","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Differences between your cloud storage files and the webhook payloads usually trace back to a bucket permissions issue.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Storage destinations: S3, SQS, Supabase, SQL, GCS","icon":"webhook"}]},{"id":"U34KEsUy4fYMWK83Ybz0","title":"Destinations and routing setup","pathname":"/faq/help-topics/webhook/destinations-and-routing-setup","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Destinations and routing setup","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"p7jWUcwjJwt2Ba9IK2si","title":"Can one environment send data to two webhooks?","pathname":"/faq/help-topics/webhook/destinations-and-routing-setup/multiple-destinations-per-env","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"The dashboard self-serves one webhook destination per dev ID.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Destinations and routing setup","icon":"webhook"}]},{"id":"aiqOVEae4anLoltEmBJg","title":"Does changing my webhook URL take effect immediately?","pathname":"/faq/help-topics/webhook/destinations-and-routing-setup/destination-url-change-effective-immediately","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Changing your webhook destination URL in the dashboard takes effect immediately.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Destinations and routing setup","icon":"webhook"}]},{"id":"3nrtjkDHhLpFZhv7XXqs","title":"Can I filter payload types per destination?","pathname":"/faq/help-topics/webhook/destinations-and-routing-setup/filter-payload-types-per-destination","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"You can disable unwanted DATA types globally in the dashboard","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Destinations and routing setup","icon":"webhook"}]},{"id":"KEPHwFvrQ7sTFlkH4Bv5","title":"Is there an API to manage webhook destinations?","pathname":"/faq/help-topics/webhook/destinations-and-routing-setup/no-api-to-manage-destinations","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"There is no public API to manage webhook destinations; the dashboard endpoints are internal and session-authenticated.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Destinations and routing setup","icon":"webhook"}]},{"id":"FqN8Jpkzv8x9WkNc9gAc","title":"Delivery timing, volume and ordering","pathname":"/faq/help-topics/webhook/delivery-timing-volume-and-ordering","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Delivery timing, volume and ordering","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"6YBpjXUAfhVEigxEyRdU","title":"Can I reduce or batch webhook delivery frequency?","pathname":"/faq/help-topics/webhook/delivery-timing-volume-and-ordering/throttle-or-batch-delivery-frequency","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Terra cannot throttle or batch webhook/cloud-storage delivery frequency server-side.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Delivery timing, volume and ordering","icon":"webhook"}]},{"id":"jbqqNaX1JKAIUlSYx6O4","title":"What is the webhook delivery cadence per provider?","pathname":"/faq/help-topics/webhook/delivery-timing-volume-and-ordering/provider-poll-cadence-not-realtime","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Many providers are fetched on a periodic poll schedule rather than in real time, so a webhook will not fire the instant a user logs or records something.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Delivery timing, volume and ordering","icon":"webhook"}]},{"id":"HeDzqwlOK2YjUohI9e7z","title":"Why did my webhook volume suddenly spike?","pathname":"/faq/help-topics/webhook/delivery-timing-volume-and-ordering/backfill-volume-spikes","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Large webhook bursts are expected recovery traffic, not invalid requests.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Delivery timing, volume and ordering","icon":"webhook"}]},{"id":"78Zjao9aUkEZUiZqHKhl","title":"How do I stop a retried webhook overwriting newer data?","pathname":"/faq/help-topics/webhook/delivery-timing-volume-and-ordering/out-of-order-stale-overwrites","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Terra does not currently expose an ordering or freshness guarantee for retried webhook deliveries, so a late retry can in principle overwrite newer data.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Delivery timing, volume and ordering","icon":"webhook"}]},{"id":"cecZ4XFhB8Yds3yxlyGP","title":"Large payloads and chunking","pathname":"/faq/help-topics/webhook/large-payloads-and-chunking","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Large payloads and chunking","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"lnGRXYBiqxsSpdnaGVPx","title":"Will Terra retry or chunk a 413 payload for me?","pathname":"/faq/help-topics/webhook/large-payloads-and-chunking/large-payload-chunking-413","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Terra does not retry with a smaller payload after a 413.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Large payloads and chunking","icon":"webhook"}]},{"id":"OJvbVfekHZ74aNmrKQCO","title":"How do I know when a chunked backfill is complete?","pathname":"/faq/help-topics/webhook/large-payloads-and-chunking/track-chunked-backfill-via-reference","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Large or chunked requests are announced by two notification events before the data arrives","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Large payloads and chunking","icon":"webhook"}]},{"id":"WrJl0KMh5aa7d4VzCqTW","title":"How do I enable ping-mode for large payloads?","pathname":"/faq/help-topics/webhook/large-payloads-and-chunking/ping-mode-s3-for-large-payloads","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"For large or dense payloads (which can exceed the roughly 8s push timeout and arrive truncated as a 504, or trip your ingress buffer with codes like 507)…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Large payloads and chunking","icon":"webhook"}]},{"id":"qaXyxoNGMsN7JwACUciP","title":"Why does a payload data URL fail with 400 expired-token?","pathname":"/faq/help-topics/webhook/large-payloads-and-chunking/presigned-url-expiry","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"The url in each ping / s3_payload webhook is a signed cloud-storage URL that expires roughly 10 minutes after it is generated.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Large payloads and chunking","icon":"webhook"}]},{"id":"9hrRJu0Bl0fceiRAgc7h","title":"Payload content and provider quirks","pathname":"/faq/help-topics/webhook/payload-content-and-provider-quirks","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Payload content and provider quirks","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"Lb7hcB2KHKIrDKqwHfwq","title":"Why don't Garmin simulator payloads appear in history?","pathname":"/faq/help-topics/webhook/payload-content-and-provider-quirks/garmin-payload-simulator-not-stored","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Payloads created via the payload generator/simulator are not stored, so they will not appear in payload history even when the response body shows success.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Payload content and provider quirks","icon":"webhook"}]},{"id":"s9Rfv02uhlEhvcNsybNJ","title":"Does the Include Samples toggle affect the API too?","pathname":"/faq/help-topics/webhook/payload-content-and-provider-quirks/include-samples-global-scope","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"The Include Samples toggle applies globally, affecting both API responses and webhook payloads.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Payload content and provider quirks","icon":"webhook"}]},{"id":"2AFMf10XU0154z97xnt4","title":"Why do I get multiple Garmin sleep sessions for one night, or a sleep payload that looks incomplete?","pathname":"/faq/help-topics/webhook/payload-content-and-provider-quirks/garmin-two-pass-provisional-final","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Two separate things commonly look like a problem with Garmin sleep, but both are expected.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Payload content and provider quirks","icon":"webhook"}]},{"id":"UDPZ6ZFIoz9UhOOIwoxj","title":"Why are there two provider enums for Google?","pathname":"/faq/help-topics/webhook/payload-content-and-provider-quirks/google-vs-googlefit-enum","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Google Fit reports two different provider enum values depending on the connection path","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Payload content and provider quirks","icon":"webhook"}]},{"id":"ZgK3m7xjKpIM8L16qZko","title":"Is planned_workout a valid webhook type?","pathname":"/faq/help-topics/webhook/payload-content-and-provider-quirks/unrecognized-webhook-type-handling","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"planned_workout is a valid webhook type, sent for integrations that deliver planned-workout data.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Payload content and provider quirks","icon":"webhook"}]},{"id":"x02HCctI8BjIzL8Oh5HF","title":"Security, signatures and network access","pathname":"/faq/help-topics/webhook/security-signatures-and-network-access","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Security, signatures and network access","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"Fm0iZ8bXJr2dbDGVgoJM","title":"Why does my webhook signature verification fail?","pathname":"/faq/help-topics/webhook/security-signatures-and-network-access/signature-verification-secret-mismatch","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Signature failures almost always mean the signing secret used for verification does not match the one Terra signed with, not a change on Terra's side.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Security, signatures and network access","icon":"webhook"}]},{"id":"rln3gMGoXHJaolRE1Tv4","title":"What webhook URL do I register in the Huawei portal?","pathname":"/faq/help-topics/webhook/security-signatures-and-network-access/provider-portal-webhook-registration","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"For direct provider-app integrations, Terra's push webhook URL must be registered in the provider's own developer dashboard, separate from the OAuth redirect…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Security, signatures and network access","icon":"webhook"}]},{"id":"awry2T7qeKoW16liy1Tv","title":"What source IPs should I allow for Terra webhooks?","pathname":"/faq/help-topics/webhook/security-signatures-and-network-access/source-ip-allowlist","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Terra's webhook source IPs are documented and rarely change, so first compare your allowlist against the current list in the docs.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Security, signatures and network access","icon":"webhook"}]},{"id":"3VVyMSRurFBeBZ73IMdt","title":"Why does ModSecurity block my webhooks on JSON keys?","pathname":"/faq/help-topics/webhook/security-signatures-and-network-access/modsecurity-waf-json-keys-rule","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"This is expected for data types with large time-series sample arrays (heart rate, SpO2, and similar), where a full day easily exceeds 1000 JSON keys.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Security, signatures and network access","icon":"webhook"}]},{"id":"6Azq3Nl6p6nGGbf5ate1","title":"Do I need a paid webhook testing service?","pathname":"/faq/help-topics/webhook/security-signatures-and-network-access/webhook-testing-service-not-required","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"No, a paid webhook testing service is not required.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Security, signatures and network access","icon":"webhook"}]},{"id":"Esb0RjaFRxOR0tvxyeRe","title":"Something else","pathname":"/faq/help-topics/something-else","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Subdomains, realtime, widgets and getting help.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"}]},{"id":"fd0Pj0nKJ82iRvF6mLI3","title":"Custom subdomains, SSL and security","pathname":"/faq/help-topics/something-else/custom-subdomains-ssl-and-security","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Custom subdomains, SSL and security","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"mw5Us1L4zj6AoGNUDh4R","title":"Why won't my custom subdomain CNAME or SSL validate?","pathname":"/faq/help-topics/something-else/custom-subdomains-ssl-and-security/cname-validation-ssl-issuance-troubleshooting","siteSpaceId":"sitesp_2ppMq","icon":"lock","description":"If a custom subdomain CNAME won't authorise, or the cert won't validate or parse, work through these","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Custom subdomains, SSL and security","icon":"circle-question"}]},{"id":"FSqDsGO7v9HH95a8FvsJ","title":"What redirect and webhook URLs do I use for a custom WHOOP subdomain?","pathname":"/faq/help-topics/something-else/custom-subdomains-ssl-and-security/custom-subdomain-redirect-webhook-setup","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"For a custom-credential provider connection, the redirect URI registered with the provider must be a subdomain on your own domain (for example…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Custom subdomains, SSL and security","icon":"circle-question"}]},{"id":"8cJX8ix0UCOENDXMEyxT","title":"Does Terra use my Google OAuth client ID?","pathname":"/faq/help-topics/something-else/custom-subdomains-ssl-and-security/google-oauth-client-ownership","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"No.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Custom subdomains, SSL and security","icon":"circle-question"}]},{"id":"fd7NxuCCzIYdMhqbGcLz","title":"Docs, support and getting help","pathname":"/faq/help-topics/something-else/docs-support-and-getting-help","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Docs, support and getting help","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"yMLvkQUzwmYiMm2LvgCf","title":"Can I get a call with someone technical?","pathname":"/faq/help-topics/something-else/docs-support-and-getting-help/technical-help-call-availability","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"For migrations, integration questions, API best practices, or product walkthroughs, support can arrange a call with a technical or product lead, or connect you…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Docs, support and getting help","icon":"circle-question"}]},{"id":"iz91PYr35ahky0LYjl7L","title":"What happens to a duplicate ticket I filed?","pathname":"/faq/help-topics/something-else/docs-support-and-getting-help/duplicate-ticket-handling","siteSpaceId":"sitesp_2ppMq","icon":"trash","description":"Duplicate tickets are closed and merged into the original thread, so all context and the ongoing investigation stay in one place.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Docs, support and getting help","icon":"circle-question"}]},{"id":"tFrEqpmDrp5NilBnKIVQ","title":"Where are the API playground and changelog in the docs?","pathname":"/faq/help-topics/something-else/docs-support-and-getting-help/docs-navigation-finding-pages","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"The API playground lives in the reference section of the docs, under the Health and Fitness API reference pages.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Docs, support and getting help","icon":"circle-question"}]},{"id":"Z1BJBHdk4y6uBWkvjXAp","title":"Provider data fields and coverage","pathname":"/faq/help-topics/something-else/provider-data-fields-and-coverage","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Provider data fields and coverage","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"s9UPiwd0OJYA6h3JRNqM","title":"When will field X be available for a provider?","pathname":"/faq/help-topics/something-else/provider-data-fields-and-coverage/provider-doesnt-expose-field","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Terra can only surface fields a provider exposes through its API.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Provider data fields and coverage","icon":"circle-question"}]},{"id":"MySfbt70nr9kWkw6srWh","title":"Can I get raw original Garmin FIT files?","pathname":"/faq/help-topics/something-else/provider-data-fields-and-coverage/raw-original-fit-files","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"The FIT files Terra delivers are generated from its internal unified data model, the same as the JSON standard payloads, not the raw original device FIT files.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Provider data fields and coverage","icon":"circle-question"}]},{"id":"cRqkx45sMn4C5iu6obyc","title":"How do I tell apart two hardware versions on one connection?","pathname":"/faq/help-topics/something-else/provider-data-fields-and-coverage/device-version-differentiation-in-payload","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Dexcom data is returned exactly as Dexcom's API provides it, without splitting by hardware version, so readings from two device generations on one account…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Provider data fields and coverage","icon":"circle-question"}]},{"id":"QhGAqL0yyzWzSJSLH3Rb","title":"Can speed be computed from position samples?","pathname":"/faq/help-topics/something-else/provider-data-fields-and-coverage/no-derived-metrics-from-samples","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Payloads reflect the raw data each provider supplies.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Provider data fields and coverage","icon":"circle-question"}]},{"id":"JSIG69y0M4zVVZ3w2tFA","title":"Do Apple Health nutrition values have per-entry timestamps?","pathname":"/faq/help-topics/something-else/provider-data-fields-and-coverage/apple-nutrition-per-entry-timestamps","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Yes.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Provider data fields and coverage","icon":"circle-question"}]},{"id":"X29kt2lSoOzwTUaHiMlj","title":"Is the Fitbit Charge 6 supported?","pathname":"/faq/help-topics/something-else/provider-data-fields-and-coverage/device-model-support","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Yes, the Charge 6 is supported.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Provider data fields and coverage","icon":"circle-question"}]},{"id":"jCetfrahwbvcwuxB0rnf","title":"Realtime, BLE and mobile delivery","pathname":"/faq/help-topics/something-else/realtime-ble-and-mobile-delivery","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Realtime, BLE and mobile delivery","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"CsbXlUwo5kDmGDgnqzDo","title":"Why is Samsung background delivery unsupported?","pathname":"/faq/help-topics/something-else/realtime-ble-and-mobile-delivery/android-background-delivery-limits","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Android background delivery is limited by deep-sleep battery optimisation, which suspends background tasks after a few hours.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Realtime, BLE and mobile delivery","icon":"circle-question"}]},{"id":"dZznxhhrAbSfCC7QxqAB","title":"Why won't the BLE widget find my Garmin watch?","pathname":"/faq/help-topics/something-else/realtime-ble-and-mobile-delivery/ble-streaming-requires-broadcast-mode","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"For BLE / realtime heart-rate streaming, the watch must be actively broadcasting.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Realtime, BLE and mobile delivery","icon":"circle-question"}]},{"id":"rwh2Nt0WTdrceQOUEnNM","title":"Why was my app rejected over health permission justifications?","pathname":"/faq/help-topics/something-else/realtime-ble-and-mobile-delivery/app-store-health-permission-rejection","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"When the Play Store rejects your app over its health/nutrition data permissions policy, respond to the review with a clear explanation of how your app uses…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Realtime, BLE and mobile delivery","icon":"circle-question"}]},{"id":"SdEP1Xmdo40vU7mPlaDg","title":"How do I set up realtime streaming?","pathname":"/faq/help-topics/something-else/realtime-ble-and-mobile-delivery/realtime-streaming-setup","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Setup depends on the device.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Realtime, BLE and mobile delivery","icon":"circle-question"}]},{"id":"wZZKRYzMDpUFaadepr7p","title":"Routing, webhooks and destinations","pathname":"/faq/help-topics/something-else/routing-webhooks-and-destinations","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Routing, webhooks and destinations","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"CPX3f2KvUI6k1S6G42JF","title":"Can I route different data types to different destinations?","pathname":"/faq/help-topics/something-else/routing-webhooks-and-destinations/per-destination-data-type-routing","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Per-destination data-type routing is not currently supported.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Routing, webhooks and destinations","icon":"circle-question"}]},{"id":"SCziRK5Q6apPhYlAsBhr","title":"Can I get alerts for stale user data?","pathname":"/faq/help-topics/something-else/routing-webhooks-and-destinations/stale-user-data-alerts","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Built-in staleness alerting isn't available.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Routing, webhooks and destinations","icon":"circle-question"}]},{"id":"LpTYVyeZNk6XN8B4cEoo","title":"Can I rate-limit backfill webhook delivery?","pathname":"/faq/help-topics/something-else/routing-webhooks-and-destinations/backfill-webhook-rate-limit","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"There's no configurable rate limit on backfill webhook delivery, so large multi-year backfills can produce a high request rate to your endpoint.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Routing, webhooks and destinations","icon":"circle-question"}]},{"id":"1uOGFmp6wdL9irRSfKEJ","title":"Can the Supabase destination use an existing project?","pathname":"/faq/help-topics/something-else/routing-webhooks-and-destinations/supabase-link-existing-project","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"The Supabase destination currently creates a new project in your organisation and cannot attach to an existing one.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Routing, webhooks and destinations","icon":"circle-question"}]},{"id":"TDBZf8JyhBKC2PXS7qyP","title":"Features, widgets and SDK tools","pathname":"/faq/help-topics/something-else/features-widgets-and-sdk-tools","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Features, widgets and SDK tools","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"Sc2USPZ4PYImRXT5VhrJ","title":"Can I push planned workouts to Zwift?","pathname":"/faq/help-topics/something-else/features-widgets-and-sdk-tools/push-planned-workouts-zwift","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"Pushing planned workouts only works for providers that expose a training-plan write API.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Features, widgets and SDK tools","icon":"circle-question"}]},{"id":"Vr3ZnVRgmqLV7XXnZhim","title":"Why does the Python client lack reference_id lookup?","pathname":"/faq/help-topics/something-else/features-widgets-and-sdk-tools/client-library-feature-parity","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"The Python client doesn't currently expose lookup by reference_id.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Features, widgets and SDK tools","icon":"circle-question"}]},{"id":"4azGTd8UyCgl444ICXX4","title":"Is there an API for the payload simulator?","pathname":"/faq/help-topics/something-else/features-widgets-and-sdk-tools/payload-simulator-programmatic-access","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Sample data is generated from the dashboard's payload simulator, which sends a generated payload to your configured destination using user_id, reference_id and…","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Features, widgets and SDK tools","icon":"circle-question"}]},{"id":"6mMPpC1L0DjSwmEhulQT","title":"Is there a hosted upload widget for blood reports?","pathname":"/faq/help-topics/something-else/features-widgets-and-sdk-tools/blood-report-upload-widget","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"A hosted file-upload widget for the blood report API is not currently offered.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Features, widgets and SDK tools","icon":"circle-question"}]},{"id":"KdgqnH0EkMyaJpQi0Arv","title":"Connections, auth and permissions","pathname":"/faq/help-topics/something-else/connections-auth-and-permissions","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Connections, auth and permissions","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"GeuWW06kCGF2FSUDPc1N","title":"How do I check if the HealthKit prompt was shown?","pathname":"/faq/help-topics/something-else/connections-auth-and-permissions/check-healthkit-connection-state","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"HealthKit doesn't expose whether permissions were granted, but you can check whether a connection was previously created","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Connections, auth and permissions","icon":"circle-question"}]},{"id":"eA01HOmD4BESl6TVFHZZ","title":"Can the auth webhook include the provider user ID?","pathname":"/faq/help-topics/something-else/connections-auth-and-permissions/provider-native-user-id-in-auth","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"The auth webhook payload can't currently include the provider's native user ID.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Connections, auth and permissions","icon":"circle-question"}]},{"id":"ndXIWBRIrbe4k66DGVAr","title":"Can I be notified when users connect a disabled provider?","pathname":"/faq/help-topics/something-else/connections-auth-and-permissions/notify-on-disabled-provider-connect","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Data only flows for providers enabled in the connections dashboard, so always confirm a provider is enabled there before users connect it.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Connections, auth and permissions","icon":"circle-question"}]},{"id":"edIJB4rhLIJ44MYHn8bT","title":"Can provider permissions be auto-selected on consent?","pathname":"/faq/help-topics/something-else/connections-auth-and-permissions/auto-select-permissions-consent","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Health permissions cannot be pre-selected on the provider's consent screen.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Connections, auth and permissions","icon":"circle-question"}]},{"id":"JLGGbPZlXlNRJ2kOQABI","title":"Which providers have mandatory scopes?","pathname":"/faq/help-topics/something-else/connections-auth-and-permissions/provider-mandatory-scopes","siteSpaceId":"sitesp_2ppMq","icon":"table","description":"Some providers require specific scopes, and authentication fails with an insufficient or missing scopes error if they aren't granted.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Connections, auth and permissions","icon":"circle-question"}]},{"id":"zMvojH4UXysDTLTpl6lW","title":"Provider rules and restrictions","pathname":"/faq/help-topics/something-else/provider-rules-and-restrictions","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Provider rules and restrictions","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"TvhEjB4mbfVQNOJzUtOY","title":"What are my options under Strava's display restriction?","pathname":"/faq/help-topics/something-else/provider-rules-and-restrictions/strava-third-party-display-restriction","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Strava's API terms prohibit third-party apps from displaying a user's activity data to anyone other than the user themselves, even with explicit consent.","breadcrumbs":[{"label":"FAQ"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Provider rules and restrictions","icon":"circle-question"}]}]}