The Rust port at v2/ has been the primary codebase since the rename in #427. The Python implementation at v1/ is no longer the active target; the only load-bearing path is the deterministic proof bundle at v1/data/proof/ (per ADR-011 / ADR-028 witness verification). Move the whole Python tree into archive/v1/ and document the policy in archive/README.md: no new features, bug fixes only when they affect a still-load-bearing path (currently just the proof), CI continues to verify the proof on every push and PR. Path references updated in 26 files via path-pattern sed (only matches v1/<known-child> patterns, never bare v1 or API URLs like /api/v1/). Two double-prefix typos (archive/archive/v1/) caught and hand-fixed in verify-pipeline.yml and ADR-011. Validated: - Python proof verify.py imports cleanly at archive/v1/data/proof/ (numpy/scipy still required; CI installs requirements-lock.txt from archive/v1/ now) - cargo test --workspace --no-default-features → 1,539 passed, 0 failed, 8 ignored (unaffected by Python tree relocation) - ESP32-S3 on COM7 untouched (no firmware paths changed) After-merge: contributors should re-run any local `python v1/...` commands as `python archive/v1/...` (CLAUDE.md and CHANGELOG already updated).
7.6 KiB
WiFi-DensePose API Endpoints Summary
Overview
The WiFi-DensePose API provides RESTful endpoints and WebSocket connections for real-time human pose estimation using WiFi CSI (Channel State Information) data. The API is built with FastAPI and supports both synchronous REST operations and real-time streaming via WebSockets.
Base URL
- Development:
http://localhost:8000 - API Prefix:
/api/v1 - Documentation:
http://localhost:8000/docs
Authentication
Authentication is configurable via environment variables:
- When
ENABLE_AUTHENTICATION=true, protected endpoints require JWT tokens - Tokens can be passed via:
- Authorization header:
Bearer <token> - Query parameter:
?token=<token> - Cookie:
access_token
- Authorization header:
Rate Limiting
Rate limiting is configurable and when enabled (ENABLE_RATE_LIMITING=true):
- Anonymous: 100 requests/hour
- Authenticated: 1000 requests/hour
- Admin: 10000 requests/hour
Endpoints
1. Health & Status
GET /health/health
System health check with component status and metrics.
Response Example:
{
"status": "healthy",
"timestamp": "2025-06-09T16:00:00Z",
"uptime_seconds": 3600.0,
"components": {
"hardware": {...},
"pose": {...},
"stream": {...}
},
"system_metrics": {
"cpu": {"percent": 24.1, "count": 2},
"memory": {"total_gb": 7.75, "available_gb": 3.73},
"disk": {"total_gb": 31.33, "free_gb": 7.09}
}
}
GET /health/ready
Readiness check for load balancers.
GET /health/live
Simple liveness check.
GET /health/metrics 🔒
Detailed system metrics (requires auth).
2. Pose Estimation
GET /api/v1/pose/current
Get current pose estimation from WiFi signals.
Query Parameters:
zone_ids: List of zone IDs to analyzeconfidence_threshold: Minimum confidence (0.0-1.0)max_persons: Maximum persons to detectinclude_keypoints: Include keypoint data (default: true)include_segmentation: Include DensePose segmentation (default: false)
Response Example:
{
"timestamp": "2025-06-09T16:00:00Z",
"frame_id": "frame_123456",
"persons": [
{
"person_id": "0",
"confidence": 0.95,
"bounding_box": {"x": 0.1, "y": 0.2, "width": 0.3, "height": 0.6},
"keypoints": [...],
"zone_id": "zone_1",
"activity": "standing"
}
],
"zone_summary": {"zone_1": 1, "zone_2": 0},
"processing_time_ms": 45.2
}
POST /api/v1/pose/analyze 🔒
Analyze pose data with custom parameters (requires auth).
GET /api/v1/pose/zones/{zone_id}/occupancy
Get occupancy for a specific zone.
GET /api/v1/pose/zones/summary
Get occupancy summary for all zones.
GET /api/v1/pose/activities
Get recently detected activities.
Query Parameters:
zone_id: Filter by zonelimit: Maximum results (1-100)
POST /api/v1/pose/historical 🔒
Query historical pose data (requires auth).
Request Body:
{
"start_time": "2025-06-09T15:00:00Z",
"end_time": "2025-06-09T16:00:00Z",
"zone_ids": ["zone_1"],
"aggregation_interval": 300,
"include_raw_data": false
}
GET /api/v1/pose/stats
Get pose estimation statistics.
Query Parameters:
hours: Hours of data to analyze (1-168)
3. Calibration
POST /api/v1/pose/calibrate 🔒
Start system calibration (requires auth).
GET /api/v1/pose/calibration/status 🔒
Get calibration status (requires auth).
4. Streaming
GET /api/v1/stream/status
Get streaming service status.
POST /api/v1/stream/start 🔒
Start streaming service (requires auth).
POST /api/v1/stream/stop 🔒
Stop streaming service (requires auth).
GET /api/v1/stream/clients 🔒
List connected WebSocket clients (requires auth).
DELETE /api/v1/stream/clients/{client_id} 🔒
Disconnect specific client (requires auth).
POST /api/v1/stream/broadcast 🔒
Broadcast message to clients (requires auth).
5. WebSocket Endpoints
WS /api/v1/stream/pose
Real-time pose data streaming.
Query Parameters:
zone_ids: Comma-separated zone IDsmin_confidence: Minimum confidence (0.0-1.0)max_fps: Maximum frames per second (1-60)token: Auth token (if authentication enabled)
Message Types:
connection_established: Initial connection confirmationpose_update: Pose data updateserror: Error messagesping/pong: Keep-alive
WS /api/v1/stream/events
Real-time event streaming.
Query Parameters:
event_types: Comma-separated event typeszone_ids: Comma-separated zone IDstoken: Auth token (if authentication enabled)
6. API Information
GET /
Root endpoint with API information.
GET /api/v1/info
Detailed API configuration.
GET /api/v1/status
Current API and service status.
GET /api/v1/metrics
API performance metrics (if enabled).
7. Development Endpoints
These endpoints are only available when ENABLE_TEST_ENDPOINTS=true:
GET /api/v1/dev/config
Get current configuration (development only).
POST /api/v1/dev/reset
Reset services (development only).
Error Handling
All errors follow a consistent format:
{
"error": {
"code": 400,
"message": "Error description",
"type": "error_type"
}
}
Error types:
http_error: HTTP-related errorsvalidation_error: Request validation errorsauthentication_error: Authentication failuresrate_limit_exceeded: Rate limit violationsinternal_error: Server errors
WebSocket Protocol
Connection Flow
- Connect:
ws://host/api/v1/stream/pose?params - Receive: Connection confirmation message
- Send/Receive: Bidirectional communication
- Disconnect: Clean connection closure
Message Format
All WebSocket messages use JSON format:
{
"type": "message_type",
"timestamp": "ISO-8601 timestamp",
"data": {...}
}
Client Messages
{"type": "ping"}: Keep-alive ping{"type": "update_config", "config": {...}}: Update stream config{"type": "get_status"}: Request status{"type": "disconnect"}: Clean disconnect
Server Messages
{"type": "connection_established", ...}: Connection confirmed{"type": "pose_update", ...}: Pose data update{"type": "event", ...}: Event notification{"type": "pong"}: Ping response{"type": "error", "message": "..."}: Error message
CORS Configuration
CORS is enabled with configurable origins:
- Development: Allow all origins (
*) - Production: Restrict to specific domains
Security Headers
The API includes security headers:
X-Content-Type-Options: nosniffX-Frame-Options: DENYX-XSS-Protection: 1; mode=blockReferrer-Policy: strict-origin-when-cross-originContent-Security-Policy: ...
Performance Considerations
- Batch Requests: Use zone summaries instead of individual zone queries
- WebSocket Streaming: Adjust
max_fpsto reduce bandwidth - Historical Data: Use appropriate
aggregation_interval - Caching: Results are cached when Redis is enabled
Testing
Use the provided test scripts:
scripts/test_api_endpoints.py: Comprehensive endpoint testingscripts/test_websocket_streaming.py: WebSocket functionality testing
Production Deployment
For production:
- Set
ENVIRONMENT=production - Enable authentication and rate limiting
- Configure proper database (PostgreSQL)
- Enable Redis for caching
- Use HTTPS with valid certificates
- Restrict CORS origins
- Disable debug mode and test endpoints
- Configure monitoring and logging
API Versioning
The API uses URL versioning:
- Current version:
v1 - Base path:
/api/v1
Future versions will be available at /api/v2, etc.