1528 lines
25 KiB
Markdown
1528 lines
25 KiB
Markdown
# Personal System API Documentation
|
|
|
|
## Overview
|
|
|
|
This API serves a personal productivity system with habit tracking and intake metrics. The system supports three client types:
|
|
- **TUI (Terminal User Interface)**: Command-line interface for quick interactions
|
|
- **Mobile App**: Native mobile application for on-the-go tracking
|
|
- **Web Application**: Rich web interface with analytics and reporting
|
|
|
|
## Base URL
|
|
|
|
```
|
|
Production: https://api.personal-system.com/v1
|
|
Development: http://localhost:3000/api/v1
|
|
```
|
|
|
|
## Authentication
|
|
|
|
The system uses Better Auth for authentication and authorization. All endpoints require authentication via session tokens or API keys.
|
|
|
|
### Session-based Authentication
|
|
|
|
Session tokens are passed in the Authorization header:
|
|
|
|
```
|
|
Authorization: Bearer <session_token>
|
|
```
|
|
|
|
### API Key Authentication
|
|
|
|
API keys can be used for programmatic access:
|
|
|
|
```
|
|
Authorization: Bearer <api_key>
|
|
```
|
|
|
|
### Authentication Endpoints
|
|
|
|
#### Sign Up
|
|
```http
|
|
POST /auth/signup
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"name": "John Doe",
|
|
"email": "user@example.com",
|
|
"password": "securepassword",
|
|
"username": "johndoe"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"user": {
|
|
"id": "user-text-id",
|
|
"name": "John Doe",
|
|
"email": "user@example.com",
|
|
"username": "johndoe",
|
|
"email_verified": false,
|
|
"created_at": "2024-01-15T12:00:00Z",
|
|
"updated_at": "2024-01-15T12:00:00Z"
|
|
},
|
|
"session": {
|
|
"id": "session-id",
|
|
"token": "session-token",
|
|
"expires_at": "2024-01-22T12:00:00Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Sign In
|
|
```http
|
|
POST /auth/signin
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"email": "user@example.com",
|
|
"password": "securepassword"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"user": {
|
|
"id": "user-text-id",
|
|
"name": "John Doe",
|
|
"email": "user@example.com",
|
|
"username": "johndoe",
|
|
"email_verified": true,
|
|
"created_at": "2024-01-15T12:00:00Z",
|
|
"updated_at": "2024-01-15T12:00:00Z"
|
|
},
|
|
"session": {
|
|
"id": "session-id",
|
|
"token": "session-token",
|
|
"expires_at": "2024-01-22T12:00:00Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Sign Out
|
|
```http
|
|
POST /auth/signout
|
|
```
|
|
|
|
**Headers:**
|
|
```
|
|
Authorization: Bearer <session_token>
|
|
```
|
|
|
|
#### Get Current User
|
|
```http
|
|
GET /auth/me
|
|
```
|
|
|
|
**Headers:**
|
|
```
|
|
Authorization: Bearer <session_token>
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"user": {
|
|
"id": "user-text-id",
|
|
"name": "John Doe",
|
|
"email": "user@example.com",
|
|
"username": "johndoe",
|
|
"email_verified": true,
|
|
"created_at": "2024-01-15T12:00:00Z",
|
|
"updated_at": "2024-01-15T12:00:00Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Update User Profile
|
|
```http
|
|
PUT /auth/profile
|
|
```
|
|
|
|
**Headers:**
|
|
```
|
|
Authorization: Bearer <session_token>
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"name": "John Updated",
|
|
"username": "johnupdated",
|
|
"display_username": "John U."
|
|
}
|
|
```
|
|
|
|
#### Change Password
|
|
```http
|
|
POST /auth/change-password
|
|
```
|
|
|
|
**Headers:**
|
|
```
|
|
Authorization: Bearer <session_token>
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"current_password": "oldpassword",
|
|
"new_password": "newpassword"
|
|
}
|
|
```
|
|
|
|
### OAuth Provider Integration
|
|
|
|
Better Auth supports OAuth providers. The system can be configured to support:
|
|
|
|
#### GitHub OAuth
|
|
```http
|
|
GET /auth/github
|
|
```
|
|
|
|
#### Google OAuth
|
|
```http
|
|
GET /auth/google
|
|
```
|
|
|
|
### API Key Management
|
|
|
|
#### Create API Key
|
|
```http
|
|
POST /auth/api-keys
|
|
```
|
|
|
|
**Headers:**
|
|
```
|
|
Authorization: Bearer <session_token>
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"name": "TUI Client Key",
|
|
"permissions": ["habits:read", "habits:write", "intake:read", "intake:write"],
|
|
"expires_at": "2024-12-31T23:59:59Z",
|
|
"rate_limit_max": 100,
|
|
"rate_limit_time_window": 86400000
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"id": "api-key-id",
|
|
"name": "TUI Client Key",
|
|
"key": "sk_live_1234567890abcdef",
|
|
"prefix": "sk_live_",
|
|
"permissions": ["habits:read", "habits:write", "intake:read", "intake:write"],
|
|
"rate_limit_max": 100,
|
|
"rate_limit_time_window": 86400000,
|
|
"enabled": true,
|
|
"created_at": "2024-01-15T12:00:00Z",
|
|
"expires_at": "2024-12-31T23:59:59Z"
|
|
}
|
|
```
|
|
|
|
#### List API Keys
|
|
```http
|
|
GET /auth/api-keys
|
|
```
|
|
|
|
**Headers:**
|
|
```
|
|
Authorization: Bearer <session_token>
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"id": "api-key-id",
|
|
"name": "TUI Client Key",
|
|
"start": "sk_live_1234...",
|
|
"permissions": ["habits:read", "habits:write"],
|
|
"enabled": true,
|
|
"created_at": "2024-01-15T12:00:00Z",
|
|
"expires_at": "2024-12-31T23:59:59Z",
|
|
"last_used": "2024-01-20T10:30:00Z"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
#### Revoke API Key
|
|
```http
|
|
DELETE /auth/api-keys/{key_id}
|
|
```
|
|
|
|
**Headers:**
|
|
```
|
|
Authorization: Bearer <session_token>
|
|
```
|
|
|
|
### Email Verification
|
|
|
|
#### Send Verification Email
|
|
```http
|
|
POST /auth/verify-email
|
|
```
|
|
|
|
**Headers:**
|
|
```
|
|
Authorization: Bearer <session_token>
|
|
```
|
|
|
|
#### Verify Email
|
|
```http
|
|
POST /auth/verify-email/confirm
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"token": "verification-token"
|
|
}
|
|
```
|
|
|
|
### Password Reset
|
|
|
|
#### Request Password Reset
|
|
```http
|
|
POST /auth/forgot-password
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"email": "user@example.com"
|
|
}
|
|
```
|
|
|
|
#### Reset Password
|
|
```http
|
|
POST /auth/reset-password
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"token": "reset-token",
|
|
"password": "newpassword"
|
|
}
|
|
```
|
|
|
|
### Session Management
|
|
|
|
#### List Active Sessions
|
|
```http
|
|
GET /auth/sessions
|
|
```
|
|
|
|
**Headers:**
|
|
```
|
|
Authorization: Bearer <session_token>
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"id": "session-id",
|
|
"created_at": "2024-01-15T12:00:00Z",
|
|
"expires_at": "2024-01-22T12:00:00Z",
|
|
"ip_address": "192.168.1.100",
|
|
"user_agent": "Mozilla/5.0...",
|
|
"is_current": true
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
#### Revoke Session
|
|
```http
|
|
DELETE /auth/sessions/{session_id}
|
|
```
|
|
|
|
**Headers:**
|
|
```
|
|
Authorization: Bearer <session_token>
|
|
```
|
|
|
|
## Common Patterns
|
|
|
|
### Pagination
|
|
List endpoints support pagination with the following parameters:
|
|
- `limit`: Number of items per page (default: 50, max: 100)
|
|
- `offset`: Number of items to skip (default: 0)
|
|
- `cursor`: Cursor-based pagination for real-time data
|
|
|
|
**Example:**
|
|
```http
|
|
GET /api/habits?limit=20&offset=40
|
|
```
|
|
|
|
### Filtering
|
|
Most endpoints support filtering via query parameters:
|
|
- `fields`: Select specific fields to return
|
|
- `active`: Filter by active status (true/false)
|
|
- `start_date`: Filter by start date (ISO 8601)
|
|
- `end_date`: Filter by end date (ISO 8601)
|
|
|
|
**Example:**
|
|
```http
|
|
GET /api/habits?fields=id,name,active&active=true
|
|
```
|
|
|
|
### Response Format
|
|
All responses follow this structure:
|
|
```json
|
|
{
|
|
"data": [], // or {} for single items
|
|
"meta": {
|
|
"total": 100,
|
|
"limit": 20,
|
|
"offset": 40,
|
|
"has_more": true
|
|
},
|
|
"links": {
|
|
"self": "/api/habits?limit=20&offset=40",
|
|
"next": "/api/habits?limit=20&offset=60",
|
|
"prev": "/api/habits?limit=20&offset=20"
|
|
}
|
|
}
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
### Error Response Format
|
|
```json
|
|
{
|
|
"error": {
|
|
"code": "VALIDATION_ERROR",
|
|
"message": "Invalid request parameters",
|
|
"details": [
|
|
{
|
|
"field": "target_count",
|
|
"message": "Must be a positive integer"
|
|
}
|
|
],
|
|
"request_id": "req-uuid"
|
|
}
|
|
}
|
|
```
|
|
|
|
### HTTP Status Codes
|
|
- `200 OK`: Success
|
|
- `201 Created`: Resource created successfully
|
|
- `400 Bad Request`: Invalid request parameters
|
|
- `401 Unauthorized`: Authentication required
|
|
- `403 Forbidden`: Insufficient permissions
|
|
- `404 Not Found`: Resource not found
|
|
- `409 Conflict`: Resource already exists
|
|
- `422 Unprocessable Entity`: Validation error
|
|
- `429 Too Many Requests`: Rate limit exceeded
|
|
- `500 Internal Server Error`: Server error
|
|
|
|
## Rate Limiting
|
|
|
|
Rate limits are enforced per client type:
|
|
- **TUI**: 100 requests per minute
|
|
- **Mobile**: 200 requests per minute
|
|
- **Web**: 300 requests per minute
|
|
|
|
Rate limit headers are included in all responses:
|
|
```http
|
|
X-RateLimit-Limit: 100
|
|
X-RateLimit-Remaining: 95
|
|
X-RateLimit-Reset: 1642262400
|
|
```
|
|
|
|
## Caching
|
|
|
|
### ETags
|
|
Most GET endpoints support ETags for efficient caching:
|
|
```http
|
|
ETag: "33a64df551"
|
|
```
|
|
|
|
Use the `If-None-Match` header to check for updates:
|
|
```http
|
|
If-None-Match: "33a64df551"
|
|
```
|
|
|
|
### Cache Headers
|
|
```http
|
|
Cache-Control: max-age=300, private
|
|
Last-Modified: Mon, 15 Jan 2024 10:00:00 GMT
|
|
```
|
|
|
|
---
|
|
|
|
# Habits API
|
|
|
|
## Core Endpoints
|
|
|
|
### List Habits
|
|
```http
|
|
GET /api/habits
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `active`: Filter by active status (true/false)
|
|
- `frequency_type`: Filter by frequency type (daily/interval/multi_daily)
|
|
- `fields`: Select specific fields
|
|
- `limit`, `offset`: Pagination
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"id": "habit-uuid",
|
|
"name": "Take vitamins",
|
|
"description": "Daily vitamin supplement",
|
|
"frequency_type": "daily",
|
|
"target_count": 1,
|
|
"interval_days": null,
|
|
"active": true,
|
|
"created_at": "2024-01-01T00:00:00Z",
|
|
"updated_at": "2024-01-01T00:00:00Z"
|
|
}
|
|
],
|
|
"meta": {
|
|
"total": 5,
|
|
"limit": 50,
|
|
"offset": 0,
|
|
"has_more": false
|
|
}
|
|
}
|
|
```
|
|
|
|
### Get Habit
|
|
```http
|
|
GET /api/habits/{habit_id}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"id": "habit-uuid",
|
|
"name": "Take vitamins",
|
|
"description": "Daily vitamin supplement",
|
|
"frequency_type": "daily",
|
|
"target_count": 1,
|
|
"interval_days": null,
|
|
"active": true,
|
|
"created_at": "2024-01-01T00:00:00Z",
|
|
"updated_at": "2024-01-01T00:00:00Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Create Habit
|
|
```http
|
|
POST /api/habits
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"name": "Morning meditation",
|
|
"description": "15 minutes of mindfulness",
|
|
"frequency_type": "daily",
|
|
"target_count": 1
|
|
}
|
|
```
|
|
|
|
**Response:** `201 Created` with the created habit object.
|
|
|
|
### Update Habit
|
|
```http
|
|
PUT /api/habits/{habit_id}
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"name": "Updated habit name",
|
|
"description": "Updated description",
|
|
"active": false
|
|
}
|
|
```
|
|
|
|
### Delete Habit
|
|
```http
|
|
DELETE /api/habits/{habit_id}
|
|
```
|
|
|
|
**Response:** `204 No Content`
|
|
|
|
## Habit Completions
|
|
|
|
### List Completions
|
|
```http
|
|
GET /api/habits/{habit_id}/completions
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `start_date`: ISO 8601 date
|
|
- `end_date`: ISO 8601 date
|
|
- `limit`, `offset`: Pagination
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"id": "completion-uuid",
|
|
"habit_id": "habit-uuid",
|
|
"completed_at": "2024-01-15T08:30:00Z",
|
|
"notes": "Completed during lunch break",
|
|
"created_at": "2024-01-15T08:30:00Z"
|
|
}
|
|
],
|
|
"meta": {
|
|
"total": 30,
|
|
"limit": 50,
|
|
"offset": 0,
|
|
"has_more": false
|
|
}
|
|
}
|
|
```
|
|
|
|
### Create Completion
|
|
```http
|
|
POST /api/habits/{habit_id}/completions
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"completed_at": "2024-01-15T08:30:00Z",
|
|
"notes": "Completed during lunch break"
|
|
}
|
|
```
|
|
|
|
**Response:** `201 Created` with the completion object.
|
|
|
|
### Bulk Create Completions
|
|
```http
|
|
POST /api/habits/completions/bulk
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"completions": [
|
|
{
|
|
"habit_id": "habit-uuid-1",
|
|
"completed_at": "2024-01-15T08:30:00Z",
|
|
"notes": "Morning habit"
|
|
},
|
|
{
|
|
"habit_id": "habit-uuid-2",
|
|
"completed_at": "2024-01-15T09:00:00Z"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Habit Status
|
|
|
|
### Get Habit Status
|
|
```http
|
|
GET /api/habits/{habit_id}/status
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"habit_id": "habit-uuid",
|
|
"completed_today": true,
|
|
"completions_today": 2,
|
|
"target_count": 2,
|
|
"completion_rate": 1.0,
|
|
"current_streak": 15,
|
|
"longest_streak": 30,
|
|
"next_due_date": null,
|
|
"last_completed_at": "2024-01-15T08:30:00Z",
|
|
"status": "completed"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Get All Habits Status
|
|
```http
|
|
GET /api/habits/status
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"habit_id": "habit-uuid",
|
|
"name": "Take vitamins",
|
|
"completed_today": true,
|
|
"completions_today": 1,
|
|
"target_count": 1,
|
|
"status": "completed"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Bulk Status Check
|
|
```http
|
|
POST /api/habits/status/bulk
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"habit_ids": ["habit-uuid-1", "habit-uuid-2"]
|
|
}
|
|
```
|
|
|
|
## Habit Analytics
|
|
|
|
### Get Habit Statistics
|
|
```http
|
|
GET /api/habits/{habit_id}/stats
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `period`: week/month/year (default: month)
|
|
- `start_date`: ISO 8601 date
|
|
- `end_date`: ISO 8601 date
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"habit_id": "habit-uuid",
|
|
"period": "month",
|
|
"start_date": "2024-01-01",
|
|
"end_date": "2024-01-31",
|
|
"total_completions": 28,
|
|
"total_days": 31,
|
|
"completion_rate": 0.9032,
|
|
"current_streak": 15,
|
|
"longest_streak": 20,
|
|
"average_completions_per_day": 1.2,
|
|
"daily_breakdown": [
|
|
{
|
|
"date": "2024-01-01",
|
|
"completions": 1,
|
|
"target_met": true
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Get Habit Calendar
|
|
```http
|
|
GET /api/habits/calendar
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `start_date`: ISO 8601 date
|
|
- `end_date`: ISO 8601 date
|
|
- `habit_ids`: Comma-separated list of habit IDs
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"start_date": "2024-01-01",
|
|
"end_date": "2024-01-31",
|
|
"habits": [
|
|
{
|
|
"habit_id": "habit-uuid",
|
|
"name": "Take vitamins",
|
|
"calendar_data": [
|
|
{
|
|
"date": "2024-01-01",
|
|
"completions": 1,
|
|
"target_met": true,
|
|
"status": "completed"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Get Dashboard
|
|
```http
|
|
GET /api/habits/dashboard
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"overview": {
|
|
"total_habits": 5,
|
|
"active_habits": 4,
|
|
"completed_today": 3,
|
|
"completion_rate_today": 0.75,
|
|
"current_streak_avg": 12.5
|
|
},
|
|
"habits": [
|
|
{
|
|
"habit_id": "habit-uuid",
|
|
"name": "Take vitamins",
|
|
"frequency_type": "daily",
|
|
"completed_today": true,
|
|
"completions_today": 1,
|
|
"target_count": 1,
|
|
"current_streak": 15,
|
|
"status": "completed"
|
|
}
|
|
],
|
|
"upcoming": [
|
|
{
|
|
"habit_id": "habit-uuid",
|
|
"name": "Weekly cleaning",
|
|
"next_due_date": "2024-01-20",
|
|
"days_until_due": 3
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
# Intake Tracker API
|
|
|
|
## Intake Metrics
|
|
|
|
### List Intake Metrics
|
|
```http
|
|
GET /api/intake/metrics
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `active`: Filter by active status (true/false)
|
|
- `is_cumulative`: Filter by cumulative type (true/false)
|
|
- `fields`: Select specific fields
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"id": "metric-uuid",
|
|
"metric_type": "water",
|
|
"unit": "ml",
|
|
"display_name": "Water Intake",
|
|
"target_value": 2000,
|
|
"min_value": null,
|
|
"max_value": null,
|
|
"is_cumulative": true,
|
|
"active": true,
|
|
"created_at": "2024-01-01T00:00:00Z",
|
|
"updated_at": "2024-01-01T00:00:00Z"
|
|
}
|
|
],
|
|
"meta": {
|
|
"total": 3,
|
|
"limit": 50,
|
|
"offset": 0,
|
|
"has_more": false
|
|
}
|
|
}
|
|
```
|
|
|
|
### Get Intake Metric
|
|
```http
|
|
GET /api/intake/metrics/{metric_id}
|
|
```
|
|
|
|
### Create Intake Metric
|
|
```http
|
|
POST /api/intake/metrics
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"metric_type": "water",
|
|
"unit": "ml",
|
|
"display_name": "Water Intake",
|
|
"target_value": 2000,
|
|
"is_cumulative": true
|
|
}
|
|
```
|
|
|
|
### Update Intake Metric
|
|
```http
|
|
PUT /api/intake/metrics/{metric_id}
|
|
```
|
|
|
|
### Delete Intake Metric
|
|
```http
|
|
DELETE /api/intake/metrics/{metric_id}
|
|
```
|
|
|
|
## Intake Records
|
|
|
|
### List Intake Records
|
|
```http
|
|
GET /api/intake/metrics/{metric_id}/records
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `start_date`: ISO 8601 date
|
|
- `end_date`: ISO 8601 date
|
|
- `limit`, `offset`: Pagination
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"id": "record-uuid",
|
|
"intake_metric_id": "metric-uuid",
|
|
"value": 500,
|
|
"recorded_at": "2024-01-15T08:30:00Z",
|
|
"notes": "Morning hydration",
|
|
"created_at": "2024-01-15T08:30:00Z"
|
|
}
|
|
],
|
|
"meta": {
|
|
"total": 8,
|
|
"limit": 50,
|
|
"offset": 0,
|
|
"has_more": false
|
|
}
|
|
}
|
|
```
|
|
|
|
### Create Intake Record
|
|
```http
|
|
POST /api/intake/metrics/{metric_id}/records
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"value": 500,
|
|
"recorded_at": "2024-01-15T08:30:00Z",
|
|
"notes": "Morning hydration"
|
|
}
|
|
```
|
|
|
|
### Bulk Create Records
|
|
```http
|
|
POST /api/intake/records/bulk
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"records": [
|
|
{
|
|
"intake_metric_id": "metric-uuid-1",
|
|
"value": 500,
|
|
"recorded_at": "2024-01-15T08:30:00Z",
|
|
"notes": "Morning water"
|
|
},
|
|
{
|
|
"intake_metric_id": "metric-uuid-2",
|
|
"value": 70.5,
|
|
"recorded_at": "2024-01-15T07:00:00Z"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Intake Progress
|
|
|
|
### Get Metric Progress
|
|
```http
|
|
GET /api/intake/metrics/{metric_id}/progress
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `date`: Specific date (default: today)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"metric_id": "metric-uuid",
|
|
"date": "2024-01-15",
|
|
"current_value": 1500,
|
|
"target_value": 2000,
|
|
"unit": "ml",
|
|
"percentage_complete": 75,
|
|
"status": "in_progress",
|
|
"remaining": 500,
|
|
"entries_count": 3,
|
|
"first_entry_at": "2024-01-15T07:00:00Z",
|
|
"last_entry_at": "2024-01-15T14:30:00Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Get All Metrics Progress
|
|
```http
|
|
GET /api/intake/progress
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"metric_id": "metric-uuid",
|
|
"metric_type": "water",
|
|
"display_name": "Water Intake",
|
|
"current_value": 1500,
|
|
"target_value": 2000,
|
|
"unit": "ml",
|
|
"percentage_complete": 75,
|
|
"status": "in_progress"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Intake Analytics
|
|
|
|
### Get Daily Summaries
|
|
```http
|
|
GET /api/intake/metrics/{metric_id}/summaries
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `start_date`: ISO 8601 date
|
|
- `end_date`: ISO 8601 date
|
|
- `period`: day/week/month (default: day)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"id": "summary-uuid",
|
|
"intake_metric_id": "metric-uuid",
|
|
"date": "2024-01-15",
|
|
"total_value": 2100,
|
|
"entry_count": 4,
|
|
"first_entry_at": "2024-01-15T07:00:00Z",
|
|
"last_entry_at": "2024-01-15T20:00:00Z",
|
|
"target_met": true,
|
|
"target_value": 2000
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Get Intake Trends
|
|
```http
|
|
GET /api/intake/metrics/{metric_id}/trends
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `period`: week/month/year (default: month)
|
|
- `start_date`: ISO 8601 date
|
|
- `end_date`: ISO 8601 date
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"metric_id": "metric-uuid",
|
|
"period": "month",
|
|
"start_date": "2024-01-01",
|
|
"end_date": "2024-01-31",
|
|
"average_daily_value": 1850,
|
|
"target_value": 2000,
|
|
"target_achievement_rate": 0.85,
|
|
"highest_value": 2500,
|
|
"lowest_value": 1200,
|
|
"total_entries": 124,
|
|
"daily_data": [
|
|
{
|
|
"date": "2024-01-01",
|
|
"value": 1800,
|
|
"target_met": false,
|
|
"entry_count": 4
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Get Intake Calendar
|
|
```http
|
|
GET /api/intake/calendar
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `start_date`: ISO 8601 date
|
|
- `end_date`: ISO 8601 date
|
|
- `metric_ids`: Comma-separated list of metric IDs
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"start_date": "2024-01-01",
|
|
"end_date": "2024-01-31",
|
|
"metrics": [
|
|
{
|
|
"metric_id": "metric-uuid",
|
|
"display_name": "Water Intake",
|
|
"unit": "ml",
|
|
"calendar_data": [
|
|
{
|
|
"date": "2024-01-01",
|
|
"value": 1800,
|
|
"target_value": 2000,
|
|
"target_met": false,
|
|
"entry_count": 4
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Get Dashboard
|
|
```http
|
|
GET /api/intake/dashboard
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"overview": {
|
|
"total_metrics": 3,
|
|
"active_metrics": 3,
|
|
"targets_met_today": 2,
|
|
"target_achievement_rate": 0.67
|
|
},
|
|
"metrics": [
|
|
{
|
|
"metric_id": "metric-uuid",
|
|
"display_name": "Water Intake",
|
|
"current_value": 1500,
|
|
"target_value": 2000,
|
|
"unit": "ml",
|
|
"percentage_complete": 75,
|
|
"status": "in_progress",
|
|
"entries_today": 3
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
# Cross-System Integration
|
|
|
|
## Unified Dashboard
|
|
```http
|
|
GET /api/dashboard
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"overview": {
|
|
"date": "2024-01-15",
|
|
"habits_completed": 3,
|
|
"habits_total": 4,
|
|
"intake_targets_met": 2,
|
|
"intake_targets_total": 3
|
|
},
|
|
"habits": {
|
|
"completed_today": 3,
|
|
"completion_rate": 0.75,
|
|
"current_streak_avg": 12.5,
|
|
"habits": [
|
|
{
|
|
"habit_id": "habit-uuid",
|
|
"name": "Take vitamins",
|
|
"status": "completed",
|
|
"completions_today": 1,
|
|
"target_count": 1
|
|
}
|
|
]
|
|
},
|
|
"intake": {
|
|
"targets_met": 2,
|
|
"target_achievement_rate": 0.67,
|
|
"metrics": [
|
|
{
|
|
"metric_id": "metric-uuid",
|
|
"display_name": "Water Intake",
|
|
"current_value": 1500,
|
|
"target_value": 2000,
|
|
"status": "in_progress"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Goal Integration
|
|
|
|
### List Goal-Linked Habits
|
|
```http
|
|
GET /api/goals/habits
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"habit_id": "habit-uuid",
|
|
"name": "Drink enough water",
|
|
"goal_type": "water",
|
|
"goal_target": 2000,
|
|
"goal_unit": "ml",
|
|
"linked_metric_id": "metric-uuid",
|
|
"auto_complete": true,
|
|
"status": "pending"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Get Goal Status
|
|
```http
|
|
GET /api/goals/status
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"habit_id": "habit-uuid",
|
|
"name": "Drink enough water",
|
|
"goal_target": 2000,
|
|
"current_intake": 1500,
|
|
"goal_progress": 0.75,
|
|
"goal_met": false,
|
|
"habit_completed": false,
|
|
"can_auto_complete": false
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Reports
|
|
|
|
### Weekly Report
|
|
```http
|
|
GET /api/reports/weekly
|
|
```
|
|
|
|
**Query Parameters:**
|
|
- `start_date`: ISO 8601 date (default: start of current week)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"period": "week",
|
|
"start_date": "2024-01-08",
|
|
"end_date": "2024-01-14",
|
|
"habits": {
|
|
"total_habits": 4,
|
|
"average_completion_rate": 0.82,
|
|
"best_habit": {
|
|
"name": "Take vitamins",
|
|
"completion_rate": 1.0
|
|
},
|
|
"needs_attention": [
|
|
{
|
|
"name": "Exercise",
|
|
"completion_rate": 0.57
|
|
}
|
|
]
|
|
},
|
|
"intake": {
|
|
"total_metrics": 3,
|
|
"average_target_achievement": 0.75,
|
|
"best_metric": {
|
|
"display_name": "Water Intake",
|
|
"achievement_rate": 0.86
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Monthly Report
|
|
```http
|
|
GET /api/reports/monthly
|
|
```
|
|
|
|
---
|
|
|
|
# Real-Time Features
|
|
|
|
## WebSocket Connection
|
|
|
|
### Connect to WebSocket
|
|
```
|
|
wss://api.personal-system.com/v1/ws?token=<jwt_token>
|
|
```
|
|
|
|
### WebSocket Events
|
|
|
|
#### Subscribe to Events
|
|
```json
|
|
{
|
|
"type": "subscribe",
|
|
"channels": ["habits", "intake", "dashboard"]
|
|
}
|
|
```
|
|
|
|
#### Habit Completion Event
|
|
```json
|
|
{
|
|
"type": "habit_completed",
|
|
"data": {
|
|
"habit_id": "habit-uuid",
|
|
"completion_id": "completion-uuid",
|
|
"completed_at": "2024-01-15T08:30:00Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Intake Record Event
|
|
```json
|
|
{
|
|
"type": "intake_recorded",
|
|
"data": {
|
|
"metric_id": "metric-uuid",
|
|
"record_id": "record-uuid",
|
|
"value": 500,
|
|
"recorded_at": "2024-01-15T08:30:00Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Goal Achievement Event
|
|
```json
|
|
{
|
|
"type": "goal_achieved",
|
|
"data": {
|
|
"habit_id": "habit-uuid",
|
|
"metric_id": "metric-uuid",
|
|
"goal_target": 2000,
|
|
"current_value": 2000,
|
|
"auto_completed": true
|
|
}
|
|
}
|
|
```
|
|
|
|
## Push Notifications
|
|
|
|
### Register Device Token
|
|
```http
|
|
POST /api/notifications/devices
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"token": "device_token_here",
|
|
"platform": "ios",
|
|
"app_version": "1.0.0"
|
|
}
|
|
```
|
|
|
|
### Update Notification Settings
|
|
```http
|
|
PUT /api/notifications/settings
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"habit_reminders": true,
|
|
"goal_achievements": true,
|
|
"daily_summary": true,
|
|
"weekly_report": true
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
# Client-Specific Optimizations
|
|
|
|
## TUI Client
|
|
|
|
### Compact Endpoints
|
|
Use the `compact=true` query parameter for minimal data transfer:
|
|
|
|
```http
|
|
GET /api/habits/status?compact=true
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"id": "habit-uuid",
|
|
"name": "Take vitamins",
|
|
"status": "completed"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Terminal-Friendly Format
|
|
Use the `format=terminal` query parameter for structured output:
|
|
|
|
```http
|
|
GET /api/habits/dashboard?format=terminal
|
|
```
|
|
|
|
## Mobile Client
|
|
|
|
### Offline Sync
|
|
```http
|
|
GET /api/sync/changes?since=<timestamp>
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"habits": {
|
|
"created": [],
|
|
"updated": [],
|
|
"deleted": []
|
|
},
|
|
"completions": {
|
|
"created": [],
|
|
"updated": [],
|
|
"deleted": []
|
|
},
|
|
"intake_records": {
|
|
"created": [],
|
|
"updated": [],
|
|
"deleted": []
|
|
}
|
|
},
|
|
"sync_timestamp": "2024-01-15T12:00:00Z"
|
|
}
|
|
```
|
|
|
|
### Quick Actions
|
|
```http
|
|
POST /api/quick/habit-complete/{habit_id}
|
|
```
|
|
|
|
```http
|
|
POST /api/quick/intake-record/{metric_id}
|
|
```
|
|
|
|
## Web Client
|
|
|
|
### Bulk Operations
|
|
```http
|
|
POST /api/bulk/operations
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"operations": [
|
|
{
|
|
"type": "habit_complete",
|
|
"habit_id": "habit-uuid"
|
|
},
|
|
{
|
|
"type": "intake_record",
|
|
"metric_id": "metric-uuid",
|
|
"value": 500
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Export Data
|
|
```http
|
|
GET /api/export/habits?format=csv&start_date=2024-01-01&end_date=2024-01-31
|
|
```
|
|
|
|
```http
|
|
GET /api/export/intake?format=json&metric_ids=metric-uuid-1,metric-uuid-2
|
|
```
|
|
|
|
---
|
|
|
|
# SDK and Integration
|
|
|
|
## Webhook Support
|
|
|
|
### Register Webhook
|
|
```http
|
|
POST /api/webhooks
|
|
```
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"url": "https://your-app.com/webhook",
|
|
"events": ["habit_completed", "goal_achieved"],
|
|
"secret": "webhook_secret"
|
|
}
|
|
```
|
|
|
|
### Webhook Payload
|
|
```json
|
|
{
|
|
"event": "habit_completed",
|
|
"data": {
|
|
"habit_id": "habit-uuid",
|
|
"completion_id": "completion-uuid",
|
|
"completed_at": "2024-01-15T08:30:00Z"
|
|
},
|
|
"timestamp": "2024-01-15T08:30:00Z",
|
|
"signature": "sha256=..."
|
|
}
|
|
```
|
|
|
|
## API Versioning
|
|
|
|
The API uses URL-based versioning:
|
|
- Current version: `/v1/`
|
|
- Future versions: `/v2/`, `/v3/`, etc.
|
|
|
|
Version deprecation notices will be provided via the `X-API-Version-Deprecated` header.
|
|
|
|
---
|
|
|
|
This API documentation provides comprehensive coverage of all endpoints for the personal productivity system, optimized for TUI, mobile, and web clients. |