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 @pinta365/oura-api
# Bun
bunx jsr add @pinta365/oura-api
# Node.js
npx jsr add @pinta365/oura-api
# NPM (CommonJS)
npm install oura_api --saveBasic 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.