{"openapi":"3.1.0","info":{"title":"SoLoFit External API","version":"v1","description":"Scoped HTTP API for SoLoFit athlete data, plans, runs, readiness, sleep, health, Coach, and account automation. Designed for agents such as Hermes and for developer integrations. Authenticate with a Personal Access Token (`sfa_...`) from Settings → Developer API, or a signed-in Supabase / native bearer token."},"servers":[{"url":"http://api.solofit.app","description":"SoLoFit API"}],"tags":[{"name":"Discovery"},{"name":"Keys"},{"name":"Athlete"},{"name":"Readiness"},{"name":"Plans"},{"name":"Training"},{"name":"Settings"},{"name":"Runs"},{"name":"Sleep"},{"name":"Health"},{"name":"Coach"},{"name":"Nutrition"},{"name":"Data"},{"name":"Sync"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"sfa_ Personal Access Token","description":"Use `Authorization: Bearer sfa_...` for agent access. Supabase access tokens and native `sfn_` sessions are also accepted."}},"schemas":{"Error":{"type":"object","properties":{"status":{"type":"string","example":"error"},"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}},"ApiToken":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"tokenPrefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":"string"},"expiresAt":{"type":"string"},"revokedAt":{"type":"string"}}}}},"security":[{"bearerAuth":[]}],"paths":{"/api/v1":{"get":{"tags":["Discovery"],"summary":"API root and capability index","security":[],"responses":{"200":{"description":"API index"}}}},"/api/v1/openapi.json":{"get":{"tags":["Discovery"],"summary":"OpenAPI 3.1 document","security":[],"responses":{"200":{"description":"OpenAPI document"}}}},"/api/v1/capabilities":{"get":{"tags":["Discovery"],"summary":"Machine-readable capability manifest","security":[],"responses":{"200":{"description":"Capabilities"}}}},"/api/v1/me":{"get":{"tags":["Athlete"],"summary":"Current athlete identity, active plan, readiness, and health summary","responses":{"200":{"description":"Athlete snapshot"},"401":{"description":"Unauthorized"}}}},"/api/v1/keys":{"get":{"tags":["Keys"],"summary":"List Personal Access Tokens for the signed-in athlete","responses":{"200":{"description":"Token list"}}},"post":{"tags":["Keys"],"summary":"Create a Personal Access Token","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","example":"Hermes Agent"},"scopes":{"oneOf":[{"type":"string","example":"hermes"},{"type":"array","items":{"type":"string"}}]},"expiresInDays":{"type":"integer","minimum":1,"maximum":3650}}}}}},"responses":{"201":{"description":"Token created. The raw token is returned once."}}}},"/api/v1/keys/{tokenId}":{"delete":{"tags":["Keys"],"summary":"Revoke a Personal Access Token","parameters":[{"name":"tokenId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Token revoked"}}}},"/api/v1/readiness":{"get":{"tags":["Readiness"],"summary":"Latest readiness / check-in","responses":{"200":{"description":"Readiness"}}}},"/api/v1/readiness/check-in":{"post":{"tags":["Readiness"],"summary":"Save a daily readiness check-in","responses":{"201":{"description":"Check-in saved"}}}},"/api/v1/plans/active":{"get":{"tags":["Plans"],"summary":"Active running plan revision","responses":{"200":{"description":"Active plan"}}},"post":{"tags":["Plans"],"summary":"Select or update the active running plan","responses":{"201":{"description":"Plan selected"}}},"delete":{"tags":["Plans"],"summary":"Retire the active running plan","responses":{"200":{"description":"Plan retired"}}}},"/api/v1/plans/library":{"get":{"tags":["Plans"],"summary":"Browse run and lift plan templates","responses":{"200":{"description":"Plan library"}}}},"/api/v1/plans/lifting/active":{"get":{"tags":["Plans"],"summary":"Active lifting plan revision","responses":{"200":{"description":"Active lifting plan"}}},"post":{"tags":["Plans"],"summary":"Select or update the active lifting plan","responses":{"201":{"description":"Lifting plan selected"}}},"delete":{"tags":["Plans"],"summary":"Retire the active lifting plan","responses":{"200":{"description":"Lifting plan retired"}}}},"/api/v1/training-logs":{"get":{"tags":["Training"],"summary":"List training / lift logs","responses":{"200":{"description":"Training logs"}}},"post":{"tags":["Training"],"summary":"Create a training or lift log","responses":{"201":{"description":"Log saved"}}}},"/api/v1/settings":{"get":{"tags":["Settings"],"summary":"Read athlete preferences","responses":{"200":{"description":"Settings"}}},"patch":{"tags":["Settings"],"summary":"Update athlete preferences","responses":{"200":{"description":"Settings updated"}}}},"/api/v1/runs":{"get":{"tags":["Runs"],"summary":"List run activities","responses":{"200":{"description":"Run list"}}}},"/api/v1/runs/export":{"get":{"tags":["Runs","Data"],"summary":"Export runs with route payloads when available","responses":{"200":{"description":"Run export"}}}},"/api/v1/runs/{runId}":{"get":{"tags":["Runs"],"summary":"Run detail","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Run detail"}}},"delete":{"tags":["Runs"],"summary":"Delete a run and its route object","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Run deleted"}}}},"/api/v1/runs/{runId}/route":{"get":{"tags":["Runs"],"summary":"Run route geometry","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Route"}}}},"/api/v1/sleep":{"get":{"tags":["Sleep"],"summary":"List sleep sessions","responses":{"200":{"description":"Sleep history"}}}},"/api/v1/health":{"get":{"tags":["Health"],"summary":"List health daily snapshots","responses":{"200":{"description":"Health snapshots"}}}},"/api/v1/coach/context":{"get":{"tags":["Coach"],"summary":"Coach context snapshot","responses":{"200":{"description":"Coach context"}}},"post":{"tags":["Coach"],"summary":"Coach context with client hints","responses":{"200":{"description":"Coach context"}}}},"/api/v1/coach/chat":{"post":{"tags":["Coach"],"summary":"Send a Coach chat message","responses":{"200":{"description":"Coach reply"}}}},"/api/v1/coach/export":{"get":{"tags":["Coach","Data"],"summary":"Export Coach threads, messages, memories, and context events","responses":{"200":{"description":"Coach export"}}}},"/api/v1/coach/memories/{memoryId}":{"delete":{"tags":["Coach"],"summary":"Forget a Coach memory","parameters":[{"name":"memoryId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Memory deleted"}}}},"/api/v1/nutrition/profile":{"get":{"tags":["Nutrition"],"summary":"Read athlete nutrition profile","responses":{"200":{"description":"Nutrition profile"}}},"patch":{"tags":["Nutrition"],"summary":"Update athlete nutrition profile","responses":{"200":{"description":"Nutrition profile saved"}}}},"/api/v1/nutrition/meals":{"get":{"tags":["Nutrition"],"summary":"List owner-scoped nutrition meals","responses":{"200":{"description":"Nutrition meals"}}},"post":{"tags":["Nutrition"],"summary":"Create a reviewed nutrition meal","responses":{"201":{"description":"Nutrition meal saved"}}}},"/api/v1/nutrition/meal-plans":{"get":{"tags":["Nutrition"],"summary":"List meal-plan revisions","responses":{"200":{"description":"Meal plans"}}},"post":{"tags":["Nutrition"],"summary":"Create a constraint-validated meal-plan revision","responses":{"201":{"description":"Meal plan saved"}}}},"/api/v1/nutrition/meal-plans/generate":{"post":{"tags":["Nutrition"],"summary":"Generate a style-aware meal-plan draft for athlete review","responses":{"202":{"description":"Meal-plan draft generated"}}}},"/api/v1/nutrition/meal-plans/{mealPlanId}/activate":{"post":{"tags":["Nutrition"],"summary":"Activate a reviewed meal-plan draft","parameters":[{"name":"mealPlanId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Meal plan activated"}}}},"/api/v1/nutrition/meal-plans/{mealPlanId}/discard":{"post":{"tags":["Nutrition"],"summary":"Discard a meal-plan draft without changing the current plan","parameters":[{"name":"mealPlanId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Meal-plan draft discarded"}}}},"/api/v1/nutrition/intelligence":{"get":{"tags":["Nutrition"],"summary":"Read the owner-scoped nutrition intelligence dashboard","responses":{"200":{"description":"Nutrition intelligence dashboard"}}}},"/api/v1/nutrition/smart-plates":{"post":{"tags":["Nutrition"],"summary":"Stage a multi-capture Smart Plate for athlete review","responses":{"201":{"description":"Smart Plate staged"}}}},"/api/v1/nutrition/food-trust/evaluate":{"post":{"tags":["Nutrition"],"summary":"Evaluate food source, serving, freshness, and duplicate signals","responses":{"200":{"description":"Food trust record"}}}},"/api/v1/nutrition/imports/preview":{"post":{"tags":["Nutrition"],"summary":"Preview an owner-scoped competitor nutrition import","responses":{"201":{"description":"Import preview"}}}},"/api/v1/nutrition/recipe-imports/preview":{"post":{"tags":["Nutrition"],"summary":"Extract a recipe into an athlete-reviewable draft","responses":{"201":{"description":"Recipe import draft"}}}},"/api/v1/nutrition/gap-solutions":{"post":{"tags":["Nutrition"],"summary":"Rank safe training-aware nutrient gap options","responses":{"200":{"description":"Nutrient gap solution"}}}},"/api/v1/nutrition/energy-check-ins":{"post":{"tags":["Nutrition"],"summary":"Create an athlete-controlled adaptive energy check-in","responses":{"201":{"description":"Energy check-in"}}}},"/api/v1/nutrition/experiments":{"post":{"tags":["Nutrition"],"summary":"Analyze a 14 to 28 day athlete nutrition experiment","responses":{"201":{"description":"Nutrition experiment"}}}},"/api/v1/nutrition/restaurant-decisions":{"post":{"tags":["Nutrition"],"summary":"Rank three restriction-safe restaurant choices","responses":{"201":{"description":"Provisional restaurant decision"}}}},"/api/v1/nutrition/routines":{"post":{"tags":["Nutrition"],"summary":"Save an owner-scoped nutrition routine","responses":{"201":{"description":"Nutrition routine"}}}},"/api/v1/nutrition/bulk-log":{"post":{"tags":["Nutrition"],"summary":"Copy or move reviewed nutrition records in bulk","responses":{"200":{"description":"Bulk logging result"}}}},"/api/v1/nutrition/grocery-executions":{"post":{"tags":["Nutrition"],"summary":"Prepare pantry-aware package comparison and grocery handoff","responses":{"201":{"description":"Grocery execution"}}}},"/api/v1/nutrition/shares/{token}":{"get":{"tags":["Nutrition"],"summary":"Read an athlete-created, time-limited grocery execution share","security":[],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Read-only grocery execution"},"404":{"description":"Invalid or expired share"}}}},"/api/v1/data/export":{"get":{"tags":["Data"],"summary":"Export athlete data package","responses":{"200":{"description":"Data export"}}}},"/api/v1/data":{"delete":{"tags":["Data"],"summary":"Delete all SoLoFit data for the current athlete","responses":{"200":{"description":"Athlete data deleted"}}}},"/api/v1/sync/stream":{"get":{"tags":["Sync"],"summary":"Server-Sent Events live sync stream","responses":{"200":{"description":"text/event-stream"}}}}}}