Built and signed on GitHub ActionsBuilt and signed on GitHub Actions
Project to interact with v2 of the Oura Ring API
OURA_API
Interact with v2 of the Oura API using Personal Access Tokens, OAuth2, or the Sandbox environment.
Available as:
โก๏ธ Quickstart
Installation
# Deno deno add jsr:@pinta365/oura-api # Bun bunx jsr add @pinta365/oura-api # Node.js npx jsr add @pinta365/oura-api # NPM (CommonJS) npm install oura_api --save
Basic Usage (ESM)
import { Oura } from "@pinta365/oura-api"; const accessToken = "YOUR_PERSONAL_ACCESS_TOKEN"; const oura = new Oura(accessToken); const personalInfo = await oura.getPersonalInfo(); console.log(personalInfo);
Basic Usage (CommonJS)
const { Oura } = require("oura_api"); // ... (same as above)
See the examples
folder for more detailed implementations.
๐งช Sandbox Environment (Testing)
The Oura API's sandbox environment (Docs) is perfect for development. It provides sample data so you don't need a real Oura account to test your application.
const ouraSandboxClient = new Oura({ useSandbox: true }); // ...Make API calls with `ouraSandboxClient`
๐ OAuth2 Support
Our library simplifies OAuth2 authentication with these functions:
-
generateAuthUrl(scopes: string[], state?: string): string
- Generates the authorization URL for the user.
-
async exchangeCodeForToken(code: string): Promise<OAuth2TokenResponse>
- Exchanges the received authorization code for access and refresh tokens.
-
async refreshAccessToken(suppliedRefreshToken: string): Promise<OAuth2TokenResponse>
- Refreshes an expired access token.
-
async revokeAccessToken(accessToken: string): Promise<boolean>
- Revokes the specified access token.
Example Usage (Simplified) See the examples
folder for a basic implementation using Hono.
import { OuraOAuth } from "@pinta365/oura-api"; const oura = new OuraOAuth({ clientId: "YOUR_CLIENT_ID", clientSecret: "YOUR_CLIENT_SECRET", redirectUri: "http://localhost:8000/callback", }); // 1. Generate the authorization URL const authUrl = oura.generateAuthUrl(["personal"]); // 2. Redirect the user to `authUrl` // ... (Implementation in your web application) // 3. In your callback route, exchange the code for tokens app.get("/callback", async (c) => { const code = c.req.query("code"); const tokens = await oura.exchangeCodeForToken(code); // ... Store tokens securely and use the access_token for API calls });
๐ Documentation
- Full API reference: JSR Documentation
Included data scopes for v2 of the API.
Endpoint/Scope | Status |
---|---|
Oura Base docs | |
Daily Activity | Implemented |
Daily Cardiovascular Age | Implemented |
Daily Readiness | Implemented |
Daily Resilience | Implemented |
Daily Sleep | Implemented |
Daily Spo2 | Implemented |
Daily Stress | Implemented |
Enhanced Tag | Implemented |
Heart Rate | Implemented |
Personal Info | Implemented |
Rest Mode Period | Implemented |
Ring Configuration | Implemented |
Session | Implemented |
Sleep | Implemented |
Sleep Time | Implemented |
Tag | DEPRECATED |
Vo2 Max | Implemented |
Workout | Implemented |
Webhook Subscription docs | |
List subscription | Implemented |
Create subscription | Implemented |
Update subscription | Implemented |
Delete subscription | Implemented |
Renew subscription | Implemented |
Additional info concerning the webhook API
Webhooks enable near real-time Oura data updates and are recommended for getting the latest information. The subscription workflow is implemented in this library โ see the Webhook docs for details.
โ ๏ธ I have not been able to fully verify this yet but the subscription workflow has been implemented.
๐ Issues
Please report any issues or questions on the GitHub repository.
๐ License
MIT License - see the LICENSE file.
Add Package
deno add jsr:@pinta365/oura-api
Import symbol
import * as oura_api from "@pinta365/oura-api";
Import directly with a jsr specifier
import * as oura_api from "jsr:@pinta365/oura-api";
Add Package
pnpm i jsr:@pinta365/oura-api
pnpm dlx jsr add @pinta365/oura-api
Import symbol
import * as oura_api from "@pinta365/oura-api";
Add Package
yarn add jsr:@pinta365/oura-api
yarn dlx jsr add @pinta365/oura-api
Import symbol
import * as oura_api from "@pinta365/oura-api";
Add Package
npx jsr add @pinta365/oura-api
Import symbol
import * as oura_api from "@pinta365/oura-api";
Add Package
bunx jsr add @pinta365/oura-api
Import symbol
import * as oura_api from "@pinta365/oura-api";