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