{"openapi":"3.1.0","info":{"title":"MuscleWiki API","description":"\n    **MuscleWiki API** provides comprehensive exercise data with optimized endpoints.\n\n    ## Features\n\n    * 📋 **List exercises** with pagination and filtering\n    * 🔍 **Search** by name and instructions\n    * 🎥 **Video demonstrations** with gender and angle options\n    * 🚀 **Optimized responses** with multiple detail levels\n    * 📚 **Automatic documentation** via Swagger UI\n\n    ## Getting Started\n\n    1. Browse available endpoints in the sections below\n    2. Try out requests using the \"Try it out\" button\n    3. Check response models for expected data structures\n\n    ## Response Optimization\n\n    The API provides different detail levels to minimize bandwidth:\n    - **Minimal**: Just ID and name (for lists)\n    - **Standard**: Includes videos and instructions (default)\n    - **Detailed**: Full metadata (use `?detail=true`)\n\n    ## Support\n\n    For issues and questions, visit the [GitHub repository](https://github.com/yourusername/musclewiki-api).\n    ","version":"2.0.0"},"paths":{"/health":{"get":{"tags":["health"],"summary":"Health Check","description":"Simple health check endpoint for load balancers.\n\nReturns:\n    Simple status message.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/detailed":{"get":{"tags":["health"],"summary":"Detailed Health Check","description":"Comprehensive health check endpoint.\n\nReturns detailed health information including:\n- Application status and version\n- Database connectivity\n- Disk space\n- Memory usage\n- Exercise data loaded\n\nReturns:\n    HealthStatus with all health check results","operationId":"detailed_health_check_health_detailed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthStatus"}}}}},"security":[{"APIKeyHeader":[]}]}},"/health/ready":{"get":{"tags":["health"],"summary":"Readiness Check","description":"Kubernetes readiness probe endpoint.\n\nReturns whether the application is ready to serve traffic.\nThis is a lightweight check focusing on critical dependencies.\n\nReturns:\n    ReadinessStatus indicating if the app is ready","operationId":"readiness_check_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadinessStatus"}}}}}}},"/health/live":{"get":{"tags":["health"],"summary":"Liveness Check","description":"Kubernetes liveness probe endpoint.\n\nSimple check to verify the application process is alive.\nReturns 200 OK if the process is running.\n\nArgs:\n    response: FastAPI response object\n\nReturns:\n    Simple status message","operationId":"liveness_check_health_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/startup":{"get":{"tags":["health"],"summary":"Startup Check","description":"Kubernetes startup probe endpoint.\n\nChecks if the application has completed initialization.\nReturns 200 once the app is fully started.\n\nArgs:\n    response: FastAPI response object\n\nReturns:\n    Startup status","operationId":"startup_check_health_startup_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"tags":["metadata"],"summary":"API root","description":"Get basic API information and links.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Root  Get"}}}}}}},"/random":{"get":{"tags":["metadata"],"summary":"Get random exercise","description":"Get a random exercise, optionally filtered by category.","operationId":"get_random_exercise_random_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by equipment category (e.g., barbell, dumbbell)","title":"Category"},"description":"Filter by equipment category (e.g., barbell, dumbbell)"},{"name":"gender","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(male|female)$"},{"type":"null"}],"description":"Filter videos by gender: 'male' or 'female'","title":"Gender"},"description":"Filter videos by gender: 'male' or 'female'"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExerciseStandard"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/categories":{"get":{"tags":["metadata"],"summary":"List equipment categories","description":"Get all equipment categories with exercise counts.","operationId":"get_categories_categories_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CategoryDict"},"title":"Response Get Categories Categories Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/statistics":{"get":{"tags":["metadata"],"summary":"Get database statistics","description":"Get comprehensive statistics about the exercise database.","operationId":"get_statistics_statistics_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatisticsDict"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/muscles":{"get":{"tags":["metadata"],"summary":"List primary muscles","description":"Get all primary muscle groups with exercise counts.","operationId":"get_muscles_muscles_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MuscleDict"},"title":"Response Get Muscles Muscles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/filters":{"get":{"tags":["metadata"],"summary":"Get available filter values","description":"Get all available values for filtering exercises.","operationId":"get_available_filters_filters_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableFiltersDict"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/languages":{"get":{"tags":["metadata"],"summary":"List supported languages","description":"Get all language codes accepted by the `lang` query parameter. Available to every tier. Non-English response languages require GROWTH tier or higher (BASIC keys get them in the Playground; TESTING keys are English-only).","operationId":"get_languages_languages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LanguageInfo"},"type":"array","title":"Response Get Languages Languages Get"}}}}}}},"/exercises":{"get":{"tags":["exercises"],"summary":"List exercises","description":"Get a paginated list of exercises with optional filtering. Returns minimal information optimized for list views.","operationId":"list_exercises_exercises_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of results (1-100)","default":20,"title":"Limit"},"description":"Maximum number of results (1-100)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":200},{"type":"null"}],"description":"Search in exercise names and steps (2-200 characters)","title":"Search"},"description":"Search in exercise names and steps (2-200 characters)"},{"name":"gender","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(male|female)$"},{"type":"null"}],"description":"Filter by gender: 'male' or 'female'","title":"Gender"},"description":"Filter by gender: 'male' or 'female'"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by equipment category (e.g., barbell, dumbbell, bodyweight)","title":"Category"},"description":"Filter by equipment category (e.g., barbell, dumbbell, bodyweight)"},{"name":"muscles","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by primary muscle groups (e.g., Biceps, Chest)","title":"Muscles"},"description":"Filter by primary muscle groups (e.g., Biceps, Chest)"},{"name":"difficulty","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^([Nn][Oo][Vv][Ii][Cc][Ee]|[Bb][Ee][Gg][Ii][Nn][Nn][Ee][Rr]|[Ii][Nn][Tt][Ee][Rr][Mm][Ee][Dd][Ii][Aa][Tt][Ee]|[Aa][Dd][Vv][Aa][Nn][Cc][Ee][Dd])$"},{"type":"null"}],"description":"Filter by difficulty: Novice, Beginner, Intermediate, or Advanced","title":"Difficulty"},"description":"Filter by difficulty: Novice, Beginner, Intermediate, or Advanced"},{"name":"force","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^([Pp][Uu][Ss][Hh]|[Pp][Uu][Ll][Ll]|[Hh][Oo][Ll][Dd])$"},{"type":"null"}],"description":"Filter by force type: Push, Pull, or Hold","title":"Force"},"description":"Filter by force type: Push, Pull, or Hold"},{"name":"mechanic","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^([Ii][Ss][Oo][Ll][Aa][Tt][Ii][Oo][Nn]|[Cc][Oo][Mm][Pp][Oo][Uu][Nn][Dd])$"},{"type":"null"}],"description":"Filter by mechanic: Isolation or Compound","title":"Mechanic"},"description":"Filter by mechanic: Isolation or Compound"},{"name":"grips","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by grip types (e.g., Overhand, Underhand, Neutral)","title":"Grips"},"description":"Filter by grip types (e.g., Overhand, Underhand, Neutral)"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ExerciseMinimal_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercises/{exercise_id}":{"get":{"tags":["exercises"],"summary":"Get exercise by ID","description":"Retrieve detailed information for a specific exercise. Use detail=true for additional metadata.","operationId":"get_exercise_exercises__exercise_id__get","parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","minimum":0,"description":"Exercise ID","title":"Exercise Id"},"description":"Exercise ID"},{"name":"detail","in":"query","required":false,"schema":{"type":"boolean","description":"Return detailed information with additional metadata","default":false,"title":"Detail"},"description":"Return detailed information with additional metadata"},{"name":"gender","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(male|female)$"},{"type":"null"}],"description":"Filter videos by gender: 'male' or 'female'","title":"Gender"},"description":"Filter videos by gender: 'male' or 'female'"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ExerciseStandard"},{"$ref":"#/components/schemas/ExerciseDetailed"}],"title":"Response Get Exercise Exercises  Exercise Id  Get"}}}},"404":{"description":"Exercise not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/exercises/{exercise_id}/videos":{"get":{"tags":["exercises"],"summary":"Get exercise videos","description":"Retrieve only video URLs for a specific exercise.","operationId":"get_exercise_videos_exercises__exercise_id__videos_get","parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","minimum":0,"description":"Exercise ID","title":"Exercise Id"},"description":"Exercise ID"},{"name":"gender","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(male|female)$"},{"type":"null"}],"description":"Filter by gender: 'male' or 'female'","title":"Gender"},"description":"Filter by gender: 'male' or 'female'"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Video"},"title":"Response Get Exercise Videos Exercises  Exercise Id  Videos Get"}}}},"404":{"description":"Exercise not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/routines":{"get":{"tags":["routines"],"summary":"List routines","description":"Get a paginated list of workout routines with optional filters.","operationId":"list_routines_routines_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of results (1-100)","default":20,"title":"Limit"},"description":"Maximum number of results (1-100)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"},{"name":"difficulty","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by difficulty (e.g. Beginner, Intermediate, Advanced)","title":"Difficulty"},"description":"Filter by difficulty (e.g. Beginner, Intermediate, Advanced)"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_RoutineMinimal_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/routines/{routine_id}":{"get":{"tags":["routines"],"summary":"Get routine by ID","description":"Retrieve a single routine with its workout references.","operationId":"get_routine_routines__routine_id__get","parameters":[{"name":"routine_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Routine ID","title":"Routine Id"},"description":"Routine ID"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoutineStandard"}}}},"404":{"description":"Routine not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/routines/{routine_id}/full":{"get":{"tags":["routines"],"summary":"Get full routine with all data","description":"Retrieve a routine with all workouts and exercises fully expanded. This is a convenience endpoint that returns everything in a single call. The api_calls_cost field indicates the equivalent number of individual API calls this response counts as (1 routine + N workouts + M exercises).","operationId":"get_routine_full_routines__routine_id__full_get","parameters":[{"name":"routine_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Routine ID","title":"Routine Id"},"description":"Routine ID"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoutineFull"}}}},"404":{"description":"Routine not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workouts":{"get":{"tags":["routines"],"summary":"List workouts","description":"Get a paginated list of all workouts across all routines with optional filters.","operationId":"list_workouts_workouts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of results (1-100)","default":20,"title":"Limit"},"description":"Maximum number of results (1-100)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of results to skip","default":0,"title":"Offset"},"description":"Number of results to skip"},{"name":"difficulty","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by difficulty (e.g. Beginner, Intermediate, Advanced)","title":"Difficulty"},"description":"Filter by difficulty (e.g. Beginner, Intermediate, Advanced)"},{"name":"goal","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by goal (e.g. Gain Muscle, Lose Weight)","title":"Goal"},"description":"Filter by goal (e.g. Gain Muscle, Lose Weight)"},{"name":"equipment","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by required equipment (e.g. Barbell, Dumbbells)","title":"Equipment"},"description":"Filter by required equipment (e.g. Barbell, Dumbbells)"},{"name":"muscles","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by targeted muscle group (e.g. Chest, Shoulders)","title":"Muscles"},"description":"Filter by targeted muscle group (e.g. Chest, Shoulders)"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_WorkoutMinimal_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workouts/{workout_id}":{"get":{"tags":["routines"],"summary":"Get workout by ID","description":"Retrieve a single workout with its exercise prescriptions.","operationId":"get_workout_workouts__workout_id__get","parameters":[{"name":"workout_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Workout ID","title":"Workout Id"},"description":"Workout ID"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkoutStandard"}}}},"404":{"description":"Workout not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workouts/{workout_id}/full":{"get":{"tags":["routines"],"summary":"Get full workout with all exercise data","description":"Retrieve a workout with all exercises fully expanded. This is a convenience endpoint that returns everything in a single call. The api_calls_cost field indicates the equivalent number of individual API calls this response counts as (1 workout + N exercises).","operationId":"get_workout_full_workouts__workout_id__full_get","parameters":[{"name":"workout_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Workout ID","title":"Workout Id"},"description":"Workout ID"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkoutFull"}}}},"404":{"description":"Workout not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search":{"get":{"tags":["search"],"summary":"Search exercises","description":"Search exercises by text query in names and instruction steps, with optional filters for muscles, difficulty, and more.","operationId":"search_exercises_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":200,"description":"Search query (2-200 characters)","examples":[{"value":"curl"}],"title":"Q"},"description":"Search query (2-200 characters)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Maximum number of results (1-50)","default":10,"title":"Limit"},"description":"Maximum number of results (1-50)"},{"name":"gender","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(male|female)$"},{"type":"null"}],"description":"Filter videos by gender: 'male' or 'female'","title":"Gender"},"description":"Filter videos by gender: 'male' or 'female'"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by equipment category","title":"Category"},"description":"Filter by equipment category"},{"name":"muscles","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by primary muscle groups","title":"Muscles"},"description":"Filter by primary muscle groups"},{"name":"difficulty","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^([Nn][Oo][Vv][Ii][Cc][Ee]|[Bb][Ee][Gg][Ii][Nn][Nn][Ee][Rr]|[Ii][Nn][Tt][Ee][Rr][Mm][Ee][Dd][Ii][Aa][Tt][Ee]|[Aa][Dd][Vv][Aa][Nn][Cc][Ee][Dd])$"},{"type":"null"}],"description":"Filter by difficulty level","title":"Difficulty"},"description":"Filter by difficulty level"},{"name":"force","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^([Pp][Uu][Ss][Hh]|[Pp][Uu][Ll][Ll]|[Hh][Oo][Ll][Dd])$"},{"type":"null"}],"description":"Filter by force type","title":"Force"},"description":"Filter by force type"},{"name":"mechanic","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^([Ii][Ss][Oo][Ll][Aa][Tt][Ii][Oo][Nn]|[Cc][Oo][Mm][Pp][Oo][Uu][Nn][Dd])$"},{"type":"null"}],"description":"Filter by mechanic type","title":"Mechanic"},"description":"Filter by mechanic type"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground).","title":"Lang"},"description":"Response language code (e.g. 'en-us', 'pt-br'). Defaults to 'en-us' when omitted. See GET /languages for the full list. Non-English languages require GROWTH tier or higher (BASIC keys get them in the Playground)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExerciseStandard"},"title":"Response Search Exercises Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stream/videos/branded/{filename}":{"get":{"tags":["media"],"summary":"Stream Branded Video","description":"Stream branded video file through authenticated endpoint.\n\nThis endpoint serves branded video files with proper authentication via API key middleware.\nSupports both local filesystem and Hetzner media server fallback.\nEach video request counts as an API call, maintaining proper metering and\ncontent protection.\n\nArgs:\n    filename: Video filename (e.g., 'male-Barbell-barbell-curl-front.mp4').\n    settings: Application settings injected via dependency.\n\nReturns:\n    FileResponse or StreamingResponse with the video file.\n\nRaises:\n    HTTPException: 403 if path attempts to escape media directory.\n    HTTPException: 404 if video file not found anywhere.\n\nExample:\n    GET /stream/videos/branded/male-Barbell-barbell-curl-front.mp4","operationId":"stream_branded_video_stream_videos_branded__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stream/images/og_images/{filename}":{"get":{"tags":["media"],"summary":"Stream Og Image","description":"Stream Open Graph image file through authenticated endpoint.\n\nThis endpoint serves OG image files (social sharing preview images) with proper\nauthentication via API key middleware. Supports both local filesystem and Hetzner fallback.\nEach image request counts as an API call.\n\nArgs:\n    filename: Image filename (e.g., 'og-male-Barbell-barbell-curl-front.jpg').\n    settings: Application settings injected via dependency.\n\nReturns:\n    FileResponse or StreamingResponse with the image file.\n\nRaises:\n    HTTPException: 403 if path attempts to escape media directory.\n    HTTPException: 404 if image file not found anywhere.\n\nExample:\n    GET /stream/images/og_images/og-male-Barbell-barbell-curl-front.jpg","operationId":"stream_og_image_stream_images_og_images__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stream/images/bodymaps/{exercise_id}":{"get":{"tags":["media"],"summary":"Stream Bodymap Image","description":"Stream bodymap image file through authenticated endpoint.\n\nThis endpoint serves bodymap diagram images with proper authentication via\nthe API-key middleware. The public contract uses an exercise ID plus\nvalidated query parameters; internal filenames remain server-owned. Each\nimage request counts as an API call.\n\nArgs:\n    exercise_id: Exercise ID.\n    gender: Gender variant, either male or female.\n    theme: Image theme, either light or dark.\n    view: Body view, either front or back.\n    settings: Application settings injected via dependency.\n\nReturns:\n    FileResponse with the image file.\n\nRaises:\n    HTTPException: 403 if tier is not allowed.\n    HTTPException: 404 if exercise or bodymap image file is not found.\n\nExample:\n    GET /stream/images/bodymaps/1?gender=male&theme=light&view=front","operationId":"stream_bodymap_image_stream_images_bodymaps__exercise_id__get","parameters":[{"name":"exercise_id","in":"path","required":true,"schema":{"type":"integer","title":"Exercise Id"}},{"name":"gender","in":"query","required":false,"schema":{"enum":["male","female"],"type":"string","default":"male","title":"Gender"}},{"name":"theme","in":"query","required":false,"schema":{"enum":["light","dark"],"type":"string","default":"light","title":"Theme"}},{"name":"view","in":"query","required":false,"schema":{"enum":["front","back"],"type":"string","default":"front","title":"View"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stream/images/bodymaps/routines/{routine_id}":{"get":{"tags":["media"],"summary":"Stream Routine Bodymap Image","description":"Stream a routine bodymap image from validated resource parameters.","operationId":"stream_routine_bodymap_image_stream_images_bodymaps_routines__routine_id__get","parameters":[{"name":"routine_id","in":"path","required":true,"schema":{"type":"integer","title":"Routine Id"}},{"name":"gender","in":"query","required":false,"schema":{"enum":["male","female"],"type":"string","default":"male","title":"Gender"}},{"name":"theme","in":"query","required":false,"schema":{"enum":["light","dark"],"type":"string","default":"light","title":"Theme"}},{"name":"view","in":"query","required":false,"schema":{"enum":["front","back"],"type":"string","default":"front","title":"View"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stream/images/bodymaps/workouts/{workout_id}":{"get":{"tags":["media"],"summary":"Stream Workout Bodymap Image","description":"Stream a workout bodymap image from validated resource parameters.","operationId":"stream_workout_bodymap_image_stream_images_bodymaps_workouts__workout_id__get","parameters":[{"name":"workout_id","in":"path","required":true,"schema":{"type":"integer","title":"Workout Id"}},{"name":"gender","in":"query","required":false,"schema":{"enum":["male","female"],"type":"string","default":"male","title":"Gender"}},{"name":"theme","in":"query","required":false,"schema":{"enum":["light","dark"],"type":"string","default":"light","title":"Theme"}},{"name":"view","in":"query","required":false,"schema":{"enum":["front","back"],"type":"string","default":"front","title":"View"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/media/token":{"post":{"tags":["media"],"summary":"Exchange an API key for a short-lived media token","description":"Exchange your permanent API key for a short-lived token that authenticates `/stream/` requests **without** any header, so native players (AVPlayer, ExoPlayer) can fetch media directly.\n\nCall this from your **server**, never from the device — the point of the exchange is that your permanent key never ships inside an app binary.\n\n**Usage:** append the token to any stream URL as a query parameter:\n\n`GET /stream/videos/branded/squat.mp4?token=<token>`\n\n**Scope:** the token is valid on `/stream/` paths only. It cannot read `/exercises`, `/routines`, or any other endpoint, and it cannot mint another token.\n\n**Metering:** each `/stream/` request authenticated by a token counts against the originating key's quota exactly as a keyed request does. Revoking the key, or losing the subscription, invalidates every outstanding token immediately.\n\n**Tier:** requires TESTING or above. BASIC is Playground-only.\n\n**Rate limit:** this is a refresh endpoint, not a per-video call. Mint one token per session and reuse it until it expires.","operationId":"create_media_token_media_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaTokenResponse"}}}},"401":{"description":"Missing X-API-Key header"},"402":{"description":"Custom plan provisioned but checkout is not complete"},"403":{"description":"Invalid key, BASIC tier, or a token was supplied instead of a key"},"429":{"description":"Too many mint requests, or the monthly quota is exhausted"},"501":{"description":"Media token exchange is not enabled on this deployment"}}}}},"components":{"schemas":{"AvailableFiltersDict":{"properties":{"muscles":{"items":{"type":"string"},"type":"array","title":"Muscles","description":"All available muscle groups"},"difficulties":{"items":{"type":"string"},"type":"array","title":"Difficulties","description":"All available difficulty levels"},"forces":{"items":{"type":"string"},"type":"array","title":"Forces","description":"All available force types"},"mechanics":{"items":{"type":"string"},"type":"array","title":"Mechanics","description":"All available mechanic types"},"grips":{"items":{"type":"string"},"type":"array","title":"Grips","description":"All available grip types"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","description":"All available equipment categories"}},"type":"object","required":["muscles","difficulties","forces","mechanics","grips","categories"],"title":"AvailableFiltersDict","description":"Dictionary containing all available filter values."},"CategoryDict":{"properties":{"name":{"type":"string","title":"Name","description":"Category identifier (lowercase with underscores)"},"display_name":{"type":"string","title":"Display Name","description":"Human-readable category name"},"count":{"type":"integer","title":"Count","description":"Number of exercises in this category"}},"type":"object","required":["name","display_name","count"],"title":"CategoryDict","description":"Dictionary representing an exercise category with count."},"ExerciseDetailed":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique exercise identifier"},"name":{"type":"string","title":"Name","description":"Exercise name"},"primary_muscles":{"items":{"type":"string"},"type":"array","title":"Primary Muscles","description":"Primary muscle groups targeted"},"category":{"type":"string","title":"Category","description":"Equipment category"},"force":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Force","description":"Force type: Push, Pull, or Hold"},"grips":{"items":{"type":"string"},"type":"array","title":"Grips","description":"Grip types used"},"mechanic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mechanic","description":"Exercise mechanic: Isolation or Compound"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty","description":"Difficulty level: Novice, Beginner, Intermediate, or Advanced"},"steps":{"items":{"type":"string"},"type":"array","title":"Steps","description":"Step-by-step instructions"},"videos":{"items":{"$ref":"#/components/schemas/Video"},"type":"array","title":"Videos","description":"Available video demonstrations"},"bodymap_male":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bodymap Male","description":"Base bodymap stream URL for male images"},"bodymap_female":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bodymap Female","description":"Base bodymap stream URL for female images"},"video_count":{"type":"integer","title":"Video Count","description":"Total number of available videos"},"image_count":{"type":"integer","title":"Image Count","description":"Total number of available thumbnail images"},"step_count":{"type":"integer","title":"Step Count","description":"Total number of instruction steps"}},"type":"object","required":["id","name","primary_muscles","category","grips","steps","videos","video_count","image_count","step_count"],"title":"ExerciseDetailed","description":"Detailed exercise information with all available data.\n\nThis model extends ExerciseStandard with additional metadata\nand should only be used when explicitly requested to minimize\nbandwidth usage.\n\nAttributes:\n    All attributes from ExerciseStandard, plus:\n    video_count: Total number of available videos.\n    image_count: Total number of available thumbnail images.\n    step_count: Total number of instruction steps.","example":{"bodymap_female":"https://api.musclewiki.com/stream/images/bodymaps/1?gender=female","bodymap_male":"https://api.musclewiki.com/stream/images/bodymaps/1?gender=male","category":"Barbell","difficulty":"Intermediate","force":"Pull","grips":["Underhand"],"id":1,"image_count":4,"mechanic":"Isolation","name":"Barbell Curl","primary_muscles":["Biceps"],"step_count":4,"steps":["While holding the upper arms stationary, curl the weights forward."],"video_count":4,"videos":[{"angle":"front","gender":"male","og_image":"https://api.musclewiki.com/stream/images/og_images/og-male-Barbell-barbell-curl-front.jpg","url":"https://api.musclewiki.com/stream/videos/branded/male-Barbell-barbell-curl-front.mp4"}]}},"ExerciseMinimal":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique exercise identifier"},"name":{"type":"string","title":"Name","description":"Exercise name"}},"type":"object","required":["id","name"],"title":"ExerciseMinimal","description":"Minimal exercise information for list views.\n\nThis model provides only essential information for displaying\nexercises in lists or grids, minimizing response size.\n\nAttributes:\n    id: Unique exercise identifier (file-based ID).\n    name: Exercise name.","example":{"id":1,"name":"Barbell Curl"}},"ExerciseRef":{"properties":{"id":{"type":"integer","title":"Id","description":"Exercise ID"},"name":{"type":"string","title":"Name","description":"Exercise name"}},"type":"object","required":["id","name"],"title":"ExerciseRef","description":"Reference to an exercise (ID and name only)."},"ExerciseStandard":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique exercise identifier"},"name":{"type":"string","title":"Name","description":"Exercise name"},"primary_muscles":{"items":{"type":"string"},"type":"array","title":"Primary Muscles","description":"Primary muscle groups targeted"},"category":{"type":"string","title":"Category","description":"Equipment category"},"force":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Force","description":"Force type: Push, Pull, or Hold"},"grips":{"items":{"type":"string"},"type":"array","title":"Grips","description":"Grip types used"},"mechanic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mechanic","description":"Exercise mechanic: Isolation or Compound"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty","description":"Difficulty level: Novice, Beginner, Intermediate, or Advanced"},"steps":{"items":{"type":"string"},"type":"array","title":"Steps","description":"Step-by-step instructions"},"videos":{"items":{"$ref":"#/components/schemas/Video"},"type":"array","title":"Videos","description":"Available video demonstrations"},"bodymap_male":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bodymap Male","description":"Base bodymap stream URL for male images"},"bodymap_female":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bodymap Female","description":"Base bodymap stream URL for female images"}},"type":"object","required":["id","name","primary_muscles","category","grips","steps","videos"],"title":"ExerciseStandard","description":"Standard exercise information with essential details.\n\nThis model provides a good balance between data completeness\nand response size, suitable for most use cases.\n\nAttributes:\n    id: Unique exercise identifier.\n    name: Exercise name.\n    primary_muscles: Primary muscle groups targeted.\n    category: Equipment category (e.g., Barbell, Dumbbells, Bodyweight).\n    force: Force type (Push, Pull, Hold) - may be null for some exercises.\n    grips: Grip types used (e.g., Overhand, Underhand, Neutral).\n    mechanic: Exercise mechanic type (Isolation, Compound) - may be null.\n    difficulty: Difficulty level (Novice, Beginner, Intermediate, Advanced) - may be null.\n    steps: List of instruction steps.\n    videos: List of available video demonstrations.\n    bodymap_male: Base bodymap stream URL for male images.\n    bodymap_female: Base bodymap stream URL for female images.","example":{"bodymap_female":"https://api.musclewiki.com/stream/images/bodymaps/1?gender=female","bodymap_male":"https://api.musclewiki.com/stream/images/bodymaps/1?gender=male","category":"Barbell","difficulty":"Intermediate","force":"Pull","grips":["Underhand"],"id":1,"mechanic":"Isolation","name":"Barbell Curl","primary_muscles":["Biceps"],"steps":["While holding the upper arms stationary, curl the weights forward.","Continue the movement until your biceps are fully contracted.","Hold the contracted position for a second.","Slowly bring the weight back down to the starting position."],"videos":[{"angle":"front","gender":"male","og_image":"https://api.musclewiki.com/stream/images/og_images/og-male-Barbell-barbell-curl-front.jpg","url":"https://api.musclewiki.com/stream/videos/branded/male-Barbell-barbell-curl-front.mp4"},{"angle":"side","gender":"male","og_image":"https://api.musclewiki.com/stream/images/og_images/og-male-Barbell-barbell-curl-side.jpg","url":"https://api.musclewiki.com/stream/videos/branded/male-Barbell-barbell-curl-side.mp4"}]}},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthStatus":{"properties":{"status":{"type":"string","title":"Status"},"version":{"type":"string","title":"Version"},"environment":{"type":"string","title":"Environment"},"uptime_seconds":{"type":"number","title":"Uptime Seconds"},"checks":{"additionalProperties":true,"type":"object","title":"Checks"}},"type":"object","required":["status","version","environment","uptime_seconds","checks"],"title":"HealthStatus","description":"Health check response model."},"LanguageInfo":{"properties":{"code":{"type":"string","title":"Code","description":"Language code (e.g. 'pt-br') for the `lang` query param"},"name":{"type":"string","title":"Name","description":"Human-readable language name"}},"type":"object","required":["code","name"],"title":"LanguageInfo","description":"A supported response language.\n\nAttributes:\n    code: Language code accepted by the ``lang`` query parameter.\n    name: Human-readable display name.","example":{"code":"pt-br","name":"Brazilian Portuguese"}},"MediaTokenResponse":{"properties":{"token":{"type":"string","title":"Token","description":"Opaque, signed, media-only token. Append it to any /stream/ URL as ?token=<token>. Treat it as a credential: do not log it, and do not embed it in a shareable link."},"expires_in":{"type":"integer","title":"Expires In","description":"Token lifetime in seconds from issue. Mint a new token before this elapses; expired tokens return 401."}},"type":"object","required":["token","expires_in"],"title":"MediaTokenResponse","description":"A minted media token and its lifetime.","example":{"expires_in":900,"token":"eyJleHAiOjE3NTQzNDU2MDAsImlhdCI6MTc1NDM0NDcwMH0.c2lnbmF0dXJl"}},"MuscleDict":{"properties":{"name":{"type":"string","title":"Name","description":"Muscle group name"},"count":{"type":"integer","title":"Count","description":"Number of exercises targeting this muscle"}},"type":"object","required":["name","count"],"title":"MuscleDict","description":"Dictionary representing a muscle group with count."},"PaginatedResponse_ExerciseMinimal_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total number of items"},"limit":{"type":"integer","title":"Limit","description":"Items per page"},"offset":{"type":"integer","title":"Offset","description":"Items skipped"},"count":{"type":"integer","title":"Count","description":"Items in current response"},"results":{"items":{"$ref":"#/components/schemas/ExerciseMinimal"},"type":"array","title":"Results","description":"Data items"}},"type":"object","required":["total","limit","offset","count","results"],"title":"PaginatedResponse[ExerciseMinimal]","example":{"count":20,"limit":20,"offset":0,"results":[],"total":100}},"PaginatedResponse_RoutineMinimal_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total number of items"},"limit":{"type":"integer","title":"Limit","description":"Items per page"},"offset":{"type":"integer","title":"Offset","description":"Items skipped"},"count":{"type":"integer","title":"Count","description":"Items in current response"},"results":{"items":{"$ref":"#/components/schemas/RoutineMinimal"},"type":"array","title":"Results","description":"Data items"}},"type":"object","required":["total","limit","offset","count","results"],"title":"PaginatedResponse[RoutineMinimal]","example":{"count":20,"limit":20,"offset":0,"results":[],"total":100}},"PaginatedResponse_WorkoutMinimal_":{"properties":{"total":{"type":"integer","title":"Total","description":"Total number of items"},"limit":{"type":"integer","title":"Limit","description":"Items per page"},"offset":{"type":"integer","title":"Offset","description":"Items skipped"},"count":{"type":"integer","title":"Count","description":"Items in current response"},"results":{"items":{"$ref":"#/components/schemas/WorkoutMinimal"},"type":"array","title":"Results","description":"Data items"}},"type":"object","required":["total","limit","offset","count","results"],"title":"PaginatedResponse[WorkoutMinimal]","example":{"count":20,"limit":20,"offset":0,"results":[],"total":100}},"ReadinessStatus":{"properties":{"ready":{"type":"boolean","title":"Ready"},"checks":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Checks"}},"type":"object","required":["ready","checks"],"title":"ReadinessStatus","description":"Readiness check response model."},"RoutineFull":{"properties":{"id":{"type":"integer","title":"Id","description":"Routine ID"},"name":{"type":"string","title":"Name","description":"Routine name"},"slug":{"type":"string","title":"Slug","description":"URL-friendly slug"},"description":{"type":"string","title":"Description","description":"Routine description","default":""},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty","description":"Difficulty level"},"bodymap_male":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bodymap Male","description":"Base bodymap stream URL for male images"},"bodymap_female":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bodymap Female","description":"Base bodymap stream URL for female images"},"workouts":{"items":{"$ref":"#/components/schemas/WorkoutFull"},"type":"array","title":"Workouts","description":"Full workouts with all exercise data"},"api_calls_cost":{"type":"integer","title":"Api Calls Cost","description":"Number of API calls this response counts as. Equivalent to fetching the routine, each workout, and each exercise individually."}},"type":"object","required":["id","name","slug","workouts","api_calls_cost"],"title":"RoutineFull","description":"Full routine with all workouts and exercises expanded.","example":{"api_calls_cost":5,"description":"A 4-day split for beginners","difficulty":"Beginner","id":1,"name":"Beginner Bodybuilder Routine","slug":"beginner-bodybuilder-routine","workouts":[{"api_calls_cost":1,"exercises":[],"id":1,"name":"Beginner Bodybuilder - Chest and Shoulders","slug":"beginner-bodybuilder-chest-and-shoulders"}]}},"RoutineMinimal":{"properties":{"id":{"type":"integer","title":"Id","description":"Routine ID"},"name":{"type":"string","title":"Name","description":"Routine name"},"slug":{"type":"string","title":"Slug","description":"URL-friendly slug"},"description":{"type":"string","title":"Description","description":"Routine description","default":""},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty","description":"Difficulty level"}},"type":"object","required":["id","name","slug"],"title":"RoutineMinimal","description":"Minimal routine information for list views.","example":{"description":"A 4-day split for beginners","difficulty":"Beginner","id":1,"name":"Beginner Bodybuilder Routine","slug":"beginner-bodybuilder-routine"}},"RoutineStandard":{"properties":{"id":{"type":"integer","title":"Id","description":"Routine ID"},"name":{"type":"string","title":"Name","description":"Routine name"},"slug":{"type":"string","title":"Slug","description":"URL-friendly slug"},"description":{"type":"string","title":"Description","description":"Routine description","default":""},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty","description":"Difficulty level"},"bodymap_male":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bodymap Male","description":"Base bodymap stream URL for male images"},"bodymap_female":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bodymap Female","description":"Base bodymap stream URL for female images"},"workouts":{"items":{"$ref":"#/components/schemas/WorkoutMinimal"},"type":"array","title":"Workouts","description":"Workouts in this routine (references only)"}},"type":"object","required":["id","name","slug","workouts"],"title":"RoutineStandard","description":"Standard routine information with workout references.","example":{"description":"A 4-day split for beginners","difficulty":"Beginner","id":1,"name":"Beginner Bodybuilder Routine","slug":"beginner-bodybuilder-routine","workouts":[{"id":1,"name":"Beginner Bodybuilder - Chest and Shoulders","slug":"beginner-bodybuilder-chest-and-shoulders"}]}},"StatisticsDict":{"properties":{"total_exercises":{"type":"integer","title":"Total Exercises","description":"Total number of exercises"},"total_categories":{"type":"integer","title":"Total Categories","description":"Total number of categories"},"total_muscles":{"type":"integer","title":"Total Muscles","description":"Total number of muscle groups"},"total_routines":{"type":"integer","title":"Total Routines","description":"Total number of routines","default":0},"total_workouts":{"type":"integer","title":"Total Workouts","description":"Total number of workouts","default":0},"categories":{"items":{"$ref":"#/components/schemas/CategoryDict"},"type":"array","title":"Categories","description":"Category breakdown"},"muscles":{"items":{"$ref":"#/components/schemas/MuscleDict"},"type":"array","title":"Muscles","description":"Muscle group breakdown"},"difficulty_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Difficulty Distribution","description":"Exercise count by difficulty"},"mechanic_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Mechanic Distribution","description":"Exercise count by mechanic"},"force_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Force Distribution","description":"Exercise count by force"},"average_steps_per_exercise":{"type":"number","title":"Average Steps Per Exercise","description":"Average number of steps per exercise"},"average_videos_per_exercise":{"type":"number","title":"Average Videos Per Exercise","description":"Average number of videos per exercise"},"total_videos":{"type":"integer","title":"Total Videos","description":"Total number of videos across all exercises"}},"type":"object","required":["total_exercises","total_categories","total_muscles","categories","muscles","difficulty_distribution","mechanic_distribution","force_distribution","average_steps_per_exercise","average_videos_per_exercise","total_videos"],"title":"StatisticsDict","description":"Dictionary containing exercise database statistics."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"Video":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Direct URL to the video file (can be null)"},"angle":{"type":"string","title":"Angle","description":"Camera angle: front or side"},"gender":{"type":"string","title":"Gender","description":"Gender variant: male or female"},"og_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Og Image","description":"Open Graph image URL for preview/thumbnail"}},"type":"object","required":["angle","gender"],"title":"Video","description":"Video information for an exercise.\n\nAttributes:\n    url: Direct URL to the video file (can be null).\n    angle: Camera angle (front or side).\n    gender: Gender variant (male or female).\n    og_image: Open Graph image URL for preview/thumbnail.","example":{"angle":"front","gender":"male","og_image":"https://api.musclewiki.com/stream/images/og_images/og-male-Barbell-barbell-curl-front.jpg","url":"https://api.musclewiki.com/stream/videos/branded/male-Barbell-barbell-curl-front.mp4"}},"WorkoutExerciseFull":{"properties":{"sort":{"type":"integer","title":"Sort","description":"Sort order within the workout"},"superset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Superset","description":"Superset group number"},"exercise":{"$ref":"#/components/schemas/ExerciseStandard","description":"Full exercise data"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Equipment category"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty","description":"Difficulty level"},"reps_or_duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reps Or Duration","description":"Whether this is reps or duration based"},"reps_or_duration_count":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reps Or Duration Count","description":"Number of reps or duration"},"sets":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sets","description":"Number of sets"}},"type":"object","required":["sort","exercise"],"title":"WorkoutExerciseFull","description":"An exercise within a workout, with prescription details and full exercise data."},"WorkoutExerciseRef":{"properties":{"sort":{"type":"integer","title":"Sort","description":"Sort order within the workout"},"superset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Superset","description":"Superset group number"},"exercise":{"$ref":"#/components/schemas/ExerciseRef","description":"Exercise reference"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Equipment category"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty","description":"Difficulty level"},"reps_or_duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reps Or Duration","description":"Whether this is reps or duration based"},"reps_or_duration_count":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reps Or Duration Count","description":"Number of reps or duration"},"sets":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sets","description":"Number of sets"}},"type":"object","required":["sort","exercise"],"title":"WorkoutExerciseRef","description":"An exercise within a workout, with prescription details."},"WorkoutFull":{"properties":{"id":{"type":"integer","title":"Id","description":"Workout ID"},"name":{"type":"string","title":"Name","description":"Workout name"},"slug":{"type":"string","title":"Slug","description":"URL-friendly slug"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Workout description","default":""},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty","description":"Difficulty level"},"goal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goal","description":"Workout goal","default":""},"equipment":{"items":{"type":"string"},"type":"array","title":"Equipment","description":"Equipment needed","default":[]},"muscles_targeted":{"items":{"type":"string"},"type":"array","title":"Muscles Targeted","description":"Primary muscles targeted","default":[]},"bodymap_male":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bodymap Male","description":"Base bodymap stream URL for male images"},"bodymap_female":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bodymap Female","description":"Base bodymap stream URL for female images"},"exercises":{"items":{"$ref":"#/components/schemas/WorkoutExerciseFull"},"type":"array","title":"Exercises","description":"Exercises with full data and prescription details"},"api_calls_cost":{"type":"integer","title":"Api Calls Cost","description":"Number of API calls this response counts as. Equivalent to fetching the workout plus each exercise individually."}},"type":"object","required":["id","name","slug","exercises","api_calls_cost"],"title":"WorkoutFull","description":"Full workout with complete exercise data included.","example":{"api_calls_cost":2,"description":"A beginner chest and shoulders workout","difficulty":"Beginner","equipment":["Barbell","Dumbbells"],"exercises":[{"category":"Barbell","difficulty":"Intermediate","exercise":{"category":"Barbell","difficulty":"Intermediate","force":"Push","grips":["Overhand"],"id":4,"mechanic":"Compound","name":"Barbell Bench Press","primary_muscles":["Chest"],"steps":["Lie on a flat bench..."],"videos":[]},"reps_or_duration":"reps","reps_or_duration_count":"5-8","sets":"3","sort":1}],"goal":"Build muscle","id":1,"muscles_targeted":["Chest","Shoulders"],"name":"Beginner Bodybuilder - Chest and Shoulders","slug":"beginner-bodybuilder-chest-and-shoulders"}},"WorkoutMinimal":{"properties":{"id":{"type":"integer","title":"Id","description":"Workout ID"},"name":{"type":"string","title":"Name","description":"Workout name"},"slug":{"type":"string","title":"Slug","description":"URL-friendly slug"}},"type":"object","required":["id","name","slug"],"title":"WorkoutMinimal","description":"Minimal workout information for list views within a routine."},"WorkoutStandard":{"properties":{"id":{"type":"integer","title":"Id","description":"Workout ID"},"name":{"type":"string","title":"Name","description":"Workout name"},"slug":{"type":"string","title":"Slug","description":"URL-friendly slug"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Workout description","default":""},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty","description":"Difficulty level"},"goal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goal","description":"Workout goal","default":""},"equipment":{"items":{"type":"string"},"type":"array","title":"Equipment","description":"Equipment needed","default":[]},"muscles_targeted":{"items":{"type":"string"},"type":"array","title":"Muscles Targeted","description":"Primary muscles targeted","default":[]},"bodymap_male":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bodymap Male","description":"Base bodymap stream URL for male images"},"bodymap_female":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bodymap Female","description":"Base bodymap stream URL for female images"},"exercises":{"items":{"$ref":"#/components/schemas/WorkoutExerciseRef"},"type":"array","title":"Exercises","description":"Exercises in this workout with prescription details"}},"type":"object","required":["id","name","slug","exercises"],"title":"WorkoutStandard","description":"Standard workout information with full details.","example":{"description":"A beginner chest and shoulders workout","difficulty":"Beginner","equipment":["Barbell","Dumbbells"],"exercises":[{"category":"Barbell","difficulty":"Intermediate","exercise":{"id":4,"name":"Barbell Bench Press"},"reps_or_duration":"reps","reps_or_duration_count":"5-8","sets":"3","sort":1}],"goal":"Build muscle","id":1,"muscles_targeted":["Chest","Shoulders"],"name":"Beginner Bodybuilder - Chest and Shoulders","slug":"beginner-bodybuilder-chest-and-shoulders"}}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}}}