{
  "openapi": "3.1.1",
  "info": {
    "title": "VoltFit.Api | v1",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "http://api.dev.voltfit.io/"
    }
  ],
  "paths": {
    "/health": {
      "get": {
        "tags": [
          "Health"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/identity/register": {
      "post": {
        "tags": [
          "Identity"
        ],
        "operationId": "Register",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/identity/refresh": {
      "post": {
        "tags": [
          "Identity"
        ],
        "operationId": "Refresh",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/identity/profile": {
      "get": {
        "tags": [
          "Identity"
        ],
        "operationId": "GetProfile",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "put": {
        "tags": [
          "Identity"
        ],
        "operationId": "UpdateProfile",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProfileRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/identity/profile/handle": {
      "post": {
        "tags": [
          "Identity"
        ],
        "operationId": "SetHandle",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetHandleRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/identity/users/me/avatar": {
      "post": {
        "tags": [
          "Identity - Profile"
        ],
        "operationId": "UploadAvatar",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/identity/login": {
      "post": {
        "tags": [
          "Identity"
        ],
        "operationId": "Login",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/identity/me": {
      "get": {
        "tags": [
          "Identity"
        ],
        "operationId": "GetMe",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/identity/admin/stats": {
      "get": {
        "tags": [
          "Identity - Admin"
        ],
        "operationId": "AdminIdentityStats",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/identity/admin/users/{userId}": {
      "get": {
        "tags": [
          "Identity - Admin"
        ],
        "operationId": "AdminGetUserDetail",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/identity/admin/users/{userId}/disabled": {
      "post": {
        "tags": [
          "Identity - Admin"
        ],
        "operationId": "AdminSetUserDisabled",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetUserDisabledRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/identity/admin/users/{userId}/types": {
      "put": {
        "tags": [
          "Identity - Admin"
        ],
        "operationId": "AdminSetUserTypes",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetUserTypesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/identity/admin/users": {
      "get": {
        "tags": [
          "Identity - Admin"
        ],
        "operationId": "AdminListUsers",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/sessions/{id}": {
      "delete": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "DeleteSession",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "patch": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "UpdateSession",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSessionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "get": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "GetSession",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/exercises/{exerciseId}/last-sets": {
      "get": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "GetLastSetsByExercise",
        "parameters": [
          {
            "name": "exerciseId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/sessions/calendar": {
      "get": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "GetMonthCalendar",
        "parameters": [
          {
            "name": "year",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "month",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/reports/monthly": {
      "get": {
        "tags": [
          "Training - Stats"
        ],
        "operationId": "GetMonthlyReport",
        "parameters": [
          {
            "name": "months",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/sessions/{id}/previous": {
      "get": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "GetPreviousSets",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/stats/running": {
      "get": {
        "tags": [
          "Training - Stats"
        ],
        "operationId": "GetRunningStats",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/sessions/log-past": {
      "post": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "LogPastSession",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LogPastSessionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/sessions/{sessionId}/sets/{setId}": {
      "patch": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "UpdateSetRecord",
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "setId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSetRecordRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "DeleteSet",
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "setId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/sessions/{id}/photo": {
      "post": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "UploadSessionPhoto",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/sessions": {
      "post": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "StartSession",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartSessionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "get": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "ListSessions",
        "parameters": [
          {
            "name": "modality",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/sessions/{id}/sets": {
      "post": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "RecordSet",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecordSetRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/sessions/{id}/complete": {
      "post": {
        "tags": [
          "Training - Sessions"
        ],
        "operationId": "CompleteSession",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/components/schemas/CompleteSessionRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/schedule": {
      "get": {
        "tags": [
          "Training - Schedule"
        ],
        "operationId": "GetWeekSchedule",
        "parameters": [
          {
            "name": "weekStartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/schedule/slots": {
      "post": {
        "tags": [
          "Training - Schedule"
        ],
        "operationId": "UpsertScheduledWorkout",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpsertScheduledWorkoutRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/schedule/slots/{id}": {
      "delete": {
        "tags": [
          "Training - Schedule"
        ],
        "operationId": "RemoveScheduledWorkout",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/schedule/copy": {
      "post": {
        "tags": [
          "Training - Schedule"
        ],
        "operationId": "CopyWeekSchedule",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CopyWeekScheduleRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/routines/{id}/clone": {
      "post": {
        "tags": [
          "Training - Routines"
        ],
        "operationId": "CloneRoutine",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/routines": {
      "post": {
        "tags": [
          "Training - Routines"
        ],
        "operationId": "CreateRoutine",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateRoutineRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "get": {
        "tags": [
          "Training - Routines"
        ],
        "operationId": "ListRoutines",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/routines/{id}": {
      "delete": {
        "tags": [
          "Training - Routines"
        ],
        "operationId": "DeleteRoutine",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "get": {
        "tags": [
          "Training - Routines"
        ],
        "operationId": "GetRoutine",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "put": {
        "tags": [
          "Training - Routines"
        ],
        "operationId": "UpdateRoutine",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateRoutineRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/routines/{id}/previous": {
      "get": {
        "tags": [
          "Training - Routines"
        ],
        "operationId": "GetRoutinePreviousSets",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/users/{userId}/routines": {
      "get": {
        "tags": [
          "Training - Routines"
        ],
        "operationId": "GetUserRoutines",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/users/{userId}/weekly-hours": {
      "get": {
        "tags": [
          "Training - Reports"
        ],
        "operationId": "GetWeeklyHours",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "weeks",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/exercises/{id}/records": {
      "get": {
        "tags": [
          "Training - Records"
        ],
        "operationId": "GetExerciseRecords",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/sessions/{id}/new-records": {
      "get": {
        "tags": [
          "Training - Records"
        ],
        "operationId": "GetSessionNewRecords",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/exercises": {
      "post": {
        "tags": [
          "Training - Exercises"
        ],
        "operationId": "CreateExercise",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateExerciseRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "get": {
        "tags": [
          "Training - Exercises"
        ],
        "operationId": "ListExercises",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "modality",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "muscle",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ownedOnly",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/exercises/{id}": {
      "get": {
        "tags": [
          "Training - Exercises"
        ],
        "operationId": "GetExercise",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/exercises/{id}/thumbnail": {
      "post": {
        "tags": [
          "Training - Exercises"
        ],
        "operationId": "UploadExerciseThumbnail",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/admin/stats": {
      "get": {
        "tags": [
          "Training - Admin"
        ],
        "operationId": "AdminTrainingStats",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/admin/exercises": {
      "get": {
        "tags": [
          "Training - Admin"
        ],
        "operationId": "AdminListExercises",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "modality",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "customOnly",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/admin/exercises/{id}": {
      "delete": {
        "tags": [
          "Training - Admin"
        ],
        "operationId": "AdminDeleteExercise",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/training/admin/routines": {
      "get": {
        "tags": [
          "Training - Admin"
        ],
        "operationId": "AdminListRoutines",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/coach/routines/generate": {
      "post": {
        "tags": [
          "Coach"
        ],
        "operationId": "GenerateRoutine",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GenerateRoutineRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/coach/quota": {
      "get": {
        "tags": [
          "Coach"
        ],
        "operationId": "GetCoachQuota",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/coach/programs/generate": {
      "post": {
        "tags": [
          "Coach"
        ],
        "operationId": "GenerateProgram",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GenerateProgramRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/coach/admin/prompts": {
      "get": {
        "tags": [
          "Coach - Admin"
        ],
        "operationId": "AdminListPromptTemplates",
        "parameters": [
          {
            "name": "feature",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "modality",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "locale",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "post": {
        "tags": [
          "Coach - Admin"
        ],
        "operationId": "AdminCreatePromptTemplate",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePromptTemplateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/coach/admin/prompts/{id}/activate": {
      "post": {
        "tags": [
          "Coach - Admin"
        ],
        "operationId": "AdminActivatePromptTemplate",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/coach/admin/providers": {
      "get": {
        "tags": [
          "Coach - Admin"
        ],
        "operationId": "AdminListProviderConfigs",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "post": {
        "tags": [
          "Coach - Admin"
        ],
        "operationId": "AdminCreateProviderConfig",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateProviderConfigRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/coach/admin/providers/{id}": {
      "patch": {
        "tags": [
          "Coach - Admin"
        ],
        "operationId": "AdminUpdateProviderConfig",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProviderConfigRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/coach/admin/generations": {
      "get": {
        "tags": [
          "Coach - Admin"
        ],
        "operationId": "AdminListGenerations",
        "parameters": [
          {
            "name": "kind",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/posts": {
      "post": {
        "tags": [
          "Social - Posts"
        ],
        "operationId": "CreatePost",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePostRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/posts/{postId}": {
      "delete": {
        "tags": [
          "Social - Posts"
        ],
        "operationId": "DeletePost",
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/feed": {
      "get": {
        "tags": [
          "Social - Posts"
        ],
        "operationId": "GetFeed",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/users/{userId}/posts": {
      "get": {
        "tags": [
          "Social - Posts"
        ],
        "operationId": "GetUserPosts",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/follows/{userId}": {
      "post": {
        "tags": [
          "Social - Follows"
        ],
        "operationId": "FollowUser",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "Social - Follows"
        ],
        "operationId": "UnfollowUser",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/users/{userId}/followers": {
      "get": {
        "tags": [
          "Social - Follows"
        ],
        "operationId": "ListFollowers",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/users/{userId}/following": {
      "get": {
        "tags": [
          "Social - Follows"
        ],
        "operationId": "ListFollowing",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/users/{userId}/profile": {
      "get": {
        "tags": [
          "Social - Follows"
        ],
        "operationId": "GetSocialProfileById",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/users/by-handle/{handle}/profile": {
      "get": {
        "tags": [
          "Social - Follows"
        ],
        "operationId": "GetSocialProfileByHandle",
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/posts/{postId}/comments": {
      "post": {
        "tags": [
          "Social - Engagement"
        ],
        "operationId": "CreateComment",
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCommentRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "get": {
        "tags": [
          "Social - Engagement"
        ],
        "operationId": "ListComments",
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/comments/{commentId}": {
      "delete": {
        "tags": [
          "Social - Engagement"
        ],
        "operationId": "DeleteComment",
        "parameters": [
          {
            "name": "commentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/posts/{postId}/likes/toggle": {
      "post": {
        "tags": [
          "Social - Engagement"
        ],
        "operationId": "ToggleLike",
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/users/search": {
      "get": {
        "tags": [
          "Social - Discovery"
        ],
        "operationId": "SearchUsers",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/users/suggestions": {
      "get": {
        "tags": [
          "Social - Discovery"
        ],
        "operationId": "SuggestUsers",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/compare/{otherUserId}": {
      "get": {
        "tags": [
          "Social - Compare"
        ],
        "operationId": "GetComparison",
        "parameters": [
          {
            "name": "otherUserId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/blocks/{userId}": {
      "post": {
        "tags": [
          "Social - Blocks"
        ],
        "operationId": "BlockUser",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      },
      "delete": {
        "tags": [
          "Social - Blocks"
        ],
        "operationId": "UnblockUser",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/badges/me": {
      "get": {
        "tags": [
          "Social - Badges"
        ],
        "operationId": "ListMyBadges",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/users/{userId}/badges": {
      "get": {
        "tags": [
          "Social - Badges"
        ],
        "operationId": "ListUserBadges",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/feed/debug": {
      "get": {
        "tags": [
          "Social - Diagnostics"
        ],
        "operationId": "GetFeedDebug",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/admin/stats": {
      "get": {
        "tags": [
          "Social - Admin"
        ],
        "operationId": "AdminSocialStats",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/admin/posts": {
      "get": {
        "tags": [
          "Social - Admin"
        ],
        "operationId": "AdminListPosts",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "includeDeleted",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/social/admin/posts/{postId}": {
      "delete": {
        "tags": [
          "Social - Admin"
        ],
        "operationId": "AdminDeletePost",
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/billing/webhooks/stripe": {
      "post": {
        "tags": [
          "Billing"
        ],
        "operationId": "StripeWebhook",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/billing/me/features": {
      "get": {
        "tags": [
          "Billing"
        ],
        "operationId": "GetMyFeatures",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/billing/me": {
      "get": {
        "tags": [
          "Billing"
        ],
        "operationId": "GetMySubscription",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/billing/portal": {
      "post": {
        "tags": [
          "Billing"
        ],
        "operationId": "CreatePortalSession",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/billing/checkout": {
      "post": {
        "tags": [
          "Billing"
        ],
        "operationId": "CreateCheckoutSession",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCheckoutSessionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/billing/admin/grant": {
      "post": {
        "tags": [
          "Billing - Admin"
        ],
        "operationId": "AdminGrantPro",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GrantProRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/billing/admin/users": {
      "get": {
        "tags": [
          "Billing - Admin"
        ],
        "operationId": "AdminListUsersWithPlan",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/billing/admin/revoke": {
      "post": {
        "tags": [
          "Billing - Admin"
        ],
        "operationId": "AdminRevokePro",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RevokeProRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "CompleteSessionRequest": {
        "required": [
          "notes",
          "scoreA",
          "scoreB",
          "distanceMeters",
          "completedRounds",
          "caloriesKcal",
          "avgRpe",
          "avgPaceSecondsPerKm",
          "effortScore",
          "avgHeartRateBpm",
          "maxHeartRateBpm",
          "activeCaloriesKcal",
          "blocks"
        ],
        "type": "object",
        "properties": {
          "notes": {
            "type": [
              "null",
              "string"
            ]
          },
          "scoreA": {
            "type": [
              "null",
              "string"
            ]
          },
          "scoreB": {
            "type": [
              "null",
              "string"
            ]
          },
          "distanceMeters": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "completedRounds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "caloriesKcal": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "avgRpe": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "avgPaceSecondsPerKm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "effortScore": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "avgHeartRateBpm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "maxHeartRateBpm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "activeCaloriesKcal": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "blocks": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/SessionBlockDto"
            }
          }
        }
      },
      "CopyWeekScheduleRequest": {
        "required": [
          "sourceWeekStartDate",
          "targetWeekStartDate"
        ],
        "type": "object",
        "properties": {
          "sourceWeekStartDate": {
            "type": "string",
            "format": "date"
          },
          "targetWeekStartDate": {
            "type": "string",
            "format": "date"
          }
        }
      },
      "CreateCheckoutSessionRequest": {
        "required": [
          "cadence"
        ],
        "type": "object",
        "properties": {
          "cadence": {
            "type": "string"
          }
        }
      },
      "CreateCommentRequest": {
        "required": [
          "text"
        ],
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        }
      },
      "CreateExerciseRequest": {
        "required": [
          "name",
          "primaryMuscles",
          "secondaryMuscles",
          "equipment",
          "modality",
          "exerciseType",
          "description"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "primaryMuscles": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "secondaryMuscles": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "equipment": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "modality": {
            "type": "string"
          },
          "exerciseType": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "CreatePlannedSetRequest": {
        "required": [
          "setType",
          "targetReps",
          "targetWeightKg",
          "targetRpe"
        ],
        "type": "object",
        "properties": {
          "setType": {
            "type": "string"
          },
          "targetReps": {
            "type": [
              "null",
              "string"
            ]
          },
          "targetWeightKg": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "targetRpe": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          }
        }
      },
      "CreatePostRequest": {
        "required": [
          "sessionId",
          "text",
          "mediaUrl",
          "visibility",
          "routineId"
        ],
        "type": "object",
        "properties": {
          "sessionId": {
            "type": "string",
            "format": "uuid"
          },
          "text": {
            "type": [
              "null",
              "string"
            ]
          },
          "mediaUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "visibility": {
            "type": [
              "null",
              "string"
            ]
          },
          "routineId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          }
        }
      },
      "CreatePromptTemplateRequest": {
        "required": [
          "feature",
          "modality",
          "locale",
          "systemPrompt",
          "outputSchemaJson",
          "notes",
          "activate"
        ],
        "type": "object",
        "properties": {
          "feature": {
            "type": "string"
          },
          "modality": {
            "type": "string"
          },
          "locale": {
            "type": "string"
          },
          "systemPrompt": {
            "type": "string"
          },
          "outputSchemaJson": {
            "type": [
              "null",
              "string"
            ]
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          },
          "activate": {
            "type": [
              "null",
              "boolean"
            ]
          }
        }
      },
      "CreateProviderConfigRequest": {
        "required": [
          "provider",
          "model",
          "apiKey",
          "inputCostPer1KTokensUsd",
          "outputCostPer1KTokensUsd",
          "baseUrlOverride",
          "assignedFeatures",
          "activate"
        ],
        "type": "object",
        "properties": {
          "provider": {
            "type": "string"
          },
          "model": {
            "type": "string"
          },
          "apiKey": {
            "type": "string"
          },
          "inputCostPer1KTokensUsd": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "outputCostPer1KTokensUsd": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "baseUrlOverride": {
            "type": [
              "null",
              "string"
            ]
          },
          "assignedFeatures": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "activate": {
            "type": [
              "null",
              "boolean"
            ]
          }
        }
      },
      "CreateRoutineBlockRequest": {
        "required": [
          "title",
          "content",
          "scheme",
          "durationSeconds",
          "rounds"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "content": {
            "type": "string"
          },
          "scheme": {
            "type": [
              "null",
              "string"
            ]
          },
          "durationSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "rounds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "CreateRoutineExerciseRequest": {
        "required": [
          "exerciseId",
          "restSeconds",
          "notes",
          "plannedSets"
        ],
        "type": "object",
        "properties": {
          "exerciseId": {
            "type": "string"
          },
          "restSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          },
          "plannedSets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CreatePlannedSetRequest"
            }
          }
        }
      },
      "CreateRoutineRequest": {
        "required": [
          "name",
          "modality",
          "description",
          "scheme",
          "timeCapSeconds",
          "scoreLabelA",
          "scoreLabelB",
          "runningSubtype",
          "exercises",
          "blocks"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "modality": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "scheme": {
            "type": [
              "null",
              "string"
            ]
          },
          "timeCapSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "scoreLabelA": {
            "type": [
              "null",
              "string"
            ]
          },
          "scoreLabelB": {
            "type": [
              "null",
              "string"
            ]
          },
          "runningSubtype": {
            "type": [
              "null",
              "string"
            ]
          },
          "exercises": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/CreateRoutineExerciseRequest"
            }
          },
          "blocks": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/CreateRoutineBlockRequest"
            }
          }
        }
      },
      "GenerateProgramRequest": {
        "required": [
          "modality",
          "goal",
          "weeksPlanned",
          "sessionsPerWeek",
          "minutesPerSession",
          "trainingDaysMask",
          "equipment",
          "restrictions",
          "additionalContext",
          "startDate",
          "replaceExistingSlots"
        ],
        "type": "object",
        "properties": {
          "modality": {
            "type": "string"
          },
          "goal": {
            "type": "string"
          },
          "weeksPlanned": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "sessionsPerWeek": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "minutesPerSession": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "trainingDaysMask": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "uint8"
          },
          "equipment": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "restrictions": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "additionalContext": {
            "type": [
              "null",
              "string"
            ]
          },
          "startDate": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "replaceExistingSlots": {
            "type": [
              "null",
              "boolean"
            ]
          }
        }
      },
      "GenerateRoutineRequest": {
        "required": [
          "modality",
          "goal",
          "experience",
          "sessionsPerWeek",
          "minutesPerSession",
          "equipment",
          "restrictions",
          "freeText"
        ],
        "type": "object",
        "properties": {
          "modality": {
            "type": "string"
          },
          "goal": {
            "type": "string"
          },
          "experience": {
            "type": "string"
          },
          "sessionsPerWeek": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "minutesPerSession": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "equipment": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "restrictions": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "freeText": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "GrantProRequest": {
        "required": [
          "userId",
          "email",
          "durationDays",
          "note"
        ],
        "type": "object",
        "properties": {
          "userId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "email": {
            "type": [
              "null",
              "string"
            ]
          },
          "durationDays": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "note": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "LogPastSessionRequest": {
        "required": [
          "name",
          "modality",
          "completedAt",
          "durationSeconds",
          "routineId",
          "notes",
          "scoreA",
          "scoreB",
          "distanceMeters",
          "completedRounds",
          "caloriesKcal",
          "avgRpe",
          "avgPaceSecondsPerKm",
          "effortScore",
          "avgHeartRateBpm",
          "maxHeartRateBpm",
          "activeCaloriesKcal",
          "totalVolumeKg",
          "blocks"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "modality": {
            "type": "string"
          },
          "completedAt": {
            "type": "string",
            "format": "date-time"
          },
          "durationSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "routineId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          },
          "scoreA": {
            "type": [
              "null",
              "string"
            ]
          },
          "scoreB": {
            "type": [
              "null",
              "string"
            ]
          },
          "distanceMeters": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "completedRounds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "caloriesKcal": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "avgRpe": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "avgPaceSecondsPerKm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "effortScore": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "avgHeartRateBpm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "maxHeartRateBpm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "activeCaloriesKcal": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "totalVolumeKg": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "blocks": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/SessionBlockDto"
            }
          }
        }
      },
      "LoginRequest": {
        "required": [
          "email",
          "password"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "password": {
            "type": "string"
          }
        }
      },
      "RecordSetRequest": {
        "required": [
          "exerciseId",
          "setType",
          "reps",
          "weightKg",
          "rpe",
          "restSeconds",
          "notes"
        ],
        "type": "object",
        "properties": {
          "exerciseId": {
            "type": "string"
          },
          "setType": {
            "type": [
              "null",
              "string"
            ]
          },
          "reps": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "weightKg": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "rpe": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "restSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "RefreshRequest": {
        "required": [
          "refreshToken"
        ],
        "type": "object",
        "properties": {
          "refreshToken": {
            "type": "string"
          }
        }
      },
      "RegisterRequest": {
        "required": [
          "email",
          "password",
          "displayName",
          "locale",
          "timezone"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "password": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "locale": {
            "type": [
              "null",
              "string"
            ]
          },
          "timezone": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "RevokeProRequest": {
        "required": [
          "userId",
          "email"
        ],
        "type": "object",
        "properties": {
          "userId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "email": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "SessionBlockDto": {
        "required": [
          "title",
          "content"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "content": {
            "type": "string"
          }
        }
      },
      "SetHandleRequest": {
        "required": [
          "handle"
        ],
        "type": "object",
        "properties": {
          "handle": {
            "type": "string"
          }
        }
      },
      "SetUserDisabledRequest": {
        "required": [
          "disabled"
        ],
        "type": "object",
        "properties": {
          "disabled": {
            "type": "boolean"
          }
        }
      },
      "SetUserTypesRequest": {
        "required": [
          "types"
        ],
        "type": "object",
        "properties": {
          "types": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          }
        }
      },
      "StartSessionRequest": {
        "required": [
          "routineId",
          "name",
          "modality"
        ],
        "type": "object",
        "properties": {
          "routineId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "modality": {
            "type": "string"
          }
        }
      },
      "UpdateProfileRequest": {
        "required": [
          "sex",
          "ageYears",
          "heightCm",
          "weightKg",
          "experience",
          "primaryModality",
          "sessionsPerWeek",
          "minutesPerSession",
          "goals",
          "equipment",
          "restrictions",
          "freeText"
        ],
        "type": "object",
        "properties": {
          "sex": {
            "type": "string"
          },
          "ageYears": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "heightCm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "weightKg": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "experience": {
            "type": "string"
          },
          "primaryModality": {
            "type": "string"
          },
          "sessionsPerWeek": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "minutesPerSession": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "goals": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "equipment": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "restrictions": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "freeText": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "UpdateProviderConfigRequest": {
        "required": [
          "model",
          "newApiKey",
          "inputCostPer1KTokensUsd",
          "outputCostPer1KTokensUsd",
          "baseUrlOverride",
          "assignedFeatures",
          "isActive"
        ],
        "type": "object",
        "properties": {
          "model": {
            "type": [
              "null",
              "string"
            ]
          },
          "newApiKey": {
            "type": [
              "null",
              "string"
            ]
          },
          "inputCostPer1KTokensUsd": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "outputCostPer1KTokensUsd": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "baseUrlOverride": {
            "type": [
              "null",
              "string"
            ]
          },
          "assignedFeatures": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "isActive": {
            "type": [
              "null",
              "boolean"
            ]
          }
        }
      },
      "UpdateSessionRequest": {
        "required": [
          "name",
          "notes",
          "scoreA",
          "scoreB",
          "durationSeconds",
          "distanceMeters",
          "completedRounds",
          "caloriesKcal",
          "avgRpe",
          "avgPaceSecondsPerKm",
          "effortScore",
          "avgHeartRateBpm",
          "maxHeartRateBpm",
          "activeCaloriesKcal",
          "blocks",
          "recalculateVolume"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": [
              "null",
              "string"
            ]
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          },
          "scoreA": {
            "type": [
              "null",
              "string"
            ]
          },
          "scoreB": {
            "type": [
              "null",
              "string"
            ]
          },
          "durationSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "distanceMeters": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "completedRounds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "caloriesKcal": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "avgRpe": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "avgPaceSecondsPerKm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "effortScore": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "avgHeartRateBpm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "maxHeartRateBpm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "activeCaloriesKcal": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "blocks": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/SessionBlockDto"
            }
          },
          "recalculateVolume": {
            "type": [
              "null",
              "boolean"
            ]
          }
        }
      },
      "UpdateSetRecordRequest": {
        "required": [
          "setType",
          "reps",
          "weightKg",
          "rpe",
          "restSeconds",
          "notes"
        ],
        "type": "object",
        "properties": {
          "setType": {
            "type": [
              "null",
              "string"
            ]
          },
          "reps": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "weightKg": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "rpe": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "restSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "UpsertScheduledWorkoutRequest": {
        "required": [
          "weekStartDate",
          "dayOfWeek",
          "slotId",
          "routineId",
          "customTitle",
          "customDescription",
          "scheduledTime",
          "modality"
        ],
        "type": "object",
        "properties": {
          "weekStartDate": {
            "type": "string",
            "format": "date"
          },
          "dayOfWeek": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "slotId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "routineId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "customTitle": {
            "type": [
              "null",
              "string"
            ]
          },
          "customDescription": {
            "type": [
              "null",
              "string"
            ]
          },
          "scheduledTime": {
            "type": [
              "null",
              "string"
            ],
            "format": "time"
          },
          "modality": {
            "type": "string"
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "Health"
    },
    {
      "name": "Identity"
    },
    {
      "name": "Identity - Profile"
    },
    {
      "name": "Identity - Admin"
    },
    {
      "name": "Training - Sessions"
    },
    {
      "name": "Training - Stats"
    },
    {
      "name": "Training - Schedule"
    },
    {
      "name": "Training - Routines"
    },
    {
      "name": "Training - Reports"
    },
    {
      "name": "Training - Records"
    },
    {
      "name": "Training - Exercises"
    },
    {
      "name": "Training - Admin"
    },
    {
      "name": "Coach"
    },
    {
      "name": "Coach - Admin"
    },
    {
      "name": "Social - Posts"
    },
    {
      "name": "Social - Follows"
    },
    {
      "name": "Social - Engagement"
    },
    {
      "name": "Social - Discovery"
    },
    {
      "name": "Social - Compare"
    },
    {
      "name": "Social - Blocks"
    },
    {
      "name": "Social - Badges"
    },
    {
      "name": "Social - Diagnostics"
    },
    {
      "name": "Social - Admin"
    },
    {
      "name": "Billing"
    },
    {
      "name": "Billing - Admin"
    }
  ]
}