{"openapi":"3.1.0","info":{"title":"Adapted API","version":"1.0.0"},"paths":{"/v0/chat":{"get":{"summary":"Get Messages","operationId":"get_messages_v0_chat_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Message"},"title":"Response Get Messages V0 Chat Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/chat/stream":{"post":{"summary":"Send Message Stream","operationId":"send_message_stream_v0_chat_stream_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/checkins":{"post":{"summary":"Create Checkin","description":"Return the caller's pending check-in, or generate, store and return one.\n\nIdempotent: repeat POSTs return the same check-in rather than stacking them up, so a\nclient that retries on a flaky connection does not spend a generation each time. The\nbody is optional — a bare POST takes the defaults.","operationId":"create_checkin_v0_checkins_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CheckinCreateRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckinResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Completed Checkins","description":"The caller's completed check-ins, most recently completed first.","operationId":"list_completed_checkins_v0_checkins_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CheckinResponse"},"title":"Response List Completed Checkins V0 Checkins Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/checkins/current":{"get":{"summary":"Get Current Checkin","description":"The caller's pending check-in, or 204 when there is none.\n\n204 rather than 404: \"nothing to answer right now\" is the normal state, not an error,\nand the client should not have to treat it as one.","operationId":"get_current_checkin_v0_checkins_current_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckinResponse"}}}},"204":{"description":"No pending check-in"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/checkins/{checkin_id}/submit":{"post":{"summary":"Submit Checkin","description":"Validate and store answers, returning the completed check-in.\n\nReplaying the same body is a 200 with the stored check-in. A different body for an\nalready-answered check-in is a 409 — the first submission stands.","operationId":"submit_checkin_v0_checkins__checkin_id__submit_post","parameters":[{"name":"checkin_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Checkin Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckinSubmitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckinResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/concierge/next-question-v2":{"post":{"summary":"Get Next Question V2","operationId":"get_next_question_v2_v0_concierge_next_question_v2_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetNextQuestionRequestV2"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetNextQuestionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/concierge/generate-summary":{"post":{"summary":"Generate Summary","operationId":"generate_summary_v0_concierge_generate_summary_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSummaryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/exercises":{"get":{"tags":["exercises"],"summary":"Get Exercises","operationId":"get_exercises_v0_exercises_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Exercise"},"type":"array","title":"Response Get Exercises V0 Exercises Get"}}}}}}},"/v0/exercises/alternatives":{"post":{"tags":["exercises"],"summary":"Get Exercise Alternatives","operationId":"get_exercise_alternatives_v0_exercises_alternatives_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExerciseAlternativesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExerciseAlternativeResponse"},"title":"Response Get Exercise Alternatives V0 Exercises Alternatives Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/jobs/{job_id}":{"get":{"summary":"Get Job","operationId":"get_job_v0_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/jobs":{"get":{"summary":"Get Jobs","operationId":"get_jobs_v0_jobs_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Job"},"title":"Response Get Jobs V0 Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/profiles/me":{"get":{"summary":"Get My Profile","operationId":"get_my_profile_v0_profiles_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update My Profile","operationId":"update_my_profile_v0_profiles_me_patch","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/profiles/me/initial-assessment":{"put":{"summary":"Seed Initial Assessment","description":"Seed the living log with the onboarding assessment — the one entry that originates\non the client. Idempotent: a second call is a no-op returning `seeded: false`, which\nis the normal result when onboarding resumes and replays this step.","operationId":"seed_initial_assessment_v0_profiles_me_initial_assessment_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitialAssessmentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitialAssessmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/programs/plan":{"post":{"summary":"Plan Program","operationId":"plan_program_v0_programs_plan_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanProgramRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgramPlan"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/programs/from-plan":{"post":{"summary":"Create Program From Plan","operationId":"create_program_from_plan_v0_programs_from_plan_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFromPlanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgramResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/programs":{"get":{"summary":"Get Programs","operationId":"get_programs_v0_programs_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProgramResponse"},"title":"Response Get Programs V0 Programs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Generate Program","operationId":"generate_program_v0_programs_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateProgramRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgramResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/programs/{program_id}":{"get":{"summary":"Get Program","operationId":"get_program_v0_programs__program_id__get","parameters":[{"name":"program_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Program Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgramResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Program","operationId":"update_program_v0_programs__program_id__patch","parameters":[{"name":"program_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Program Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgramUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgramResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/programs/async":{"post":{"summary":"Generate Program Async","operationId":"generate_program_async_v0_programs_async_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateProgramRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/programs/{program_id}/sessions":{"post":{"summary":"Generate Next Session","operationId":"generate_next_session_v0_programs__program_id__sessions_post","parameters":[{"name":"program_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Program Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/sessions/on-demand":{"post":{"summary":"Create On Demand Session","operationId":"create_on_demand_session_v0_sessions_on_demand_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnDemandSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/sessions":{"get":{"summary":"Get Sessions","operationId":"get_sessions_v0_sessions_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SessionResponse"},"title":"Response Get Sessions V0 Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/sessions/{session_id}":{"get":{"summary":"Get Session","operationId":"get_session_v0_sessions__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/sessions/{session_id}/start":{"patch":{"summary":"Start Session","operationId":"start_session_v0_sessions__session_id__start_patch","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/sessions/{session_id}/cancel":{"patch":{"summary":"Cancel Session","operationId":"cancel_session_v0_sessions__session_id__cancel_patch","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/sessions/{session_id}/complete":{"patch":{"summary":"Complete Session","operationId":"complete_session_v0_sessions__session_id__complete_patch","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CompleteSessionRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/sessions/{session_id}/exercise/{exercise_id}/complete":{"patch":{"summary":"Complete Exercise","operationId":"complete_exercise_v0_sessions__session_id__exercise__exercise_id__complete_patch","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/sessions/{session_id}/exercise/{exercise_id}/skip":{"patch":{"summary":"Skip Exercise","operationId":"skip_exercise_v0_sessions__session_id__exercise__exercise_id__skip_patch","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/sessions/{session_id}/exercise/{exercise_id}/remove":{"patch":{"summary":"Remove Exercise","operationId":"remove_exercise_v0_sessions__session_id__exercise__exercise_id__remove_patch","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/sessions/{session_id}/exercise/{exercise_id}/swap":{"patch":{"summary":"Swap Exercise","operationId":"swap_exercise_v0_sessions__session_id__exercise__exercise_id__swap_patch","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"exercise_id","in":"path","required":true,"schema":{"type":"string","title":"Exercise Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwapExerciseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/sessions/{session_id}/adjust":{"post":{"summary":"Adjust Session","operationId":"adjust_session_v0_sessions__session_id__adjust_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdjustSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/sessions/{session_id}/regenerate":{"post":{"summary":"Regenerate Session","operationId":"regenerate_session_v0_sessions__session_id__regenerate_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/integrations/strava/status":{"get":{"summary":"Strava Status","operationId":"strava_status_v0_integrations_strava_status_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StravaStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/integrations/strava/disconnect":{"delete":{"summary":"Disconnect Strava","operationId":"disconnect_strava_v0_integrations_strava_disconnect_delete","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v0/integrations/strava/connect":{"post":{"summary":"Connect Strava","operationId":"connect_strava_v0_integrations_strava_connect_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StravaConnectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StravaTokens"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/superwall":{"post":{"summary":"Superwall Webhook","operationId":"superwall_webhook_webhooks_superwall_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Superwall Webhook Webhooks Superwall Post"}}}}}}},"/":{"get":{"summary":"Root","description":"Root endpoint","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health Check","description":"Health check endpoint","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AdjustSessionRequest":{"properties":{"duration_min":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Duration Min"},"equipment":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Equipment"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"}},"type":"object","title":"AdjustSessionRequest"},"BodyRegion":{"type":"string","enum":["foot_ankle","knee","hip_groin","low_back","mid_back","neck","shoulder","elbow","wrist"],"title":"BodyRegion"},"CheckinAnswer":{"properties":{"question_id":{"type":"string","title":"Question Id"},"selected_option_ids":{"items":{"type":"string"},"type":"array","title":"Selected Option Ids"},"free_text":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Free Text"}},"additionalProperties":false,"type":"object","required":["question_id","selected_option_ids"],"title":"CheckinAnswer","description":"One athlete answer to one question, stored exactly as submitted.\n\n`extra=\"forbid\"`: a misspelled key is a 422 rather than a silently dropped answer."},"CheckinCreateRequest":{"properties":{"recent_exposure":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Recent Exposure"}},"additionalProperties":false,"type":"object","title":"CheckinCreateRequest","description":"The smallest create request: what to anchor the questions to, and nothing else.\n\nNo `user_id` — ownership comes from the JWT only. No cadence, due date, or schedule.\nNo focus dimension either: that is internal clinical vocabulary the server chooses\n(`focus_dimension_for`), not something a client should be picking.\n\n`recent_exposure` is here on borrowed time. Whether the athlete describes their week or\nthe server derives it from logged sessions is undecided, and this field is what makes\nthe question answerable by trying it."},"CheckinResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status":{"type":"string","enum":["pending","completed","expired"],"title":"Status"},"questionnaire":{"additionalProperties":true,"type":"object","title":"Questionnaire"},"answers":{"items":{"$ref":"#/components/schemas/CheckinAnswer"},"type":"array","title":"Answers"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","status","questionnaire","answers","created_at","completed_at"],"title":"CheckinResponse","description":"What the client sees.\n\n`questionnaire` is `CheckinQuestionnaireBase.user_facing_payload()` — a plain dict\nrather than a second set of Pydantic models. Re-declaring the question tree here\npurely to strip two internal fields would be a third place for the questionnaire\nshape to live and drift.\n\n`follow_ups` is always present and is `[]` on a question with no branches. A follow-up's\nown question always has an empty array because A-269 caps branching at one level."},"CheckinSubmitRequest":{"properties":{"answers":{"items":{"$ref":"#/components/schemas/CheckinAnswer"},"type":"array","title":"Answers"}},"additionalProperties":false,"type":"object","required":["answers"],"title":"CheckinSubmitRequest"},"CompleteSessionRequest":{"properties":{"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback"},"exercise_logs":{"items":{"$ref":"#/components/schemas/ExerciseLogsInput"},"type":"array","title":"Exercise Logs","default":[]},"utc_offset_seconds":{"type":"integer","title":"Utc Offset Seconds","default":0}},"type":"object","title":"CompleteSessionRequest"},"ConversationTurn":{"properties":{"question_text":{"type":"string","title":"Question Text"},"answer_options":{"items":{"type":"string"},"type":"array","title":"Answer Options"},"answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer"}},"type":"object","required":["question_text"],"title":"ConversationTurn","description":"A single question-answer turn in the onboarding conversation."},"CreateFromPlanRequest":{"properties":{"program_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Program Id"},"plan":{"$ref":"#/components/schemas/ProgramPlan"},"duration_in_weeks":{"type":"integer","exclusiveMinimum":0.0,"title":"Duration In Weeks"},"num_sessions_per_week":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Num Sessions Per Week"},"session_duration_min":{"type":"integer","exclusiveMinimum":0.0,"title":"Session Duration Min"},"scheduled_days":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Scheduled Days"},"regions":{"items":{"$ref":"#/components/schemas/BodyRegion"},"type":"array","title":"Regions"}},"type":"object","required":["plan","duration_in_weeks","session_duration_min"],"title":"CreateFromPlanRequest"},"Exercise":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"instructions":{"type":"string","title":"Instructions"},"purpose":{"type":"string","title":"Purpose"},"category":{"type":"string","title":"Category"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"youtube_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube Url"},"regions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Regions"},"equipment":{"items":{"type":"string"},"type":"array","title":"Equipment","default":[]},"status":{"type":"string","enum":["draft","active","archived"],"title":"Status"},"load_type":{"$ref":"#/components/schemas/LoadType","default":"bodyweight_only"},"unit_type":{"type":"string","enum":["reps_only","seconds_only"],"title":"Unit Type","default":"reps_only"},"exercise_videos":{"items":{"$ref":"#/components/schemas/ExerciseVideo"},"type":"array","title":"Exercise Videos","default":[]}},"type":"object","required":["id","name","instructions","purpose","category"],"title":"Exercise"},"ExerciseAlternativeResponse":{"properties":{"prescription":{"$ref":"#/components/schemas/ExercisePrescriptionResponse"},"relative_difficulty":{"type":"string","enum":["easier","similar","harder"],"title":"Relative Difficulty","description":"Difficulty relative to the exercise being replaced. Only meaningful in the context of an alternative — not an intrinsic property of the prescription itself."}},"type":"object","required":["prescription","relative_difficulty"],"title":"ExerciseAlternativeResponse","description":"API response for an exercise alternative, wrapping a prescription with relative difficulty."},"ExerciseAlternativesRequest":{"properties":{"prescription":{"$ref":"#/components/schemas/ExercisePrescription"},"exclude_ids":{"items":{"type":"string"},"type":"array","title":"Exclude Ids","default":[]},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"}},"type":"object","required":["prescription"],"title":"ExerciseAlternativesRequest"},"ExerciseLogsInput":{"properties":{"exercise_id":{"type":"string","title":"Exercise Id"},"skipped":{"type":"boolean","title":"Skipped","default":false},"set_logs":{"items":{"$ref":"#/components/schemas/SetLog"},"type":"array","title":"Set Logs"}},"type":"object","required":["exercise_id"],"title":"ExerciseLogsInput"},"ExercisePrescription":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"sets":{"type":"integer","title":"Sets"},"reps_value":{"type":"integer","title":"Reps Value"},"reps_unit":{"type":"string","title":"Reps Unit"},"rest_secs":{"type":"integer","title":"Rest Secs"},"rpe":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rpe"},"estimated_duration_min":{"type":"integer","title":"Estimated Duration Min"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning"},"rationale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rationale"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"skipped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Skipped At"},"removed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Removed At"},"set_logs":{"items":{"$ref":"#/components/schemas/SetLog"},"type":"array","title":"Set Logs"}},"type":"object","required":["exercise_id","sets","reps_value","reps_unit","rest_secs","estimated_duration_min"],"title":"ExercisePrescription"},"ExercisePrescriptionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"exercise":{"$ref":"#/components/schemas/Exercise"},"sets":{"type":"integer","title":"Sets"},"reps_value":{"type":"integer","title":"Reps Value"},"reps_unit":{"type":"string","title":"Reps Unit"},"rest_secs":{"type":"integer","title":"Rest Secs"},"rpe":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rpe"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning"},"rationale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rationale"},"estimated_duration_min":{"type":"integer","title":"Estimated Duration Min"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"skipped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Skipped At"},"removed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Removed At"},"set_logs":{"items":{"$ref":"#/components/schemas/SetLog"},"type":"array","title":"Set Logs"}},"type":"object","required":["id","exercise","sets","reps_value","reps_unit","rest_secs","estimated_duration_min"],"title":"ExercisePrescriptionResponse","description":"Exercise prescription with full exercise details for API response."},"ExerciseVideo":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"exercise_id":{"type":"string","title":"Exercise Id"},"video_path":{"type":"string","title":"Video Path"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"type":"integer","title":"Sort Order","default":0}},"type":"object","required":["id","exercise_id","video_path"],"title":"ExerciseVideo"},"GenerateProgramRequest":{"properties":{"athlete_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Athlete Context"},"program_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Program Name"},"duration_in_weeks":{"type":"integer","title":"Duration In Weeks"},"num_sessions_per_week":{"type":"integer","title":"Num Sessions Per Week"},"session_duration_min":{"type":"integer","title":"Session Duration Min"},"scheduled_days":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Scheduled Days"},"regions":{"items":{"$ref":"#/components/schemas/BodyRegion"},"type":"array","title":"Regions"},"goal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goal"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["duration_in_weeks","num_sessions_per_week","session_duration_min"],"title":"GenerateProgramRequest"},"GenerateSummaryRequest":{"properties":{"user_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"User Context","description":"User context (name, age, gender, sports, goal, regions)."},"history":{"items":{"$ref":"#/components/schemas/QuestionAnswerPair"},"type":"array","title":"History","description":"Complete Q&A history with reasoning"}},"type":"object","required":["history"],"title":"GenerateSummaryRequest","description":"Request body for generating athlete context summary."},"GenerateSummaryResponse":{"properties":{"athlete_context":{"type":"string","title":"Athlete Context","description":"Markdown-formatted athlete profile summary"}},"type":"object","required":["athlete_context"],"title":"GenerateSummaryResponse","description":"Response body for generating athlete context summary."},"GetNextQuestionRequestV2":{"properties":{"regions":{"items":{"type":"string"},"type":"array","title":"Regions","description":"Body regions selected during program setup"},"goal":{"type":"string","title":"Goal","description":"Primary goal selected during program setup"},"conversation":{"items":{"$ref":"#/components/schemas/ConversationTurn"},"type":"array","title":"Conversation","description":"Full conversation history (empty on first call)"}},"type":"object","required":["regions","goal"],"title":"GetNextQuestionRequestV2","description":"Request body for v2 next-question endpoint."},"GetNextQuestionResponse":{"properties":{"question":{"$ref":"#/components/schemas/OnboardingQuestion"}},"type":"object","required":["question"],"title":"GetNextQuestionResponse","description":"Response body for getting the next onboarding question."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InitialAssessmentRequest":{"properties":{"assessment":{"type":"string","title":"Assessment"}},"type":"object","required":["assessment"],"title":"InitialAssessmentRequest"},"InitialAssessmentResponse":{"properties":{"seeded":{"type":"boolean","title":"Seeded"}},"type":"object","required":["seeded"],"title":"InitialAssessmentResponse"},"Job":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"type":{"$ref":"#/components/schemas/JobType"},"status":{"$ref":"#/components/schemas/JobStatus"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","type","status","created_at","updated_at"],"title":"Job"},"JobStatus":{"type":"string","enum":["pending","running","completed","failed"],"title":"JobStatus"},"JobType":{"type":"string","enum":["program_generation"],"title":"JobType"},"LoadType":{"type":"string","enum":["bodyweight_only","loaded_only","bodyweight_or_loaded"],"title":"LoadType"},"Message":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"role":{"$ref":"#/components/schemas/MessageRole"},"content":{"type":"string","title":"Content"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","role","content","created_at"],"title":"Message"},"MessageCreate":{"properties":{"role":{"$ref":"#/components/schemas/MessageRole"},"content":{"type":"string","title":"Content"},"context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Context"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["role","content"],"title":"MessageCreate"},"MessageRole":{"type":"string","enum":["assistant","user"],"title":"MessageRole"},"OnDemandSessionRequest":{"properties":{"objective":{"type":"string","enum":["activation","mobility","recovery"],"title":"Objective"},"regions":{"items":{"$ref":"#/components/schemas/BodyRegion"},"type":"array","title":"Regions"},"duration_min":{"type":"integer","title":"Duration Min","default":15},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"equipment":{"items":{"type":"string"},"type":"array","title":"Equipment","default":[]}},"type":"object","required":["objective","regions"],"title":"OnDemandSessionRequest"},"OnboardingQuestion":{"properties":{"response":{"type":"string","title":"Response"},"answer_options":{"items":{"type":"string"},"type":"array","title":"Answer Options"},"phase":{"type":"string","enum":["clinical_assessment","training_background","complete"],"title":"Phase"},"reasoning":{"type":"string","title":"Reasoning"}},"type":"object","required":["response","phase","reasoning"],"title":"OnboardingQuestion","description":"Question model returned by concierge service."},"PlanProgramRequest":{"properties":{"context":{"type":"string","title":"Context"},"duration_weeks":{"type":"integer","title":"Duration Weeks"},"sessions_per_week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sessions Per Week"},"session_duration_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Duration Min"}},"type":"object","required":["context","duration_weeks"],"title":"PlanProgramRequest"},"ProfileResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"onboarding_completed":{"type":"boolean","title":"Onboarding Completed","default":false},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"birthday":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birthday"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"},"sports":{"items":{"type":"string"},"type":"array","title":"Sports","default":[]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution"},"equipment":{"items":{"type":"string"},"type":"array","title":"Equipment","default":[]},"skipped_concierge":{"type":"boolean","title":"Skipped Concierge","default":false},"debug_enabled":{"type":"boolean","title":"Debug Enabled","default":false}},"type":"object","required":["id"],"title":"ProfileResponse","description":"Client-facing profile shape returned by `GET/PATCH /v0/profiles/me`.\n\nDeliberately omits `athlete_context` (the living log — server-owned, see\n`services/patient_memory.py`), `created_at`, `conversation_summary`,\n`summary_last_updated_at`, and `welcome_email_sent_at`. iOS `UserProfile`\ndecodes exactly these fields and requires `id`, `onboarding_completed`,\n`sports`, `equipment`, and `skipped_concierge` to be present and non-null.\n\n`debug_enabled` is served but not writable (absent from `ProfileUpdate`):\nit gates the app's Debug Settings per user in release builds and is flipped\nonly in the Supabase dashboard. iOS decodes it as an optional, so older\nservers omitting it cannot brick launch."},"ProfileUpdate":{"properties":{"onboarding_completed":{"type":"boolean","title":"Onboarding Completed","default":false},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"birthday":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birthday"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"},"sports":{"items":{"type":"string"},"type":"array","title":"Sports","default":[]},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution"},"equipment":{"items":{"type":"string"},"type":"array","title":"Equipment","default":[]},"skipped_concierge":{"type":"boolean","title":"Skipped Concierge","default":false}},"additionalProperties":false,"type":"object","title":"ProfileUpdate","description":"Client-writable profile fields.\n\n`athlete_context` is absent by design and `model_config` forbids extra keys, so a\nclient cannot write the living log through this endpoint even by sending the column\nname — the request is rejected with a 422 instead of silently ignored. `id` and\n`created_at` are likewise not writable; ownership comes from the JWT.\n`debug_enabled` is absent for the same reason: it is server-owned (flipped in the\nSupabase dashboard), so a user cannot enable their own debug mode through this API.\n\nWrites use `exclude_unset=True`, so an omitted field is left untouched rather than\nnulled, and a nullable field can be cleared by sending an explicit `null`.\n\nNullability here is stricter than uniformly-optional: `onboarding_completed`,\n`equipment`, and `skipped_concierge` are `NOT NULL` in the database, so they are\ndeclared non-nullable and an explicit `null` is a 422. Typing them as `| None` instead\nlet the null reach Postgres, which answered with a not-null violation that surfaced as\na 500 and a Sentry alert.\n\n`sports` is the exception: it is `NULL`-able in Postgres, so a null there is accepted\nby the database rather than rejected. It is still non-nullable here, because iOS\ndecodes `sports` as a non-optional `[String]` — a stored NULL would fail validation on\nthe *next* `GET /me` and brick launch for that user with nothing the client can do.\n`Profile` coerces such a row back to `[]` on read; this keeps one from being created."},"ProgramPlan":{"properties":{"reasoning":{"type":"string","title":"Reasoning","description":"Brief triage reasoning (3-5 sentences) before committing to the plan. What is the key signal in this athlete's context, what deficits or patterns should drive this program, and why are the selected focus regions the right priority right now? Be specific and clinical - this shapes everything below."},"name":{"type":"string","title":"Name","description":"Short program name (2-4 words). Reflects the user-selected focus regions and goal. Plain language, specific to this athlete (e.g. 'Knee Stability Build', 'Hip Mobility Recovery', 'Shoulder Prehab')."},"intent":{"type":"string","title":"Intent","description":"Internal clinical objective (1 paragraph). State what capacity we're building, key movement patterns or systems requiring attention, and loading approach or constraints. Used by the AI to guide session generation - be precise and clinical."},"description":{"type":"string","title":"Description","description":"User-facing program description (2-3 sentences). Plain language, no jargon. Tell the athlete what this program is, what they'll build, and why it matters for their goals. Motivating and specific to their situation."},"weekly_phases":{"items":{"$ref":"#/components/schemas/WeeklyPhase"},"type":"array","title":"Weekly Phases","description":"One entry per week for the full program duration, in order."}},"type":"object","required":["reasoning","name","intent","description","weekly_phases"],"title":"ProgramPlan"},"ProgramResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"duration_in_weeks":{"type":"integer","title":"Duration In Weeks"},"num_sessions_per_week":{"type":"integer","title":"Num Sessions Per Week"},"session_duration_min":{"type":"integer","title":"Session Duration Min"},"sessions":{"items":{"$ref":"#/components/schemas/SessionResponse"},"type":"array","title":"Sessions"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"scheduled_days":{"items":{"type":"integer"},"type":"array","title":"Scheduled Days"},"regions":{"items":{"$ref":"#/components/schemas/BodyRegion"},"type":"array","title":"Regions"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"weekly_phases":{"anyOf":[{"items":{"$ref":"#/components/schemas/WeeklyPhase"},"type":"array"},{"type":"null"}],"title":"Weekly Phases"},"status":{"type":"string","enum":["active","completed","cancelled"],"title":"Status","default":"active"},"next_session_status":{"anyOf":[{"type":"string","enum":["generating","failed"]},{"type":"null"}],"title":"Next Session Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","duration_in_weeks","num_sessions_per_week","session_duration_min","sessions","start_date","scheduled_days","metadata","created_at","updated_at"],"title":"ProgramResponse"},"ProgramUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"status":{"anyOf":[{"type":"string","enum":["active","completed","cancelled"]},{"type":"null"}],"title":"Status"},"duration_in_weeks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration In Weeks"},"num_sessions_per_week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Sessions Per Week"},"session_duration_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Duration Min"},"sessions":{"anyOf":[{"items":{"$ref":"#/components/schemas/Session"},"type":"array"},{"type":"null"}],"title":"Sessions"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"scheduled_days":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Scheduled Days"},"regions":{"anyOf":[{"items":{"$ref":"#/components/schemas/BodyRegion"},"type":"array"},{"type":"null"}],"title":"Regions"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","title":"ProgramUpdate"},"QuestionAnswerPair":{"properties":{"question":{"$ref":"#/components/schemas/OnboardingQuestion"},"answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer"}},"type":"object","required":["question"],"title":"QuestionAnswerPair","description":"Pairs a question with its answer for summary generation."},"RegenerateSessionRequest":{"properties":{"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback"},"duration_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Min"},"equipment":{"items":{"type":"string"},"type":"array","title":"Equipment","default":[]}},"type":"object","title":"RegenerateSessionRequest"},"Session":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"week":{"type":"integer","title":"Week"},"session_number":{"type":"integer","title":"Session Number"},"exercises":{"items":{"$ref":"#/components/schemas/ExercisePrescription"},"type":"array","title":"Exercises"},"description":{"type":"string","title":"Description"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning","description":"Internal clinical reasoning for the session"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback","description":"User feedback about the session upon completion"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["name","week","session_number","exercises","description"],"title":"Session"},"SessionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"program_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Program Id"},"objective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Objective"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"exercises":{"items":{"$ref":"#/components/schemas/ExercisePrescriptionResponse"},"type":"array","title":"Exercises"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Week"},"session_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Number"}},"type":"object","required":["id","user_id","name","description","exercises","created_at"],"title":"SessionResponse","description":"API response model for sessions."},"SetLog":{"properties":{"reps_value":{"type":"integer","title":"Reps Value"},"reps_unit":{"type":"string","enum":["reps","seconds"],"title":"Reps Unit"},"weight_lbs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weight Lbs"},"rpe":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rpe"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["reps_value","reps_unit"],"title":"SetLog"},"StravaConnectRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"StravaConnectRequest"},"StravaStatus":{"properties":{"connected":{"type":"boolean","title":"Connected"}},"type":"object","required":["connected"],"title":"StravaStatus"},"StravaTokens":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"expires_at":{"type":"integer","title":"Expires At"},"athlete_id":{"type":"integer","title":"Athlete Id"}},"type":"object","required":["access_token","refresh_token","expires_at","athlete_id"],"title":"StravaTokens"},"SwapExerciseRequest":{"properties":{"replacement":{"$ref":"#/components/schemas/ExercisePrescription"}},"type":"object","required":["replacement"],"title":"SwapExerciseRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WeeklyPhase":{"properties":{"week":{"type":"integer","title":"Week","description":"Week number, 0-based (0 = first week)"},"theme":{"type":"string","title":"Theme","description":"1-2 word label capturing the week's focus (e.g., 'Foundation', 'Load Progression', 'Integration')"},"objective":{"type":"string","title":"Objective","description":"2-3 sentences, user-facing, plain language: what this week focuses on and why, and what the athlete should expect to feel or notice by the end of the week. Be specific to this athlete's situation."}},"type":"object","required":["week","theme","objective"],"title":"WeeklyPhase"}}}}