Skip to main content
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

We recommend running Oura in webhook mode. You get data as soon as Oura finalizes it - typically within seconds instead of up to an hour - with less API traffic and no polling lag. Open Wearables still falls back to periodic pull, so webhooks are purely additive. See Enable webhooks (recommended) in the walkthrough below.

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_URL as {API_BASE_URL}/api/v1/oauth/oura/callback, so register that exact URL here. Oura requires a publicly accessible HTTPS URL, so plain http://localhost is 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)
Tick I agree to the Oura API Agreement, then click Create Application.After creating the app, open it via View Details to retrieve:
  • Client ID
  • Client Secret
Your Client Secret should never be logged or shared. It should only be used server-side.
3

Configure credentials in Open Wearables

Add the following to your .env file:
Configuration details:
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 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:
You should see a connection with "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 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.
Open Wearables derives the callback URL from your 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?