{"version":1,"pages":[{"id":"dN4JJgahzIWBaUvOWh2F","title":"Terra documentation","pathname":"/","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Getting Started"}]},{"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"}]},{"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"}]},{"id":"qbVlof1gkimTh2hlNhHi","title":"Overview","pathname":"/unified-api/getting-started","siteSpaceId":"sitesp_x290K","description":"One API for health data from 500+ wearables and apps, delivered to you as it arrives.","breadcrumbs":[{"label":"Docs"},{"label":"Unified API"}]},{"id":"e6qszDGhRFFjgiC4stsR","title":"Quickstart","pathname":"/unified-api/quickstart","siteSpaceId":"sitesp_x290K","description":"Connect a wearable and see its data arrive, in four steps from the Terra dashboard.","breadcrumbs":[{"label":"Docs"},{"label":"Unified API"}]},{"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"}]},{"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"},{"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"},{"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"},{"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"},{"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"},{"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"},{"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"},{"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"},{"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"},{"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"},{"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"},{"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"},{"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"},{"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"}]},{"id":"P13r9NYl7vCPSbsaFOIC","title":"Authentication flow","pathname":"/unified-api/user-authentication/authentication-flow","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API"},{"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"},{"label":"User authentication"}]},{"id":"JiIXjDZCbk1RZB2rebyO","title":"Legacy widget (generateWidgetSession)","pathname":"/unified-api/user-authentication/implementation-terra-widget/implementation-terra-widget-legacy","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API"},{"label":"User authentication"},{"label":"Implementation (Terra widget)"}]},{"id":"VAS36MDVrwKWE8GUApVq","title":"Implementation (Custom UI)","pathname":"/unified-api/user-authentication/implementation-custom-ui","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API"},{"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"},{"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"},{"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"}]},{"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"},{"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"},{"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"},{"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"}]},{"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"},{"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"},{"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"},{"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"},{"label":"Mobile-only sources"}]},{"id":"GkzqC8IQfrNbXipmDHwE","title":"Strength training data","pathname":"/unified-api/strength-training","siteSpaceId":"sitesp_x290K","description":"Read per-set strength training data — exercises, sets, reps and load — from the activity payload","breadcrumbs":[{"label":"Docs"},{"label":"Unified API"}]},{"id":"npI9RXCfjOORp8VSfTj0","title":"Activity Types Reference","pathname":"/unified-api/activity-types","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API"}]},{"id":"0hBDHJCU1WGHZCUuvDWv","title":"Troubleshooting","pathname":"/unified-api/debugging-faq","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Unified API"}]},{"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"}]},{"id":"7IXGb0mLfUk8Zw4NqSml","title":"Overview","pathname":"/ai-interface/ai-interface","siteSpaceId":"sitesp_x290K","description":"Let your AI agents read a user's health data directly over MCP, without building an API integration, handling webhooks, or storing and parsing data yourself.","breadcrumbs":[{"label":"Docs"},{"label":"AI Interface"}]},{"id":"wiQEfYbFs9jtrhhKwCAB","title":"Error states","pathname":"/ai-interface/error-states","siteSpaceId":"sitesp_x290K","description":"The HTTP statuses and error detail strings Terra AI guarantees, split by whether the failure happens before or after a tool call starts.","breadcrumbs":[{"label":"Docs"},{"label":"AI Interface"}]},{"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":"ngzOE4EQXvbVZbh6SNGd","title":"Overview","pathname":"/graphs/graphs","siteSpaceId":"sitesp_x290K","description":"Build a chart of your users' health data in the Terra dashboard, then drop it into your product.","breadcrumbs":[{"label":"Docs"},{"label":"Graphs"}]},{"id":"W71JXtKBmo8HLNw81LiD","title":"Embedding graphs","pathname":"/graphs/embedding","siteSpaceId":"sitesp_x290K","description":"Put a graph you built in the dashboard into your web or mobile app.","breadcrumbs":[{"label":"Docs"},{"label":"Graphs"}]},{"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"}]},{"id":"yiw2pwEE03hqah6IhAH2","title":"Overview","pathname":"/planned-workouts-api/overview","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API"}]},{"id":"4bJvC3RRkI6aUBcupmVv","title":"Introduction","pathname":"/planned-workouts-api/introduction","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API"}]},{"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"}]},{"id":"NQ9hfFptbGHniBHpnXyk","title":"Core Concepts","pathname":"/planned-workouts-api/core-concepts","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API"}]},{"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"}]},{"id":"1WBeqVzAtVV8Csi8T1Dw","title":"Athlete Parameters","pathname":"/planned-workouts-api/athlete-parameters","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API"}]},{"id":"6Dx2UhecSrdZC694nOZT","title":"Provider compatibility","pathname":"/planned-workouts-api/provider-compatibility","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API"}]},{"id":"sYol1k2mDM5oUhac5ZqA","title":"Coercion Warnings","pathname":"/planned-workouts-api/coercion-warnings","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API"}]},{"id":"yI6alwFFLcvlZ6T7e0d5","title":"Exercise Reference","pathname":"/planned-workouts-api/exercise-reference","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Planned Workouts API"}]},{"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"}]},{"id":"ZMFBA4vB0mGf8EyPns0Q","title":"Overview","pathname":"/streaming-api/getting-started","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API"}]},{"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"}]},{"id":"1e0LLNGbfyPWYiAM5CFT","title":"Wearable -> Your app","pathname":"/streaming-api/connect-wearable-to-sdk","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API"}]},{"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"},{"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"},{"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"},{"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"},{"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"}]},{"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"},{"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"},{"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"},{"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"},{"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"}]},{"id":"mn7BUZK5NPEaUDYXWe9u","title":"Data Types Reference","pathname":"/streaming-api/data-types","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Streaming API"}]},{"id":"xJk9LO2xp0gyY2Axz7q9","title":"Overview","pathname":"/integration-partners/overview","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Integration Partners"}]},{"id":"EQYib7cOIQUoEu0BOLRS","title":"How the integration works","pathname":"/integration-partners/how-the-integration-works","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Integration Partners"}]},{"id":"b0kpH1K6H8jNoPcB7As4","title":"Submitting an Application","pathname":"/integration-partners/submitting-an-application","siteSpaceId":"sitesp_x290K","description":"","breadcrumbs":[{"label":"Docs"},{"label":"Integration Partners"}]},{"id":"aW1anNgx114LO2OUExsT","title":"Overview","pathname":"/lab-reports/lab-reports","siteSpaceId":"sitesp_x290K","description":"Convert lab report and DXA scan PDFs into structured, standardized biomarker data via a simple REST API.","breadcrumbs":[{"label":"Docs"},{"label":"Lab Reports"}]},{"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"}]},{"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"}]},{"id":"J3DNIV3OYbOmdoJVFtiu","title":"Scans (DEXA)","pathname":"/lab-reports/scans","siteSpaceId":"sitesp_x290K","description":"DXA body-composition and bone-density scans go through the same upload endpoint as lab reports. This page covers what is different about the results.","breadcrumbs":[{"label":"Docs"},{"label":"Lab Reports"}]},{"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"}]},{"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"}]},{"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"}]},{"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"}]},{"id":"gN1MRYWrrcVAn4xJAtnh","title":"Migrating from the legacy API","pathname":"/lab-reports/migrating-from-legacy","siteSpaceId":"sitesp_x290K","description":"Move from the legacy report upload endpoint to /v2/reports. Endpoint, auth, payload and webhook changes, with a field-by-field mapping.","breadcrumbs":[{"label":"Docs"},{"label":"Lab Reports"}]},{"id":"arsbvkgEOhmEF7CDaf7N","title":"Overview","pathname":"/vantage-api/overview","siteSpaceId":"sitesp_x290K","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":"Docs"},{"label":"Vantage API"}]},{"id":"tCjhw7ZCeONQOtv1XMC8","title":"Account setup and authentication","pathname":"/vantage-api/account-setup-and-api-keys","siteSpaceId":"sitesp_x290K","description":"How to get Vantage API access, authenticate your requests, and configure the webhook endpoint that receives order and result updates.","breadcrumbs":[{"label":"Docs"},{"label":"Vantage API"}]},{"id":"EY98Zm4lhdNDPYJjO2Yt","title":"Core concepts","pathname":"/vantage-api/core-concepts","siteSpaceId":"sitesp_x290K","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":"Docs"},{"label":"Vantage API"}]},{"id":"29cqqAxFMFWtlfQk9hkd","title":"Ordering your first test","pathname":"/vantage-api/ordering-your-first-test","siteSpaceId":"sitesp_x290K","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":"Docs"},{"label":"Vantage API"}]},{"id":"xmhnKUcuYCIv4Ss1tRbk","title":"Working with Sandbox","pathname":"/vantage-api/working-with-sandbox","siteSpaceId":"sitesp_x290K","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":"Docs"},{"label":"Vantage API"}]},{"id":"Wb5XpOuq9xZr6DPiXHOP","title":"Webhooks","pathname":"/vantage-api/webhooks","siteSpaceId":"sitesp_x290K","description":"How Vantage API delivers order and result updates to your endpoint: event families and payloads, HMAC signature verification, and retry semantics.","breadcrumbs":[{"label":"Docs"},{"label":"Vantage API"}]},{"id":"L1PDVRbuILbVZCmfveDe","title":"Managing orders","pathname":"/vantage-api/managing-orders","siteSpaceId":"sitesp_x290K","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":"Docs"},{"label":"Vantage API"}]},{"id":"8V595im0QyMDiHDjhbZu","title":"Test Collection Methods","pathname":"/vantage-api/test-collection-methods","siteSpaceId":"sitesp_x290K","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":"Docs"},{"label":"Vantage API"}]},{"id":"JjlJ0ZwxRYCvaDzeZfz8","title":"Results","pathname":"/vantage-api/results","siteSpaceId":"sitesp_x290K","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":"Docs"},{"label":"Vantage API"}]},{"id":"aeCAClITSANwgTcShMMF","title":"Errors","pathname":"/vantage-api/errors","siteSpaceId":"sitesp_x290K","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":"Docs"},{"label":"Vantage API"}]},{"id":"HcaX0HjJGbwtak5XMMg2","title":"Monitoring and debugging","pathname":"/vantage-api/monitoring","siteSpaceId":"sitesp_x290K","description":"Observe your integration in production: the analytics overview endpoint, webhook delivery outcomes, and how to debug missed webhooks.","breadcrumbs":[{"label":"Docs"},{"label":"Vantage API"}]},{"id":"gJKlK6wxM4pys6Fne1ib","title":"Best practices","pathname":"/vantage-api/best-practices","siteSpaceId":"sitesp_x290K","description":"Patterns that keep a Vantage integration robust: webhook handling, deduplication, safe retries, ID handling, and result delivery done right.","breadcrumbs":[{"label":"Docs"},{"label":"Vantage API"}]},{"id":"7mlkuBjTPFgGev2iUfE1","title":"Acknowledging Results","pathname":"/vantage-api/acknowledging-results","siteSpaceId":"sitesp_x290K","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":"Docs"},{"label":"Vantage API"}]},{"id":"2kEBmSVzRgxudsJ4iXGC","title":"Going to production","pathname":"/vantage-api/going-to-production","siteSpaceId":"sitesp_x290K","description":"A checklist for moving your Vantage integration from sandbox to production safely.","breadcrumbs":[{"label":"Docs"},{"label":"Vantage API"}]},{"id":"FQhHNm5FLkJFJVotQqGu","title":"REST API Endpoints","pathname":"/reference","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Unified 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":"Unified 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":"Unified API"}]},{"id":"cy46X4ojl34wlysLBl1P","title":"Event Types","pathname":"/reference/health-and-fitness-api/event-types","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Unified API"}]},{"id":"1tWjoDbv4xvNTYgArD5i","title":"Data models","pathname":"/reference/health-and-fitness-api/data-models","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Unified API"}]},{"id":"heLEGuSoAb68aED0A4V5","title":"Samples","pathname":"/reference/health-and-fitness-api/samples","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Unified API"}]},{"id":"LKWyfkQuiVmbM97s6zEi","title":"Core concepts","pathname":"/reference/health-and-fitness-api/core-concepts","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Unified API"}]},{"id":"I4gaLvxIX9YPJONQJfhk","title":"Rate Limits","pathname":"/reference/health-and-fitness-api/rate-limits","siteSpaceId":"sitesp_6ihJs","breadcrumbs":[{"label":"API Reference"},{"label":"Unified API"}]},{"id":"3pkvWBzMWt81SSqUw4ui","title":"Destinations","pathname":"/reference/health-and-fitness-api/destinations","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Unified 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":"Unified 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":"Unified 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":"Unified 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":"Unified 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":"Unified 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":"Unified 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"}]},{"id":"9kmv6hBh9Egd2q0re444","title":"Core Concepts","pathname":"/reference/teams-api/core-concepts","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Teams API"}]},{"id":"ZALEuNfebosOCQUBhZPI","title":"API Endpoints","pathname":"/reference/teams-api/api-endpoints","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Teams API"}]},{"id":"2zPHvBrpP6u7v00MX1LI","title":"Event types","pathname":"/reference/teams-api/event-types","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Teams API"}]},{"id":"d6e23d00cab785cad6660c16ef403c60fb5a4169","title":"Activation","pathname":"/reference/vantage-api/activation","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Vantage API"}]},{"id":"e642c27236ecfb9dc1d8995d20615b67c1700f23","title":"Clients","pathname":"/reference/vantage-api/clients","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Vantage API"}]},{"id":"95f4d26dd5b2a5e5a7f34fc7324bb6ee15d384da","title":"Orders","pathname":"/reference/vantage-api/orders","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Vantage API"}]},{"id":"5f195344d3eb2ee9f744ee4708daaaba6799e630","title":"Products","pathname":"/reference/vantage-api/products","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Vantage API"}]},{"id":"f4d18a46dc6790fe33fa77796018e54e9fd5437b","title":"Results","pathname":"/reference/vantage-api/results","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Vantage API"}]},{"id":"2e417017ad0772ae0768f2ac51e81c7a480f25f8","title":"Labs","pathname":"/reference/vantage-api/labs","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Vantage API"}]},{"id":"bc0fa6dada49a41ff3f82a83648123d72220d8ab","title":"Analytics","pathname":"/reference/vantage-api/analytics","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Vantage API"}]},{"id":"f4ffc70f727907ef1ba254aa3b9de7a333316337","title":"Terra Vantage API","pathname":"/reference/vantage-api/terra-vantage-api","siteSpaceId":"sitesp_6ihJs","description":"","breadcrumbs":[{"label":"API Reference"},{"label":"Vantage API"}]},{"id":"ac5745c2cac5cccb6fec73338c645e6da92460a1","title":"Models","pathname":"/reference/vantage-api/models","siteSpaceId":"sitesp_6ihJs","breadcrumbs":[{"label":"API Reference"},{"label":"Vantage API"}]},{"id":"FD0zIrBT1OkTv6yTfZEE","title":"Overview","pathname":"/developer-tools","siteSpaceId":"sitesp_lLTIp","description":"Give your AI coding agent what it needs to build a Terra integration.","breadcrumbs":[{"label":"Developer Tools"}]},{"id":"YBiJw8ekFYr6mYeU5jDA","title":"Agent skills","pathname":"/developer-tools/agent-skills","siteSpaceId":"sitesp_lLTIp","description":"","breadcrumbs":[{"label":"Developer Tools"}]},{"id":"BrgMjDloHmMHDViQcP8E","title":"Overview","pathname":"/developer-tools/terra-cli/terra-cli","siteSpaceId":"sitesp_lLTIp","description":"Set up, manage, and debug your Terra integration from the terminal.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Terra CLI"}]},{"id":"8K9j91vlGwd1h21aS1JM","title":"Installation","pathname":"/developer-tools/terra-cli/installation","siteSpaceId":"sitesp_lLTIp","description":"Install the Terra CLI with Homebrew, npm or your coding agent's plugin, keep it up to date, and set up shell completion.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Terra CLI"}]},{"id":"OvTMnutPID8dWvwevZeC","title":"Authentication","pathname":"/developer-tools/terra-cli/authentication","siteSpaceId":"sitesp_lLTIp","description":"Log in to the Terra CLI interactively, from CI, or without a browser, and manage the token it stores.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Terra CLI"}]},{"id":"nh80HGez0hHTRSMlh8tB","title":"Ask the docs","pathname":"/developer-tools/terra-cli/ask","siteSpaceId":"sitesp_lLTIp","description":"Ask a question about Terra from the terminal and get an answer from the documentation, with the pages it came from.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Terra CLI"}]},{"id":"x9sL790je2YjnDM7G0CT","title":"Configuration","pathname":"/developer-tools/terra-cli/configuration","siteSpaceId":"sitesp_lLTIp","description":"How the Terra CLI resolves settings, picks an environment, and uses profiles and environment variables.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Terra CLI"}]},{"id":"BSjhNLRIZwjdoBFXQUKG","title":"Output and scripting","pathname":"/developer-tools/terra-cli/output-and-scripting","siteSpaceId":"sitesp_lLTIp","description":"Output formats, field selection, jq filtering, pagination, exit codes, and how to debug a failing Terra CLI command.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Terra CLI"}]},{"id":"JtKnBr3kjPOWSBwFg3rU","title":"Guardrails","pathname":"/developer-tools/terra-cli/guardrails","siteSpaceId":"sitesp_lLTIp","description":"Preview requests, understand credential output, and use confirmation prompts, idempotency keys, retries, and timeouts.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Terra CLI"}]},{"id":"1ZuNMg8tXNWWIHhD3Rbe","title":"Raw API requests","pathname":"/developer-tools/terra-cli/raw-requests","siteSpaceId":"sitesp_lLTIp","description":"Reach any Terra admin API or data API endpoint by path with terra api and terra data-api.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Terra CLI"}]},{"id":"ahrduprJxUpcoUb1FOeN","title":"Coding agents","pathname":"/developer-tools/terra-cli/coding-agents","siteSpaceId":"sitesp_lLTIp","description":"Give a coding agent the Terra CLI so it can configure and debug your integration instead of asking you to click through the dashboard.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Terra CLI"}]},{"id":"ReaNcULUUNE3vXlnYDWu","title":"Command reference","pathname":"/developer-tools/terra-cli/command-reference","siteSpaceId":"sitesp_lLTIp","description":"Every Terra CLI command group, the flags all commands share, and how to print the full reference from the CLI.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Terra CLI"}]},{"id":"ttHv6CXRPjrRphV9gLo4","title":"Overview","pathname":"/developer-tools/example-apps/example-apps","siteSpaceId":"sitesp_lLTIp","description":"Complete apps built on Terra. Scaffold one with a single command.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Example apps"}]},{"id":"XJHY75aQP2BbLEDQP9Wb","title":"Unified API Example","pathname":"/developer-tools/example-apps/terra-basecamp","siteSpaceId":"sitesp_lLTIp","description":"A complete Unified API integration: wearable connections, webhook ingestion, multi-device deduplication, a live dashboard, and an AI health assistant.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Example apps"}]},{"id":"bOTOuEOK9smIROFHu4nd","title":"Streaming Mobile Example","pathname":"/developer-tools/example-apps/terra-grip","siteSpaceId":"sitesp_lLTIp","description":"A React Native reference app for the Streaming API: pair a wearable, stream live biometrics to Terra, and render them on screen. No backend, no keys on the device.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Example apps"}]},{"id":"rnOPaJeoZ9V0WcNKYlHT","title":"Streaming Web Example","pathname":"/developer-tools/example-apps/terra-pulse","siteSpaceId":"sitesp_lLTIp","description":"A React web app for the Streaming API: connect to Terra as a consumer, receive live biometrics over a WebSocket, and render them on a real-time dashboard.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Example apps"}]},{"id":"zQhRyWQrCXz0QPd8qRAq","title":"Lab Reports Example","pathname":"/developer-tools/example-apps/terra-panel","siteSpaceId":"sitesp_lLTIp","description":"A clinician dashboard on the Lab Reports API: upload a lab report PDF, get standardized biomarkers, and read them against the patient's wearable history.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Example apps"}]},{"id":"wmZq6bh0aByE0kHLdTkt","title":"Vantage Example","pathname":"/developer-tools/example-apps/terra-dispatch","siteSpaceId":"sitesp_lLTIp","description":"A diagnostics storefront and ops console on the Vantage API: order blood and DNA test kits, track fulfilment, and deliver FHIR results.","breadcrumbs":[{"label":"Developer Tools"},{"label":"Example apps"}]},{"id":"njH9eu74kH4nq2PaW1uB","title":"Help Center","pathname":"/help-center","siteSpaceId":"sitesp_2ppMq","icon":"life-ring","description":"","breadcrumbs":[{"label":"Help Center"}]},{"id":"VRuVEZHe8m3vr7EcAyxQ","title":"API, SDK & data formats","pathname":"/help-center/help-topics/data-api-sdk","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"The API, the SDKs, data fields, formats and provider coverage.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"}]},{"id":"ZTTnTO9a1fzIOIWS5EuE","title":"Mobile SDK setup, permissions and crashes","pathname":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"IuTmKR6P0uv8PGQU1tIq","title":"Can I connect Apple Health from a web app?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Mobile SDK setup, permissions and crashes","icon":"code"}]},{"id":"Qt0m3mI7SV2yLWJQ31x2","title":"Why do Apple Health payloads show zero steps or arrive several times?","pathname":"/help-center/help-topics/data-api-sdk/mobile-sdk-setup-permissions-and-crashes/ios-sdk-zeroed-or-duplicate-apple-payloads","siteSpaceId":"sitesp_2ppMq","icon":"mobile-screen","description":"Older versions of the iOS SDK caused both. Upgrade to 1.9.2 or later.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Webhooks, dedup and sync reliability","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"oz78tUzOWlaCozkuByah","title":"Why are daily step totals inconsistent across webhooks?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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 come from sync timing, field definitions or Oura's two views of sleep stages","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/data-api-sdk/webhooks-dedup-and-sync-reliability/track-webhook-request-completion","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"The API response to a to_webhook=true request returns a reference field in its JSON body, and the webhook deliveries for that request carry the same value in their terra-reference header.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"PaHcPet7EvTdIVYckq9D","title":"Do you support CGMs like Dexcom?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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 doesn't provide time-in-zones. Strength sets and reps are available.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/vald-team-sports-integration","siteSpaceId":"sitesp_2ppMq","icon":"life-ring","description":"Vald is supported and exposes test/measurement data.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"MZ4kshKnglT8kI4VMSso","title":"Why does /v2/athlete return no data, or no age or sex for some providers?","pathname":"/help-center/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/athlete-endpoint-provider-coverage","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"/v2/athlete sends its result to your destination unless you set to_webhook=false, and the profile fields it returns depend on the provider.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"8VWhxUNSgiL9Bxln3eoF","title":"Why are HRV and resting heart rate null on some Garmin sleep records?","pathname":"/help-center/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/garmin-sleep-hrv-resting-hr-null","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Garmin sleep HRV and resting heart rate come from separate Garmin summaries, so they can be empty on a sleep record until those summaries arrive.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"qxfRQqrzEkDLBRM9BqmS","title":"What data does Google Health deliver, and how does it differ from Fitbit?","pathname":"/help-center/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/google-health-data-coverage","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Google Health delivers activity, sleep, daily, body and nutrition payloads, but some fields Fitbit fills, such as workout heart rate series, sleep heart rate and BMR calories, are not currently includ","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"vq8kG6nZe6hxKXvq3DMs","title":"What does TrainingPeaks need a premium account for?","pathname":"/help-center/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/trainingpeaks-premium-account-requirements","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"TrainingPeaks limits basic athletes to activity summaries, so detailed workout metrics, daily, body and sleep data, and future planned workouts need the athlete on a premium TrainingPeaks account.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Provider coverage and per-provider data availability","icon":"code"}]},{"id":"yNqTAinAtdZ3dDD3hwEk","title":"When does WHOOP daily data arrive, and why don't my WHOOP numbers match the WHOOP app?","pathname":"/help-center/help-topics/data-api-sdk/provider-coverage-and-per-provider-data-availability/whoop-cycles-daily-and-app-differences","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"WHOOP daily data is fetched when WHOOP reports a new recovery or workout, and each day is dated by the local date its WHOOP cycle starts.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/data-api-sdk/data-model-fields-and-units","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Data model, fields and units","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"jmat0zSZSXXdRVh5pDeG","title":"Why are so many data fields null?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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, and resting HR on sleep depends on the provider.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Data model, fields and units","icon":"code"}]},{"id":"MrpmJVhfAwQ4uVGCyOxc","title":"Why doesn't Clue's cycle length match the app?","pathname":"/help-center/help-topics/data-api-sdk/data-model-fields-and-units/clue-cycle-records","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"A Clue record with is_predicted_cycle set to true belongs to a cycle Clue has not completed yet, so its cycle length is Clue's current projection.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/data-api-sdk/authentication-users-and-connection-state","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Authentication, users and connection state","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"cjmqQs1FgMu1MpxEOQDM","title":"How do I deauthenticate users in bulk?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/data-api-sdk/api-endpoints-errors-and-migrations","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"API endpoints, errors and migrations","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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 404 connection does not support data type error?","pathname":"/help-center/help-topics/data-api-sdk/api-endpoints-errors-and-migrations/unsupported-data-type-per-provider","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"A 404 invalid data type saying this connection does not support the requested data type means the connected provider does not offer that data type.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/data-api-sdk/historical-data-and-backfill","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Historical data and backfill","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"BIR3pxVRJ7qSC7TdPkyR","title":"Why does Apple Health backfill return empty arrays?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/data-api-sdk/historical-data-and-backfill/provider-rate-limits-backfill","siteSpaceId":"sitesp_2ppMq","icon":"triangle-exclamation","description":"A 424 with \"request failed due to a provider rate limit issue\" means the provider has rate limited the requests, per user or per developer app depending on the provider.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"MpoQaVrfTi6itqoWqd78","title":"Why doesn't today's data come back when I set end_date to today?","pathname":"/help-center/help-topics/data-api-sdk/historical-data-and-backfill/end-date-exclusive-today","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"end_date is exclusive and a plain date means midnight UTC at the start of that day, so end_date set to today stops before today begins.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Historical data and backfill","icon":"code"}]},{"id":"xxJQn6f5NncrMvml69Pq","title":"Why do Oura pulls fail with a provider rate limit error when my request is small?","pathname":"/help-center/help-topics/data-api-sdk/historical-data-and-backfill/own-credentials-isolated-rate-limit","siteSpaceId":"sitesp_2ppMq","icon":"triangle-exclamation","description":"Oura rate limits apply to the whole developer app as well as to each user, so a short request can fail when the app it runs through has hit its limit.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"50b70m50pJxd7ISVZxVY","title":"What does 'user limit reached' mean in testing?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/data-api-sdk/account-config-environments-and-going-live/scopes-permissions-config","siteSpaceId":"sitesp_2ppMq","icon":"triangle-exclamation","description":"A data type is not enabled or no-permissions error usually means that data type is disabled in your dashboard configuration.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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' SDK provider reads Health Connect on the device and needs no migration, but users on the web Google connection should move to Google Health.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/data-api-sdk/account-config-environments-and-going-live/samsung-empty-scopes-field","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The scopes field is informational, so it can be empty for SDK-based on-device connections and for sign-in providers like Clue without affecting data flow.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/data-api-sdk/account-config-environments-and-going-live/fitbit-to-google-migration","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Move Fitbit users to the Google Health connection, because Terra's Fitbit connection runs on the legacy Fitbit Web API that Google is deprecating.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/data-api-sdk/realtime-streaming-and-ble","siteSpaceId":"sitesp_2ppMq","icon":"code","description":"Realtime streaming and BLE","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"G8irbAms0uJ7YCzR8q9q","title":"Which providers support real-time streaming?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"}]},{"id":"MboHXIqpwMObfqWphaSD","title":"Why are data_enrichment health scores null?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/teams-api","siteSpaceId":"sitesp_2ppMq","icon":"credit-card","description":"The Teams API is available and webhook-based.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Extra features: scores, graphs, teams, nutrition, CGM","icon":"code"}]},{"id":"IhjQve5cubw5yJ3OkT5n","title":"Why does scheduling a planned workout return 424, and is it retried?","pathname":"/help-center/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/planned-workout-424-and-retries","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"A 424 when scheduling a planned workout means Terra couldn't confirm the push and saved nothing. Terra does not retry it.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"API, SDK & data formats","icon":"code"},{"label":"Extra features: scores, graphs, teams, nutrition, CGM","icon":"code"}]},{"id":"BXiz9mXpSfNSzMur0n7W","title":"How do I read planned workouts from TrainingPeaks?","pathname":"/help-center/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/trainingpeaks-read-planned-workouts","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"List a TrainingPeaks user's planned workouts with GET /plannedWorkouts and a date window, after enabling Planned Workouts for your environment.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/no-data","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Data not showing up, stopped, delayed, or missing from payloads.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"}]},{"id":"nmzcRaYs57yK5ncgMM6A","title":"Connected but no data arriving","pathname":"/help-center/help-topics/no-data/connected-but-no-data-arriving","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Connected but no data arriving","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/no-data/webhooks-background-delivery-stopping","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Webhooks & background delivery stopping","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"}]},{"id":"HFBT2JqJ2oZcowc0xkRF","title":"How do I enable Apple Health background delivery?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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 WHOOP webhook setup: the webhook URL, its version, or the certificate on your subdomain, not your own endpoint.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/no-data/connections-expiring-disconnecting","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Connections expiring & disconnecting","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Connections expiring & disconnecting","icon":"wifi-slash"}]},{"id":"UMlpWXxPctIzv31RNwgR","title":"Why do my users' connections keep disappearing on their own?","pathname":"/help-center/help-topics/no-data/connections-expiring-disconnecting/connections-removed-by-deauthenticate-calls","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Check your own backend first: a call to /auth/deauthenticateUser removes the connection straight away, even if the user didn't ask to disconnect.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/no-data/historical-backfill-returns-nothing","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Historical backfill returns nothing","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"}]},{"id":"htFEURnpkd1UutXoBbvS","title":"Why does Polar return no historical data?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/no-data/historical-backfill-returns-nothing/historical-backfill-endpoints-and-gaps","siteSpaceId":"sitesp_2ppMq","icon":"clock-rotate-left","description":"Yes.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/no-data/missing-fields-data-types-in-payloads/garmin-thirdparty-imports-excluded","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Activities another platform synced into Garmin Connect generally don't come through Garmin, but not every activity has to be recorded on a Garmin device.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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 sample arrays, laps or GPS empty when summaries are populated?","pathname":"/help-center/help-topics/no-data/missing-fields-data-types-in-payloads/with-samples-flag-required","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Sample arrays are removed whenever Include Samples is off for your environment, unless a data request explicitly sets with_samples=true.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/no-data/auth-scopes-user-id-matching","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Auth, scopes & user ID matching","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/no-data/auth-scopes-user-id-matching/reauth-webhook-user-id-changes","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"A reconnect issues a new Terra user ID, and user_reauth links it to the old one only if the old connection was still active on the same provider account when the user reconnected.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/no-data/delivery-delays-lag","siteSpaceId":"sitesp_2ppMq","icon":"wifi-slash","description":"Delivery delays & lag","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"My data isn't arriving","icon":"wifi-slash"},{"label":"Delivery delays & lag","icon":"wifi-slash"}]},{"id":"J2m1wg9qglYB7l9wpwEI","title":"Why does Zepp or Amazfit data arrive late or with low step totals?","pathname":"/help-center/help-topics/no-data/delivery-delays-lag/zepp-amazfit-sync-delay","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Zepp data reaches Terra only after the watch has synced it to Zepp, and Terra then picks it up on its next check.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/connecting","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Connecting providers, the auth widget, credentials, OAuth and approvals.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"}]},{"id":"IOpVNlV8xvCKWMJbUXf4","title":"Setting up provider credentials (bring-your-own keys)","pathname":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"W2D6qwqriGaWTJrSwR4Q","title":"How do I set up WHOOP provider credentials?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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 the domain Terra redirects through.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Setting up provider credentials (bring-your-own keys)","icon":"plug"}]},{"id":"Lj1Op6CZ9bFNvrBWPqgX","title":"Why does WHOOP auth fail with unknown_error after the user approves?","pathname":"/help-center/help-topics/connecting/setting-up-provider-credentials-bring-your-own-keys/whoop-invalid-client-unknown-error","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The usual cause is a Client ID or Secret saved in Terra that doesn't match your WHOOP app, so WHOOP rejects the token exchange.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"llcNbiohDFaySF2mI3Ms","title":"Why is user_id None for Apple Health in the widget?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/connecting/regional-and-account-restrictions","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Regional and account restrictions","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"OMIQTU04F7cb8tSDTXAf","title":"Why can't I connect MyFitnessPal?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Regional and account restrictions","icon":"plug"}]},{"id":"3mI10T8SkNebwrwvxmhF","title":"Are Peloton or Technogym still available?","pathname":"/help-center/help-topics/connecting/regional-and-account-restrictions/discontinued-integrations","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"No. Peloton and Technogym are no longer available as Terra integrations, so users cannot connect them.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"ejQ6Nk4vg4dskLTPBFRc","title":"Can end users manage their own connections?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/connecting/choosing-and-managing-connections-in-the-widget/integrations-list-source-of-truth","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"The Connections page in your dashboard is the reliable view of what you can enable; the /v2/integrations endpoint and public lists are not.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/connecting/oauth-webview-and-sign-in-failures","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"OAuth, WebView and sign-in failures","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"ejtxxP2fZP1YGpuLwAJl","title":"Why does OAuth fail inside an in-app WebView?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"OAuth, WebView and sign-in failures","icon":"plug"}]},{"id":"CB7LOoWdfpxgpwdYDdZL","title":"Why does Withings or Garmin authorisation open the provider's app and never complete?","pathname":"/help-center/help-topics/connecting/oauth-webview-and-sign-in-failures/provider-app-handoff-auth-stalls","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"When the provider's own app is installed, the phone can hand the authorisation link to that app instead of keeping it in the browser, and the flow can stall there.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/connecting/connection-errors-and-api-responses","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Connection errors and API responses","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"Hjli6gR5wYQdc3JvmPZ3","title":"Why do my requests return 401 in production?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Connection errors and API responses","icon":"plug"}]},{"id":"P8DHdxDExdWU4er8QsmC","title":"Why do Strava requests fail with \"Failed to fetch user data\"?","pathname":"/help-center/help-topics/connecting/connection-errors-and-api-responses/strava-app-inactive-failed-to-fetch","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"A common cause is that Strava has marked your Strava API app as inactive.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/connecting/end-user-authentication-and-sso","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"End-user authentication and SSO","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"6z6J23tdohTqgbGb3Lp0","title":"Can SSO users connect a password-based provider?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/connecting/end-user-authentication-and-sso/multiple-providers-one-user","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"Yes.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/connecting/getting-a-provider-developer-app-approved","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Getting a provider developer app approved","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"4Am81exHBtQS6JiqhjiV","title":"How do I lift Strava's one-athlete limit?","pathname":"/help-center/help-topics/connecting/getting-a-provider-developer-app-approved/strava-production-app-and-athlete-limit","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Upgrade to 10 athletes yourself in Strava's API settings, then submit for review to go beyond that.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/connecting/getting-a-provider-developer-app-approved/whoop-device-required-for-account","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"No. A standard WHOOP account is enough to create a WHOOP developer app.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/connecting/getting-a-provider-developer-app-approved/whoop-approval-slow-no-expedite","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"WHOOP approves developer apps directly and Terra cannot expedite it. Until WHOOP approves your app, it is limited to 10 WHOOP members.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Getting a provider developer app approved","icon":"plug"}]},{"id":"BYHzONk5WrrXE8mlqu3o","title":"Which providers need my own credentials, and why is there no Client ID field for Garmin?","pathname":"/help-center/help-topics/connecting/getting-a-provider-developer-app-approved/managed-vs-own-credentials","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"The Integration credentials column in the supported integrations table shows whether Terra manages a provider's credentials or you need your own app.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/connecting/connected-but-no-data-arriving","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Connected but no data arriving","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"DIe6Cu8ZAxotAUlQco8Q","title":"Why isn't my Renpho body measurement data showing up?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/connecting/realtime-ble-and-mobile-delivery","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Realtime, BLE and mobile delivery","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"}]},{"id":"Q28apGgIBOZQKFQclzud","title":"Why was my app rejected over health permission justifications?","pathname":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Connecting a provider","icon":"plug"},{"label":"Realtime, BLE and mobile delivery","icon":"plug"}]},{"id":"VmnX7xe3GuOkMsT2U1eU","title":"Billing & account","pathname":"/help-center/help-topics/billing-account","siteSpaceId":"sitesp_2ppMq","icon":"gear","description":"Your dashboard account, API keys, environments and going to production.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"}]},{"id":"N4d8BS6hsme2EXhms5qI","title":"Dashboard, users and connections","pathname":"/help-center/help-topics/billing-account/dashboard-users-and-connections","siteSpaceId":"sitesp_2ppMq","icon":"gear","description":"Dashboard, users and connections","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"}]},{"id":"4LCunRy9foSdysMX2Nou","title":"How do I delete a duplicate user or connection?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Dashboard, users and connections","icon":"gear"}]},{"id":"S8NuZH5fE5vqwPhiwozN","title":"Why is a user I stored missing from the dashboard Users list?","pathname":"/help-center/help-topics/billing-account/dashboard-users-and-connections/user-missing-from-dashboard","siteSpaceId":"sitesp_2ppMq","icon":"user","description":"The Users list only shows connections that still exist on the environment you have selected, so a stored user ID can be missing from it.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/billing-account/environments-config-and-going-to-production","siteSpaceId":"sitesp_2ppMq","icon":"gear","description":"Environments, config and going to production","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"}]},{"id":"ck37MeY5CDyqWcALWYyR","title":"Why are no users or connections showing in the dashboard?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/billing-account/data-payloads-and-destinations","siteSpaceId":"sitesp_2ppMq","icon":"gear","description":"Data, payloads and destinations","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"}]},{"id":"lxWJOMiBbBLhfXM9odnQ","title":"Why can't I download old payload history?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Data, payloads and destinations","icon":"gear"}]},{"id":"pTrYxIUoak80c8SRhVMF","title":"Support and getting help","pathname":"/help-center/help-topics/billing-account/support-and-getting-help","siteSpaceId":"sitesp_2ppMq","icon":"gear","description":"Support and getting help","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"}]},{"id":"XLaVD1TlrKWCz055pCCc","title":"How do I contact Terra support?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Support and getting help","icon":"gear"}]},{"id":"3zZG4z51HukA3r9BvA9X","title":"Usage limits and overage charges","pathname":"/help-center/help-topics/billing-account/usage-limits-and-overage-charges","siteSpaceId":"sitesp_2ppMq","icon":"gear","description":"Usage limits and overage charges","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"}]},{"id":"DMBUMDIIDefigkbN631Y","title":"How many devices can I connect in testing or staging?","pathname":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Billing & account","icon":"gear"},{"label":"Usage limits and overage charges","icon":"gear"}]},{"id":"g3AEsGDFRIa1d3Yy5KJH","title":"Webhooks & destinations","pathname":"/help-center/help-topics/webhook","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Webhook delivery, storage destinations, signatures, retries and routing.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"}]},{"id":"ia3uy3bpPQg7uriUwUqd","title":"Failures, errors and retries","pathname":"/help-center/help-topics/webhook/failures-errors-and-retries","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Failures, errors and retries","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"HzO9jHOjtgjQ0PyJf6Ld","title":"Are my webhook 401/404/500 errors on Terra's side?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"Hg4C9MZ3h0hQpicEDX8h","title":"Why do my Supabase destination columns not match the docs?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/webhook/storage-destinations-s3-sqs-supabase-sql-gcs/sql-destination-schema-setup","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Terra creates the SQL destination tables itself, in the default schema of the database user you provide.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/webhook/destinations-and-routing-setup","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Destinations and routing setup","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"p7jWUcwjJwt2Ba9IK2si","title":"Can one environment send data to two webhooks?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Destinations and routing setup","icon":"webhook"}]},{"id":"FqN8Jpkzv8x9WkNc9gAc","title":"Delivery timing, volume and ordering","pathname":"/help-center/help-topics/webhook/delivery-timing-volume-and-ordering","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Delivery timing, volume and ordering","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"6YBpjXUAfhVEigxEyRdU","title":"Can I reduce or batch webhook delivery frequency?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Delivery timing, volume and ordering","icon":"webhook"}]},{"id":"jfkIaT2mTF8s49wzLJnd","title":"Why do later edits to a past nutrition diary day show up, or not?","pathname":"/help-center/help-topics/webhook/delivery-timing-volume-and-ordering/nutrition-diary-late-edits","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Edits to a past diary day are delivered again for the date they belong to, but how far back that works depends on the provider.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Delivery timing, volume and ordering","icon":"webhook"}]},{"id":"cecZ4XFhB8Yds3yxlyGP","title":"Large payloads and chunking","pathname":"/help-center/help-topics/webhook/large-payloads-and-chunking","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Large payloads and chunking","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"lnGRXYBiqxsSpdnaGVPx","title":"Will Terra retry or chunk a 413 payload for me?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/webhook/large-payloads-and-chunking/presigned-url-expiry","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"The url in each ping or SQS s3_payload message is a signed download link whose lifetime starts when the message is generated, not when your worker reads it.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Large payloads and chunking","icon":"webhook"}]},{"id":"9hrRJu0Bl0fceiRAgc7h","title":"Payload content and provider quirks","pathname":"/help-center/help-topics/webhook/payload-content-and-provider-quirks","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Payload content and provider quirks","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"Lb7hcB2KHKIrDKqwHfwq","title":"Why don't Garmin simulator payloads appear in history?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Payload content and provider quirks","icon":"webhook"}]},{"id":"csEiL6gTIq6S5uccaTZ4","title":"Why does a Garmin activity read right after connecting come back with only a name and no data?","pathname":"/help-center/help-topics/webhook/payload-content-and-provider-quirks/garmin-activity-placeholder","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Garmin sends an activity's file and its details separately, and a read made between the two can return a name-only placeholder.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Payload content and provider quirks","icon":"webhook"}]},{"id":"XMiWIiVOwKYkdOMQZupT","title":"Why is a sample array empty in the webhook but present when I call the API?","pathname":"/help-center/help-topics/webhook/payload-content-and-provider-quirks/webhook-snapshot-vs-api-samples","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"A webhook is a snapshot of what Terra held when it was sent, while an API read with samples rebuilds the sample arrays from everything stored for the record's time window.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/webhook/security-signatures-and-network-access","siteSpaceId":"sitesp_2ppMq","icon":"webhook","description":"Security, signatures and network access","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"}]},{"id":"Fm0iZ8bXJr2dbDGVgoJM","title":"Why does my webhook signature verification fail?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Webhooks & destinations","icon":"webhook"},{"label":"Security, signatures and network access","icon":"webhook"}]},{"id":"Esb0RjaFRxOR0tvxyeRe","title":"Something else","pathname":"/help-center/help-topics/something-else","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Subdomains, realtime, widgets and getting help.","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"}]},{"id":"fd0Pj0nKJ82iRvF6mLI3","title":"Custom subdomains, SSL and security","pathname":"/help-center/help-topics/something-else/custom-subdomains-ssl-and-security","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Custom subdomains, SSL and security","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"mw5Us1L4zj6AoGNUDh4R","title":"Why won't the certificate for my custom subdomain issue or go live?","pathname":"/help-center/help-topics/something-else/custom-subdomains-ssl-and-security/cname-validation-ssl-issuance-troubleshooting","siteSpaceId":"sitesp_2ppMq","icon":"lock","description":"The certificate is issued once the DNS record shown in the dashboard resolves exactly as given, with no proxy in front of it and no CAA record blocking Terra's certificate authority.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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 whoop.yourdomain.com), not Terra's API URL.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/something-else/custom-subdomains-ssl-and-security/google-oauth-client-ownership","siteSpaceId":"sitesp_2ppMq","icon":"right-to-bracket","description":"No.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/help-topics/something-else/docs-support-and-getting-help","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Docs, support and getting help","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"yMLvkQUzwmYiMm2LvgCf","title":"Can I get a call with someone technical?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/something-else/provider-data-fields-and-coverage","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Provider data fields and coverage","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"s9UPiwd0OJYA6h3JRNqM","title":"When will field X be available for a provider?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/something-else/provider-data-fields-and-coverage/raw-original-fit-files","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Yes. With FIT as your processing format, Terra delivers the original FIT file Garmin sent.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/something-else/provider-data-fields-and-coverage/apple-nutrition-per-entry-timestamps","siteSpaceId":"sitesp_2ppMq","icon":"plug","description":"Yes.","breadcrumbs":[{"label":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/something-else/realtime-ble-and-mobile-delivery","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Realtime, BLE and mobile delivery","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"CsbXlUwo5kDmGDgnqzDo","title":"Why does Android background delivery stop?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/something-else/routing-webhooks-and-destinations","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Routing, webhooks and destinations","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"CPX3f2KvUI6k1S6G42JF","title":"Can I route different data types to different destinations?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/something-else/features-widgets-and-sdk-tools","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Features, widgets and SDK tools","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"Sc2USPZ4PYImRXT5VhrJ","title":"Can I push planned workouts to Zwift?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/something-else/connections-auth-and-permissions","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Connections, auth and permissions","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"GeuWW06kCGF2FSUDPc1N","title":"How do I check whether a HealthKit connection exists?","pathname":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/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":"Help Center"},{"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":"/help-center/help-topics/something-else/provider-rules-and-restrictions","siteSpaceId":"sitesp_2ppMq","icon":"circle-question","description":"Provider rules and restrictions","breadcrumbs":[{"label":"Help Center"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"}]},{"id":"TvhEjB4mbfVQNOJzUtOY","title":"What are my options under Strava's display restriction?","pathname":"/help-center/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":"Help Center"},{"label":"Help topics"},{"label":"Something else","icon":"circle-question"},{"label":"Provider rules and restrictions","icon":"circle-question"}]},{"id":"HC6IHJdFZHRIb3mZKWtB","title":"August Update 2026","pathname":"/changelog","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2026"}]},{"id":"HYemn1DbFeYWxQoumYbB","title":"July Update 2026","pathname":"/changelog/2026/july-update-2026","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2026"}]},{"id":"09t7tH66GiUo1lA8SDUU","title":"June Update 2026","pathname":"/changelog/2026/june-update-2026","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2026"}]},{"id":"xjkUytxN8iDdHDCXp4tG","title":"May Update 2026","pathname":"/changelog/2026/may-update-2026","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2026"}]},{"id":"prZWM3Crci26AgOFSfRl","title":"April Update 2026","pathname":"/changelog/2026/readme-8","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2026"}]},{"id":"qOIp0nz7YA1Y5cFuP5vN","title":"March Update 2026","pathname":"/changelog/2026/readme-6","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2026"}]},{"id":"QAbRFzbocR1qPCcogh8P","title":"February Update 2026","pathname":"/changelog/2026/readme-7","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2026"}]},{"id":"q9wPnzQkKGQBleTttVdf","title":"January Update 2026","pathname":"/changelog/2026/readme-6-1","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2026"}]},{"id":"wZY3ZzivedipEiFVwkHc","title":"December Update 2025","pathname":"/changelog/2025/readme-4","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2025"}]},{"id":"5IfxHCqTulfEkqErubUW","title":"November Update 2025","pathname":"/changelog/2025/readme-4-1","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2025"}]},{"id":"YChhdFkn6fjhjQplbMNd","title":"October Update 2025","pathname":"/changelog/2025/readme-5","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2025"}]},{"id":"8nJBJwt1ripjfpWxBtC7","title":"September Update 2025","pathname":"/changelog/2025/readme-4-1-1","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2025"}]},{"id":"iYIIBTuzbo5PrsUgNpsf","title":"August Update 2025","pathname":"/changelog/2025/august-update-2025","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2025"}]},{"id":"0s11eTAI1OmOwgYWnaaW","title":"July Update 2025","pathname":"/changelog/2025/readme-3","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2025"}]},{"id":"RCLflgf1XP4WsMCRQTA7","title":"June Update 2025","pathname":"/changelog/2025/readme-1","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2025"}]},{"id":"Ok1r6d63qfWDL2INYTHQ","title":"May Update 2025","pathname":"/changelog/2025/readme-2","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2025"}]},{"id":"UsEGUv7u0ctkyH0whbnL","title":"April Update 2025","pathname":"/changelog/2025/readme-1-1","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2025"}]},{"id":"9Wqa0eLdMcWAkyyPBXTc","title":"March Update 2025","pathname":"/changelog/2025/readme-2-1","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2025"}]},{"id":"o4QwDpwgD5o2TbUj9gtq","title":"February Update 2025","pathname":"/changelog/2025/february-update-2025","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2025"}]},{"id":"Z6R6CkBftAp8YPzD6k3t","title":"January Update 2025","pathname":"/changelog/2025/readme-1-1-1","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2025"}]},{"id":"BCvwN8pAhDfpFRC1c0r2","title":"December Update 2024","pathname":"/changelog/2024/2024-december-update","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2024"}]},{"id":"QUgCahErFLFQvW2R8yOW","title":"November Updates 2024","pathname":"/changelog/2024/2024-november-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2024"}]},{"id":"dl0qKON36cjF4i4BwKMA","title":"October Updates 2024","pathname":"/changelog/2024/2024-october-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2024"}]},{"id":"oA4pnKMw5JrYyt3a7xQS","title":"September Updates 2024","pathname":"/changelog/2024/2024-september-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2024"}]},{"id":"eaOmYGyao0nKL8OgX5JP","title":"August Updates 2024","pathname":"/changelog/2024/2024-august-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2024"}]},{"id":"QXbDfOw9njnQWMqTrWnp","title":"July Updates 2024","pathname":"/changelog/2024/2024-july-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2024"}]},{"id":"7YWK3yCc7yVCBqhaVdT8","title":"June Updates 2024","pathname":"/changelog/2024/2024-june-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2024"}]},{"id":"VVNrWgbF9Rgt7aOqLu4O","title":"May Updates 2024","pathname":"/changelog/2024/2024-may-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2024"}]},{"id":"0ePvnOHPDyXYUSPuM7iD","title":"April Updates 2024","pathname":"/changelog/2024/2024-april-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2024"}]},{"id":"4zw66ZOsLGhqQqxGYScK","title":"March 2024","pathname":"/changelog/2024/2024-march","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2024"}]},{"id":"maHxbFarATVjTZDfozIt","title":"February Updates 2024","pathname":"/changelog/2024/2024-february-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2024"}]},{"id":"tlWrX8BnwHtFBTS8lAQF","title":"January Updates 2024","pathname":"/changelog/2024/2024-january-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2024"}]},{"id":"pxaowIJW8jJ3lbwbWHII","title":"December Updates 2023","pathname":"/changelog/2023/2024-december-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"wrEeASqCS4iQRSOwTaJD","title":"November Updates 2023","pathname":"/changelog/2023/2023-november-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"lVzB8zymnGCTd1M1uXAD","title":"October Updates 2023","pathname":"/changelog/2023/2023-october-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"zlMjERAqhSGT035vvnCv","title":"September Updates 2023","pathname":"/changelog/2023/2023-september-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"rq0cEReOgySm8YLlhFqO","title":"August Updates 2023","pathname":"/changelog/2023/2023-august-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"U76hy1M72bHUEr9Bhl62","title":"July Updates 2023","pathname":"/changelog/2023/2023-july-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"hda1e69s8EmHMILT8MjL","title":"June Updates 2023","pathname":"/changelog/2023/2023-june-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"KYok3rJRY2ddQZBZWRXk","title":"June 27, 2023","pathname":"/changelog/2023/2023-06-27","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"jP2xfDBWB09Hq1gcKtcI","title":"June 16, 2023","pathname":"/changelog/2023/2023-06-16","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"8tZuTpDICaeJkJ3xzdbs","title":"June 5, 2023","pathname":"/changelog/2023/2023-06-05","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"6h6b32x60t2FDsKofOmu","title":"May Updates 2023","pathname":"/changelog/2023/2023-may-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"EzRN1ia6LSXrMbqaN2PS","title":"May 19, 2023","pathname":"/changelog/2023/2023-05-19","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"YyTyFyRJRJNYMT3ELTdq","title":"April Updates 2023","pathname":"/changelog/2023/2023-april-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"EDMJAAREUOWUM8Rz5krJ","title":"April 27, 2023","pathname":"/changelog/2023/2023-04-27","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"T4Qt5itkwr9jXT4XFdfk","title":"April 18, 2023","pathname":"/changelog/2023/2023-04-18","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"OUTnXURLcsKNXOd4HR5q","title":"April 11, 2023","pathname":"/changelog/2023/2023-04-11","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"35PUIGo8rz8JFJ4zjLT2","title":"March Updates 2023","pathname":"/changelog/2023/2023-march-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"3Y4RiwUDCzM14pSGyugO","title":"March 29, 2023","pathname":"/changelog/2023/2023-03-29","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"RCJsC9pCdceUA84dIzBQ","title":"March 22, 2023","pathname":"/changelog/2023/2023-03-22","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"379kTe3sL82ZyehSquaq","title":"March 13, 2023","pathname":"/changelog/2023/2023-03-13","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"e1kynjZ2lVW0CfqwISff","title":"March 6, 2023","pathname":"/changelog/2023/2023-03-06","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"m3xrE92ySpuXFtqlvPmM","title":"February Updates 2023","pathname":"/changelog/2023/2023-february-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"iTqq8WlFIHgFTnYF2IEv","title":"February 21, 2023","pathname":"/changelog/2023/2023-02-21","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"4bk41fdU02MnjxDD872B","title":"February 7, 2023","pathname":"/changelog/2023/2023-02-07","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"lTHTjNYN6xn0bTeBaA0h","title":"January Updates 2023","pathname":"/changelog/2023/2023-january-updates","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"bifAUzOUBFf3tKej5phe","title":"January 30, 2023","pathname":"/changelog/2023/2023-01-30","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2023"}]},{"id":"EGg2mvDxUppMUnNEP5pl","title":"December 15, 2022","pathname":"/changelog/2022/2022-12-15","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2022"}]},{"id":"E1JvGyaolzW22hhvvIFC","title":"December 7, 2022","pathname":"/changelog/2022/2022-12-07","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2022"}]},{"id":"GzGrMkLX66kxxacGvjU1","title":"November 22, 2022","pathname":"/changelog/2022/2022-11-22","siteSpaceId":"sitesp_q3JRb","description":"","breadcrumbs":[{"label":"Changelog"},{"label":"2022"}]}]}