520 lines
15 KiB
Markdown
520 lines
15 KiB
Markdown
---
|
||
name: sleeptrack-be
|
||
description: This skill provides comprehensive backend REST API integration for Asleep sleep tracking platform. Use this skill when building server-side applications, API proxies for mobile apps, webhook event handlers, cross-platform backends (React Native, Flutter), analytics dashboards, or multi-tenant sleep tracking systems. Covers authentication, user management, session retrieval, statistics, webhook integration, and production-ready patterns with code examples in Python, Node.js, and curl.
|
||
---
|
||
|
||
# Sleeptrack Backend API Integration
|
||
|
||
## Overview
|
||
|
||
This skill provides comprehensive guidance for integrating the Asleep REST API into backend applications. It covers server-side user management, session data retrieval, statistics aggregation, webhook event handling, and production-ready patterns for building robust sleep tracking backends.
|
||
|
||
**Use this skill when:**
|
||
- Building backend/server-side sleep tracking integrations
|
||
- Creating API proxies for mobile applications
|
||
- Implementing webhook handlers for real-time sleep data
|
||
- Developing cross-platform backends (React Native, Flutter)
|
||
- Building analytics dashboards and reporting systems
|
||
- Creating multi-tenant sleep tracking applications
|
||
- Integrating sleep data with other health platforms
|
||
|
||
## Quick Start
|
||
|
||
### 1. Get Your API Key
|
||
|
||
1. Sign up at https://dashboard.asleep.ai
|
||
2. Generate an API key for your application
|
||
3. Store securely in environment variables (never commit to version control)
|
||
|
||
### 2. Basic Authentication
|
||
|
||
All API requests require the `x-api-key` header:
|
||
|
||
**curl:**
|
||
```bash
|
||
curl -X GET "https://api.asleep.ai/ai/v1/users/USER_ID" \
|
||
-H "x-api-key: YOUR_API_KEY"
|
||
```
|
||
|
||
**Python:**
|
||
```python
|
||
import requests
|
||
|
||
headers = {"x-api-key": "YOUR_API_KEY"}
|
||
response = requests.get(
|
||
"https://api.asleep.ai/ai/v1/users/USER_ID",
|
||
headers=headers
|
||
)
|
||
```
|
||
|
||
**Node.js:**
|
||
```javascript
|
||
const axios = require('axios');
|
||
|
||
const response = await axios.get(
|
||
'https://api.asleep.ai/ai/v1/users/USER_ID',
|
||
{
|
||
headers: { 'x-api-key': 'YOUR_API_KEY' }
|
||
}
|
||
);
|
||
```
|
||
|
||
## API Client Structure
|
||
|
||
Build a reusable API client to handle authentication, error handling, and common operations.
|
||
|
||
**Key Components:**
|
||
- Base URL configuration (`https://api.asleep.ai`)
|
||
- API key authentication in headers
|
||
- Error handling for common HTTP status codes (401, 403, 404)
|
||
- Request methods for all API endpoints
|
||
- Session management with persistent connections
|
||
|
||
**For complete implementations:**
|
||
- Python: See `references/python_client_implementation.md`
|
||
- Node.js: See `references/nodejs_client_implementation.md`
|
||
- REST API details: See `references/rest_api_reference.md`
|
||
|
||
**Basic Client Structure:**
|
||
```python
|
||
class AsleepClient:
|
||
def __init__(self, api_key: str):
|
||
self.api_key = api_key
|
||
self.base_url = "https://api.asleep.ai"
|
||
self.session = requests.Session()
|
||
self.session.headers.update({"x-api-key": api_key})
|
||
|
||
def _request(self, method: str, path: str, **kwargs):
|
||
# Handle authentication and errors
|
||
# See python_client_implementation.md for full code
|
||
pass
|
||
```
|
||
|
||
## User Management
|
||
|
||
### Creating Users
|
||
|
||
Create users before tracking sleep. User IDs are managed by your application.
|
||
|
||
```python
|
||
# Create user with metadata
|
||
user_id = client.create_user(metadata={
|
||
"birth_year": 1990,
|
||
"gender": "male",
|
||
"height": 175.5, # cm
|
||
"weight": 70.0 # kg
|
||
})
|
||
```
|
||
|
||
**Available Metadata Fields:**
|
||
- `birth_year` (Integer): Birth year
|
||
- `birth_month` (Integer): 1-12
|
||
- `birth_day` (Integer): 1-31
|
||
- `gender` (String): `male`, `female`, `non_binary`, `other`, `prefer_not_to_say`
|
||
- `height` (Float): Height in cm (0-300)
|
||
- `weight` (Float): Weight in kg (0-1000)
|
||
|
||
### Retrieving User Information
|
||
|
||
```python
|
||
user_data = client.get_user(user_id)
|
||
# Returns: user_id, to_be_deleted status, last_session_info, metadata
|
||
```
|
||
|
||
**Response includes:**
|
||
- User ID and deletion status
|
||
- Last session information (if available)
|
||
- User metadata (demographic information)
|
||
|
||
### Deleting Users
|
||
|
||
Permanently removes user and all associated data (sessions, reports).
|
||
|
||
```python
|
||
client.delete_user(user_id)
|
||
```
|
||
|
||
**For detailed examples and response structures:**
|
||
- See `references/rest_api_reference.md` (User Management section)
|
||
- See `references/python_client_implementation.md` or `references/nodejs_client_implementation.md`
|
||
|
||
## Session Management
|
||
|
||
### Retrieving Session Details
|
||
|
||
Get comprehensive sleep analysis for a specific session.
|
||
|
||
```python
|
||
session = client.get_session(
|
||
session_id="session123",
|
||
user_id="user123",
|
||
timezone="America/New_York"
|
||
)
|
||
|
||
# Access key metrics
|
||
print(f"Sleep efficiency: {session['stat']['sleep_efficiency']:.1f}%")
|
||
print(f"Total sleep time: {session['stat']['sleep_time']}")
|
||
print(f"Sleep stages: {session['session']['sleep_stages']}")
|
||
```
|
||
|
||
**Sleep Stage Values:**
|
||
- `-1`: Unknown/No data
|
||
- `0`: Wake
|
||
- `1`: Light sleep
|
||
- `2`: Deep sleep
|
||
- `3`: REM sleep
|
||
|
||
**Key Metrics:**
|
||
- `sleep_efficiency`: (Total sleep time / Time in bed) × 100%
|
||
- `sleep_latency`: Time to fall asleep (seconds)
|
||
- `waso_count`: Wake after sleep onset episodes
|
||
- `time_in_bed`: Total time in bed (seconds)
|
||
- `time_in_sleep`: Actual sleep time (seconds)
|
||
- `time_in_light/deep/rem`: Stage durations (seconds)
|
||
|
||
### Listing Sessions
|
||
|
||
Retrieve multiple sessions with date filtering and pagination.
|
||
|
||
```python
|
||
sessions = client.list_sessions(
|
||
user_id="user123",
|
||
date_gte="2024-01-01",
|
||
date_lte="2024-01-31",
|
||
limit=50,
|
||
order_by="DESC"
|
||
)
|
||
```
|
||
|
||
**Pagination Example:**
|
||
```python
|
||
all_sessions = []
|
||
offset = 0
|
||
limit = 100
|
||
|
||
while True:
|
||
result = client.list_sessions(
|
||
user_id="user123",
|
||
offset=offset,
|
||
limit=limit
|
||
)
|
||
sessions = result['sleep_session_list']
|
||
all_sessions.extend(sessions)
|
||
|
||
if len(sessions) < limit:
|
||
break
|
||
offset += limit
|
||
```
|
||
|
||
### Deleting Sessions
|
||
|
||
```python
|
||
client.delete_session(session_id="session123", user_id="user123")
|
||
```
|
||
|
||
**For detailed session data structures and examples:**
|
||
- See `references/rest_api_reference.md` (Session Management section)
|
||
- See client implementation references for language-specific examples
|
||
|
||
## Statistics and Analytics
|
||
|
||
### Average Statistics
|
||
|
||
Get aggregated sleep metrics over a time period (max 100 days).
|
||
|
||
```python
|
||
stats = client.get_average_stats(
|
||
user_id="user123",
|
||
start_date="2024-01-01",
|
||
end_date="2024-01-31",
|
||
timezone="UTC"
|
||
)
|
||
|
||
avg = stats['average_stats']
|
||
print(f"Average sleep time: {avg['sleep_time']}")
|
||
print(f"Average efficiency: {avg['sleep_efficiency']:.1f}%")
|
||
print(f"Light sleep ratio: {avg['light_ratio']:.1%}")
|
||
print(f"Number of sessions: {len(stats['slept_sessions'])}")
|
||
```
|
||
|
||
**Returned Metrics:**
|
||
- Average sleep time, bedtime, wake time
|
||
- Average sleep efficiency
|
||
- Sleep stage ratios (light, deep, REM)
|
||
- List of sessions included in calculation
|
||
|
||
**For trend analysis and advanced analytics:**
|
||
- See `references/python_client_implementation.md` (Analytics section)
|
||
- See `references/rest_api_reference.md` (Statistics section)
|
||
|
||
## Webhook Integration
|
||
|
||
Webhooks enable real-time notifications for sleep session events.
|
||
|
||
### Webhook Event Types
|
||
|
||
1. **INFERENCE_COMPLETE**: Incremental sleep data during tracking (every 5-40 minutes)
|
||
2. **SESSION_COMPLETE**: Final comprehensive sleep analysis when session ends
|
||
|
||
### Setting Up Webhook Endpoint
|
||
|
||
**Basic Structure:**
|
||
```python
|
||
@app.route('/asleep-webhook', methods=['POST'])
|
||
def asleep_webhook():
|
||
# 1. Verify authentication (x-api-key header)
|
||
# 2. Parse event data
|
||
# 3. Handle event type (INFERENCE_COMPLETE or SESSION_COMPLETE)
|
||
# 4. Process and store data
|
||
# 5. Return 200 response
|
||
pass
|
||
```
|
||
|
||
**Key Implementation Points:**
|
||
- Verify `x-api-key` header matches your API key
|
||
- Validate `x-user-id` header
|
||
- Handle both INFERENCE_COMPLETE and SESSION_COMPLETE events
|
||
- Implement idempotency (check if event already processed)
|
||
- Process asynchronously for better performance
|
||
- Return 200 status immediately
|
||
|
||
**For complete webhook implementations:**
|
||
- Python (Flask): See `references/webhook_implementation_guide.md`
|
||
- Node.js (Express): See `references/webhook_implementation_guide.md`
|
||
- Webhook payloads: See `references/webhook_reference.md`
|
||
|
||
### Webhook Best Practices
|
||
|
||
**Idempotency:**
|
||
Check if webhook event was already processed to avoid duplicates.
|
||
|
||
**Asynchronous Processing:**
|
||
Queue webhook events for background processing and respond immediately.
|
||
|
||
**Error Handling:**
|
||
Return 200 even if processing fails internally to prevent retries.
|
||
|
||
**For detailed patterns:**
|
||
- See `references/webhook_implementation_guide.md`
|
||
- See `references/production_patterns.md` (Background Jobs section)
|
||
|
||
## Common Backend Patterns
|
||
|
||
### 1. API Proxy for Mobile Apps
|
||
|
||
Create a backend proxy to:
|
||
- Hide API keys from mobile clients
|
||
- Add custom authentication
|
||
- Implement business logic
|
||
- Track usage and analytics
|
||
|
||
**Key endpoints:**
|
||
- POST `/api/users` - Create Asleep user for authenticated app user
|
||
- GET `/api/sessions/{id}` - Proxy session retrieval with auth
|
||
- GET `/api/sessions` - List sessions with filtering
|
||
- GET `/api/statistics` - Get aggregated statistics
|
||
|
||
**For complete implementation:**
|
||
- See `references/python_client_implementation.md` (API Proxy section)
|
||
|
||
### 2. Analytics Dashboard Backend
|
||
|
||
Aggregate and analyze sleep data across multiple users:
|
||
- Calculate comprehensive sleep scores
|
||
- Generate weekly/monthly reports
|
||
- Analyze cohort sleep patterns
|
||
- Provide personalized insights
|
||
|
||
**Key features:**
|
||
- Sleep score calculation (efficiency + consistency + duration)
|
||
- Trend analysis over time
|
||
- Multi-user aggregation
|
||
- Report generation
|
||
|
||
**For complete implementation:**
|
||
- See `references/python_client_implementation.md` (Analytics section)
|
||
|
||
### 3. Multi-Tenant Application
|
||
|
||
Manage sleep tracking for multiple organizations or teams:
|
||
- Organization-level user management
|
||
- Aggregated organization statistics
|
||
- Role-based access control
|
||
- Per-organization settings
|
||
|
||
**For complete implementation:**
|
||
- See `references/python_client_implementation.md` (Multi-Tenant section)
|
||
|
||
## Error Handling
|
||
|
||
### Common Error Codes
|
||
|
||
- **401 Unauthorized**: Invalid API key
|
||
- **403 Forbidden**: Rate limit exceeded or insufficient permissions
|
||
- **404 Not Found**: Resource does not exist
|
||
- **422 Unprocessable Entity**: Invalid request parameters
|
||
|
||
### Retry Logic with Exponential Backoff
|
||
|
||
```python
|
||
def retry_with_exponential_backoff(func, max_retries=3, base_delay=1.0):
|
||
for attempt in range(max_retries):
|
||
try:
|
||
return func()
|
||
except requests.exceptions.HTTPError as e:
|
||
if e.response.status_code == 403 and "rate limit" in str(e):
|
||
if attempt < max_retries - 1:
|
||
delay = min(base_delay * (2 ** attempt), 60.0)
|
||
time.sleep(delay)
|
||
continue
|
||
raise
|
||
```
|
||
|
||
### Custom Exception Classes
|
||
|
||
```python
|
||
class AsleepAPIError(Exception):
|
||
"""Base exception for Asleep API errors"""
|
||
pass
|
||
|
||
class RateLimitError(AsleepAPIError):
|
||
"""Rate limit exceeded"""
|
||
pass
|
||
|
||
class ResourceNotFoundError(AsleepAPIError):
|
||
"""Resource not found"""
|
||
pass
|
||
```
|
||
|
||
**For comprehensive error handling:**
|
||
- See `references/python_client_implementation.md` or `references/nodejs_client_implementation.md`
|
||
- See `references/production_patterns.md` (Error Recovery section)
|
||
|
||
## Testing
|
||
|
||
### Local Webhook Testing
|
||
|
||
Use ngrok to expose local server for webhook testing:
|
||
|
||
```bash
|
||
# Start local server
|
||
python app.py # or npm start
|
||
|
||
# Expose with ngrok
|
||
ngrok http 5000
|
||
|
||
# Use ngrok URL in webhook configuration
|
||
# Example: https://abc123.ngrok.io/asleep-webhook
|
||
```
|
||
|
||
### Mock API Responses
|
||
|
||
```python
|
||
@patch('requests.Session.request')
|
||
def test_create_user(mock_request):
|
||
mock_response = Mock()
|
||
mock_response.json.return_value = {
|
||
"result": {"user_id": "test_user_123"}
|
||
}
|
||
mock_request.return_value = mock_response
|
||
|
||
user_id = client.create_user()
|
||
assert user_id == "test_user_123"
|
||
```
|
||
|
||
**For complete testing examples:**
|
||
- See `references/python_client_implementation.md` (Testing section)
|
||
|
||
## Production Best Practices
|
||
|
||
### Security
|
||
|
||
1. **API Key Management:**
|
||
- Store in environment variables or secret management system
|
||
- Never commit to version control
|
||
- Rotate keys periodically
|
||
- Use different keys for dev/staging/production
|
||
|
||
2. **Webhook Security:**
|
||
- Verify `x-api-key` header
|
||
- Use HTTPS endpoints only
|
||
- Implement rate limiting
|
||
- Log all webhook attempts
|
||
|
||
3. **User Data Privacy:**
|
||
- Encrypt sensitive data at rest
|
||
- Implement proper access controls
|
||
- Handle data deletion requests
|
||
- Comply with GDPR/CCPA
|
||
|
||
### Performance
|
||
|
||
1. **Caching:** Cache immutable session data
|
||
2. **Rate Limiting:** Protect your backend from overload
|
||
3. **Connection Pooling:** Reuse HTTP connections
|
||
4. **Batch Processing:** Process multiple requests in parallel
|
||
|
||
### Monitoring
|
||
|
||
1. **Logging:** Structured logging for all API requests
|
||
2. **Metrics:** Track request duration, error rates, throughput
|
||
3. **Health Checks:** Implement `/health`, `/ready`, `/live` endpoints
|
||
4. **Alerting:** Alert on error rate spikes or API failures
|
||
|
||
### Deployment
|
||
|
||
1. **Configuration:** Environment-based settings with validation
|
||
2. **Health Checks:** Support Kubernetes liveness/readiness probes
|
||
3. **Graceful Shutdown:** Handle termination signals properly
|
||
4. **Error Recovery:** Circuit breaker pattern for API failures
|
||
|
||
**For comprehensive production patterns:**
|
||
- Caching strategies: See `references/production_patterns.md`
|
||
- Rate limiting: See `references/production_patterns.md`
|
||
- Monitoring: See `references/production_patterns.md`
|
||
- Deployment: See `references/production_patterns.md`
|
||
|
||
## Resources
|
||
|
||
### Reference Documentation
|
||
|
||
This skill includes comprehensive reference files:
|
||
|
||
- `references/python_client_implementation.md`: Complete Python client with all methods, analytics classes, and examples
|
||
- `references/nodejs_client_implementation.md`: Complete Node.js client with Express integration
|
||
- `references/webhook_implementation_guide.md`: Full webhook handlers in Python and Node.js with best practices
|
||
- `references/rest_api_reference.md`: Complete REST API endpoint documentation with request/response examples
|
||
- `references/webhook_reference.md`: Webhook integration guide with payload structures
|
||
- `references/production_patterns.md`: Caching, rate limiting, monitoring, deployment, and performance optimization
|
||
|
||
To access detailed information:
|
||
```
|
||
Read references/python_client_implementation.md
|
||
Read references/nodejs_client_implementation.md
|
||
Read references/webhook_implementation_guide.md
|
||
Read references/rest_api_reference.md
|
||
Read references/webhook_reference.md
|
||
Read references/production_patterns.md
|
||
```
|
||
|
||
### Official Documentation
|
||
|
||
- **Main Documentation**: https://docs-en.asleep.ai
|
||
- **API Basics**: https://docs-en.asleep.ai/docs/api-basics.md
|
||
- **Webhook Guide**: https://docs-en.asleep.ai/docs/webhook.md
|
||
- **Dashboard**: https://dashboard.asleep.ai
|
||
- **LLM-Optimized Reference**: https://docs-en.asleep.ai/llms.txt
|
||
|
||
### Related Skills
|
||
|
||
- **sleeptrack-foundation**: Core concepts, authentication, data structures, and platform-agnostic patterns
|
||
- **sleeptrack-ios**: iOS SDK integration for native iOS applications
|
||
- **sleeptrack-android**: Android SDK integration for native Android applications
|
||
|
||
### Support
|
||
|
||
For technical support and API issues:
|
||
- Check Dashboard for API usage and status
|
||
- Review error logs and response codes
|
||
- Contact support through Asleep Dashboard
|