Documentation Index Fetch the complete documentation index at: https://openwearables.io/docs/llms.txt
Use this file to discover all available pages before exploring further.
Overview
This guide walks you through the complete flow of integrating Open Wearables with your application, from creating a user to fetching their health data.
1. Create a user in Open Wearables
2. Connect user to a wearable provider (Garmin, Polar, Suunto)
3. Sync data from the provider
4. Fetch timeseries, workouts, or sleep data
Step 1: Create a User
First, create a user in Open Wearables to represent your application’s user.
curl -X POST "http://localhost:8000/api/v1/users" \
-H "X-Open-Wearables-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"external_user_id": "your-app-user-123"
}'
Use external_user_id to map Open Wearables users to your application’s user IDs for easy lookup later.
Response:
{
"id" : "550e8400-e29b-41d4-a716-446655440000" ,
"created_at" : "2025-12-19T10:30:00Z" ,
"first_name" : null ,
"last_name" : null ,
"email" : "user@example.com" ,
"external_user_id" : "your-app-user-123"
}
Save the id - you’ll need it for all subsequent API calls.
Open Wearables allows duplicate email addresses. If you need uniqueness, check for existing users first using GET /api/v1/users?search=user@example.com which returns a paginated list.
Step 2: Connect to a Provider
Initiate OAuth to connect the user to their wearable provider.
curl -X GET "http://localhost:8000/api/v1/oauth/garmin/authorize?user_id=550e8400-e29b-41d4-a716-446655440000&redirect_uri=https://yourapp.com/connected" \
-H "X-Open-Wearables-API-Key: YOUR_API_KEY"
Response:
{
"authorization_url" : "https://connect.garmin.com/oauthConfirm?oauth_token=..." ,
"state" : "abc123..."
}
Redirect the user to authorization_url. After they authorize, they’ll be redirected back to your redirect_uri.
Provider names must be lowercase : garmin, polar, suunto, apple
Frontend Example
// Get OAuth URL
const response = await fetch (
` ${ API_URL } /api/v1/oauth/garmin/authorize?user_id= ${ userId } &redirect_uri= ${ encodeURIComponent ( callbackUrl ) } ` ,
{ headers: { 'X-Open-Wearables-API-Key' : API_KEY } }
);
const { authorization_url } = await response . json ();
// Redirect user to provider
window . location . href = authorization_url ;
Step 3: Sync Data
After OAuth completes, an initial sync is triggered automatically. For subsequent syncs or to fetch historical data:
# Garmin - with time range (recommended)
curl -X POST "http://localhost:8000/api/v1/providers/garmin/users/550e8400-e29b-41d4-a716-446655440000/sync?summary_start_time=2025-01-01T00:00:00Z&summary_end_time=2025-01-31T00:00:00Z" \
-H "X-Open-Wearables-API-Key: YOUR_API_KEY"
# Suunto/Polar - no time range required
curl -X POST "http://localhost:8000/api/v1/providers/polar/users/550e8400-e29b-41d4-a716-446655440000/sync" \
-H "X-Open-Wearables-API-Key: YOUR_API_KEY"
For Garmin, including summary_start_time and summary_end_time is recommended to specify the date range for data retrieval.
Step 4: Fetch Data
Now you can fetch the user’s health data.
Timeseries Data (Heart Rate, Steps, etc.)
curl -X GET "http://localhost:8000/api/v1/users/550e8400-e29b-41d4-a716-446655440000/timeseries?start_time=2025-01-01T00:00:00Z&end_time=2025-01-31T00:00:00Z&types=heart_rate&types=steps" \
-H "X-Open-Wearables-API-Key: YOUR_API_KEY"
Workouts
curl -X GET "http://localhost:8000/api/v1/users/550e8400-e29b-41d4-a716-446655440000/events/workouts?start_date=2025-01-01T00:00:00Z&end_date=2025-01-31T00:00:00Z" \
-H "X-Open-Wearables-API-Key: YOUR_API_KEY"
Sleep Sessions
curl -X GET "http://localhost:8000/api/v1/users/550e8400-e29b-41d4-a716-446655440000/events/sleep?start_date=2025-01-01T00:00:00Z&end_date=2025-01-31T00:00:00Z" \
-H "X-Open-Wearables-API-Key: YOUR_API_KEY"
Complete JavaScript Example
const API_URL = 'http://localhost:8000' ;
const API_KEY = 'your-api-key' ;
async function integrateUser ( email , externalId ) {
// 1. Create user
const userRes = await fetch ( ` ${ API_URL } /api/v1/users` , {
method: 'POST' ,
headers: {
'X-Open-Wearables-API-Key' : API_KEY ,
'Content-Type' : 'application/json'
},
body: JSON . stringify ({ email , external_user_id: externalId })
});
const user = await userRes . json ();
// 2. Get OAuth URL for Garmin
const authRes = await fetch (
` ${ API_URL } /api/v1/oauth/garmin/authorize?user_id= ${ user . id } &redirect_uri= ${ encodeURIComponent ( window . location . origin + '/connected' ) } ` ,
{ headers: { 'X-Open-Wearables-API-Key' : API_KEY } }
);
const { authorization_url } = await authRes . json ();
// 3. Redirect user to provider
window . location . href = authorization_url ;
}
async function fetchUserData ( userId ) {
// After OAuth callback, fetch data
const now = new Date (). toISOString ();
const monthAgo = new Date ( Date . now () - 30 * 24 * 60 * 60 * 1000 ). toISOString ();
const response = await fetch (
` ${ API_URL } /api/v1/users/ ${ userId } /timeseries?start_time= ${ monthAgo } &end_time= ${ now } &types=heart_rate` ,
{ headers: { 'X-Open-Wearables-API-Key' : API_KEY } }
);
return response . json ();
}
Next Steps
Provider Setup Provider-specific configuration and requirements
Data Types Available metrics, workout types, and data formats