Need help with your Oura integration? Pop into our Discord if you have questions or want to discover how Open Wearables can solve your problems.
Overview
Oura provides access to sleep, readiness, activity, heart rate, and workout data through the Oura API v2. The integration uses OAuth 2.0 for authentication and supports both pull-based syncing and real-time webhooks - we recommend running Oura in webhook mode for the freshest data.Supported data types
Data delivery
What you need by the end
- App credentials: Client ID + Client Secret from the Oura Developer portal
- OAuth scopes configured
- Redirect URI registered in the Oura Developer portal
- Webhook mode enabled (recommended, for real-time updates) - subscriptions are registered automatically
Prerequisites
- A personal Oura account (Ring owner)
Application walkthrough
1
Sign in to the Oura Developer portal
Go to the Oura Developer portal and sign in with your Oura account. Your existing Applications are listed on the Your Applications page.
Login requires a personal Oura account - the same one you use with the Oura app.
2
Create an OAuth application
Click Create New and fill in the New Application form:
- Display Name: The name shown to users on the consent screen
- Description: A short description of your application
- Contact Email: Who Oura can contact about the app
- Website: Your application or company URL
- Privacy Policy / Terms of Service: URLs to your policy pages
- Redirect URIs: Your OAuth callback URL. Open Wearables derives this from your
API_BASE_URLas{API_BASE_URL}/api/v1/oauth/oura/callback, so register that exact URL here. Oura requires a publicly accessible HTTPS URL, so plainhttp://localhostis not accepted - for local development, expose your backend with ngrok and register e.g.https://your-subdomain.ngrok-free.app/api/v1/oauth/oura/callback. In production use your public domain, e.g.https://your-domain/api/v1/oauth/oura/callback. - Scopes: Select the data scopes your app needs (see the OAuth Scopes Reference below)
- Client ID
- Client Secret
3
Configure credentials in Open Wearables
Add the following to your Configuration details:
.env file:4
Connect a user via OAuth
With credentials configured and your Open Wearables instance running, initiate the OAuth flow.1. Get the authorization URL:Response:2. Redirect the user to the You should see a connection with
authorization_url. They will log in to Oura and authorize your app.3. Oura redirects back to the callback URI derived from API_BASE_URL ({API_BASE_URL}/api/v1/oauth/oura/callback). Open Wearables automatically exchanges the authorization code for access and refresh tokens.4. Verify the connection:"provider": "oura" and "status": "active".The
redirect_uri parameter in the authorize call is where the user is sent after the flow completes (e.g., back to your app). This is separate from the server-side OAuth callback ({API_BASE_URL}/api/v1/oauth/oura/callback) that Oura sends the authorization code to.5
Enable webhooks (recommended)
We recommend webhooks over polling. They give you real-time updates instead of waiting for the next polling cycle - when Oura records new sleep, readiness, activity, SpO2, or workout data, it immediately notifies Open Wearables, which fetches and saves the record.By default Oura runs in pull (polling) mode. Switching its live-sync mode to webhook registers the subscriptions for you automatically - Open Wearables dispatches a background task that creates a subscription for every supported data type and event type. Make sure Open Wearables derives the callback URL from your
OURA_CLIENT_ID, OURA_CLIENT_SECRET, and a public API_BASE_URL are configured first.Switch Oura to webhook mode from the dashboard:In your Open Wearables dashboard, go to Settings → Providers, find Oura, and switch its live-sync control from Periodic pull to Webhook. That’s it - the subscriptions are registered in the background.Because the callback must be publicly reachable over HTTPS, set
API_BASE_URL to your public domain (or your ngrok URL for local development) before switching to webhook mode.API_BASE_URL as {API_BASE_URL}/api/v1/providers/oura/webhooks, registers a subscription for each data type / event type, and Oura verifies each one using your OURA_WEBHOOK_VERIFICATION_TOKEN. Subscriptions are app-level - they cover all authorized users.Subscribed data types: sleep, daily_sleep, daily_readiness, daily_activity, daily_spo2, daily_cardiovascular_age, workout - each for the create and update events.Oura subscriptions expire after 90 days and are renewed automatically by a scheduled task (monthly). You can also manage them manually via
POST /api/v1/providers/oura/webhooks/subscriptions (register / re-register with a callback_url) and POST /api/v1/providers/oura/webhooks/subscriptions/renew.6
Sync data
An initial sync is triggered automatically after a successful OAuth connection. To manually sync or fetch historical data:You can also sync specific data types:
7
Verify the integration
Once data has synced, fetch it via the Open Wearables API:If data is returned, your Oura integration is working end-to-end.
API Details
OAuth Scopes Reference
The scopes requested by Open Wearables are controlled by
OURA_DEFAULT_SCOPE and must be a subset of the scopes enabled on your application in the Developer portal.Next Steps
API Reference
Explore the Open Wearables API endpoints.
Coverage Matrix
See the full data coverage comparison.
Support
Need Help?
- Join our Discord and ask a question.
- Check GitHub Discussions.
- Check the Oura API Docs.

