{
  "openapi": "3.1.1",
  "info": {
    "title": "ClimbUp.Api.Web",
    "description": "ClimbUp API. Browser callers use cookie + CSRF; mobile callers use Bearer JWT.",
    "version": "v1"
  },
  "servers": [
    {
      "url": "https://api.climb-up.app/"
    }
  ],
  "paths": {
    "/": {
      "get": {
        "tags": [
          "ClimbUp.Api.Web"
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/audit": {
      "get": {
        "tags": [
          "Audit"
        ],
        "operationId": "Audit_List",
        "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"
            }
          },
          {
            "name": "Search",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SkipCount",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "TakeCount",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "entityType",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "action",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagedResponseOfAuditLogDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/audit/export": {
      "get": {
        "tags": [
          "Audit"
        ],
        "operationId": "Audit_Export",
        "parameters": [
          {
            "name": "entityType",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "action",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions": {
      "get": {
        "tags": [
          "Competitions"
        ],
        "operationId": "Competitions_List",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CompetitionDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Competitions"
        ],
        "operationId": "Competitions_Create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompetitionRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CompetitionRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CompetitionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompetitionDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{id}": {
      "get": {
        "tags": [
          "Competitions"
        ],
        "operationId": "Competitions_Get",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompetitionDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Competitions"
        ],
        "operationId": "Competitions_Update",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompetitionRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CompetitionRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CompetitionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompetitionDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Competitions"
        ],
        "operationId": "Competitions_Delete",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/trash": {
      "get": {
        "tags": [
          "Competitions"
        ],
        "operationId": "Competitions_Trash",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CompetitionDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{id}/restore": {
      "post": {
        "tags": [
          "Competitions"
        ],
        "operationId": "Competitions_Restore",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/categories": {
      "get": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_Categories",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CompCategoryDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_CreateCategory",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompCategoryRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CompCategoryRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CompCategoryRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompCategoryDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/categories/{id}": {
      "put": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_UpdateCategory",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompCategoryRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CompCategoryRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CompCategoryRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompCategoryDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_DeleteCategory",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/phases": {
      "get": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_Phases",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CompPhaseDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_CreatePhase",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompPhaseRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CompPhaseRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CompPhaseRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompPhaseDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/phases/{id}": {
      "put": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_UpdatePhase",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompPhaseRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CompPhaseRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CompPhaseRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompPhaseDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_DeletePhase",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/phases/{id}/status": {
      "patch": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_SetPhaseStatus",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompPhaseStatusRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CompPhaseStatusRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CompPhaseStatusRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompPhaseDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/phases/{phaseId}/routes": {
      "get": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_PhaseRoutes",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "phaseId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CompRouteDetailDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/phases/{phaseId}/routes/{routeId}": {
      "put": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_UpdatePhaseRoute",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "phaseId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "routeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateCompRouteRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateCompRouteRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateCompRouteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompRouteDetailDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/athletes": {
      "get": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_Athletes",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CompAthleteDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_RegisterAthlete",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompAthleteRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CompAthleteRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CompAthleteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompAthleteDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/athletes/{id}": {
      "patch": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_UpdateAthlete",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompAthleteUpdateRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CompAthleteUpdateRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CompAthleteUpdateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompAthleteDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_UnregisterAthlete",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/attempts": {
      "post": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_Score",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompAttemptRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CompAttemptRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CompAttemptRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompAttemptDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/leaderboard": {
      "get": {
        "tags": [
          "CompetitionSetup"
        ],
        "operationId": "CompetitionSetup_Leaderboard",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "phaseId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "categoryId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CompRankingDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/dashboard": {
      "get": {
        "tags": [
          "Dashboard"
        ],
        "operationId": "Dashboard_Get",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DashboardDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/devices": {
      "get": {
        "tags": [
          "Devices"
        ],
        "operationId": "Devices_List",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/DeviceDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Devices"
        ],
        "operationId": "Devices_Create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/devices/{id}": {
      "get": {
        "tags": [
          "Devices"
        ],
        "operationId": "Devices_Get",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Devices"
        ],
        "operationId": "Devices_Update",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Devices"
        ],
        "operationId": "Devices_Delete",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/devices/{id}/logs": {
      "get": {
        "tags": [
          "Devices"
        ],
        "operationId": "Devices_Logs",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "eventType",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "take",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32",
              "default": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SensorLogDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/devices/{id}/reboot": {
      "post": {
        "tags": [
          "Devices"
        ],
        "operationId": "Devices_Reboot",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceCommandResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/devices/{id}/firmware": {
      "post": {
        "tags": [
          "Devices"
        ],
        "operationId": "Devices_Firmware",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceFirmwareRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceFirmwareRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceFirmwareRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceCommandResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/devices/{id}/api-keys": {
      "post": {
        "tags": [
          "Devices"
        ],
        "operationId": "Devices_IssueApiKey",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceApiKeyRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceApiKeyRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DeviceApiKeyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceApiKeyResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/ingest/telemetry": {
      "post": {
        "tags": [
          "Ingest"
        ],
        "operationId": "Ingest_Telemetry",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TelemetryBatchRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/TelemetryBatchRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/TelemetryBatchRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": { }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/ingest/speed-run": {
      "post": {
        "tags": [
          "Ingest"
        ],
        "operationId": "Ingest_SpeedRunIngest",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpeedRunIngestRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SpeedRunIngestRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SpeedRunIngestRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": { }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/competitions/{compId}/isolation": {
      "get": {
        "tags": [
          "Isolation"
        ],
        "operationId": "Isolation_Zones",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "phaseId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/IsolationZoneDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Isolation"
        ],
        "operationId": "Isolation_CreateZone",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateIsolationZoneRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateIsolationZoneRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateIsolationZoneRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IsolationZoneDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/isolation/{zoneId}": {
      "put": {
        "tags": [
          "Isolation"
        ],
        "operationId": "Isolation_UpdateZone",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "zoneId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateIsolationZoneRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateIsolationZoneRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateIsolationZoneRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IsolationZoneDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Isolation"
        ],
        "operationId": "Isolation_DeleteZone",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "zoneId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/isolation/{zoneId}/status": {
      "patch": {
        "tags": [
          "Isolation"
        ],
        "operationId": "Isolation_SetStatus",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "zoneId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IsolationZoneStatusRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/IsolationZoneStatusRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/IsolationZoneStatusRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IsolationZoneDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/isolation/{zoneId}/athletes": {
      "post": {
        "tags": [
          "Isolation"
        ],
        "operationId": "Isolation_Enter",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "zoneId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnterIsolationRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/EnterIsolationRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/EnterIsolationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/isolation/athletes/{id}/call": {
      "patch": {
        "tags": [
          "Isolation"
        ],
        "operationId": "Isolation_Call",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/isolation/athletes/{id}/exit": {
      "patch": {
        "tags": [
          "Isolation"
        ],
        "operationId": "Isolation_Exit",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/competitions/{compId}/isolation/athletes/{id}": {
      "delete": {
        "tags": [
          "Isolation"
        ],
        "operationId": "Isolation_Remove",
        "parameters": [
          {
            "name": "compId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/maintenance-events": {
      "get": {
        "tags": [
          "MaintenanceEvents"
        ],
        "operationId": "MaintenanceEvents_List",
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MaintenanceEventDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "MaintenanceEvents"
        ],
        "operationId": "MaintenanceEvents_Create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceEventRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceEventRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceEventRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaintenanceEventDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/maintenance-events/{id}": {
      "get": {
        "tags": [
          "MaintenanceEvents"
        ],
        "operationId": "MaintenanceEvents_Get",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaintenanceEventDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "MaintenanceEvents"
        ],
        "operationId": "MaintenanceEvents_Update",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceEventRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceEventRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MaintenanceEventRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaintenanceEventDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "MaintenanceEvents"
        ],
        "operationId": "MaintenanceEvents_Delete",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/members": {
      "post": {
        "tags": [
          "Members"
        ],
        "operationId": "Members_Create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InviteMemberRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/InviteMemberRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/InviteMemberRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InviteResponse"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "get": {
        "tags": [
          "Members"
        ],
        "operationId": "Members_List",
        "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"
            }
          },
          {
            "name": "Search",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SkipCount",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "TakeCount",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "active",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagedResponseOfMemberDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/members/{membershipId}/resend-invite": {
      "post": {
        "tags": [
          "Members"
        ],
        "operationId": "Members_ResendInvite",
        "parameters": [
          {
            "name": "membershipId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InviteResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/members/{membershipId}": {
      "get": {
        "tags": [
          "Members"
        ],
        "operationId": "Members_Get",
        "parameters": [
          {
            "name": "membershipId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemberDto"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Members"
        ],
        "operationId": "Members_Update",
        "parameters": [
          {
            "name": "membershipId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMemberRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMemberRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMemberRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemberDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Members"
        ],
        "operationId": "Members_Delete",
        "parameters": [
          {
            "name": "membershipId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/members/trash": {
      "get": {
        "tags": [
          "Members"
        ],
        "operationId": "Members_Trash",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MemberDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/members/{membershipId}/permissions": {
      "get": {
        "tags": [
          "Members"
        ],
        "operationId": "Members_GetPermissions",
        "parameters": [
          {
            "name": "membershipId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MembershipPermissionsDto"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Members"
        ],
        "operationId": "Members_UpdatePermissions",
        "parameters": [
          {
            "name": "membershipId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMembershipPermissionsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMembershipPermissionsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMembershipPermissionsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MembershipPermissionsDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/members/{membershipId}/restore": {
      "post": {
        "tags": [
          "Members"
        ],
        "operationId": "Members_Restore",
        "parameters": [
          {
            "name": "membershipId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/operators": {
      "post": {
        "tags": [
          "Operators"
        ],
        "operationId": "Operators_Create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InviteOperatorRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/InviteOperatorRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/InviteOperatorRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InviteResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "get": {
        "tags": [
          "Operators"
        ],
        "operationId": "Operators_List",
        "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"
            }
          },
          {
            "name": "Search",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SkipCount",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "TakeCount",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "role",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/GymRole"
            }
          },
          {
            "name": "active",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagedResponseOfOperatorDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/operators/{membershipId}": {
      "get": {
        "tags": [
          "Operators"
        ],
        "operationId": "Operators_Get",
        "parameters": [
          {
            "name": "membershipId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OperatorDto"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Operators"
        ],
        "operationId": "Operators_Update",
        "parameters": [
          {
            "name": "membershipId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateOperatorRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateOperatorRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateOperatorRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OperatorDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Operators"
        ],
        "operationId": "Operators_Revoke",
        "parameters": [
          {
            "name": "membershipId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": { }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/operators/{membershipId}/resend-invite": {
      "post": {
        "tags": [
          "Operators"
        ],
        "operationId": "Operators_ResendInvite",
        "parameters": [
          {
            "name": "membershipId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InviteResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/operators/{membershipId}/permissions": {
      "get": {
        "tags": [
          "Operators"
        ],
        "operationId": "Operators_GetPermissions",
        "parameters": [
          {
            "name": "membershipId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MembershipPermissionsDto"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Operators"
        ],
        "operationId": "Operators_UpdatePermissions",
        "parameters": [
          {
            "name": "membershipId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMembershipPermissionsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMembershipPermissionsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMembershipPermissionsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MembershipPermissionsDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/push-campaigns": {
      "get": {
        "tags": [
          "PushCampaigns"
        ],
        "operationId": "PushCampaigns_List",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PushCampaignDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "PushCampaigns"
        ],
        "operationId": "PushCampaigns_Create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PushCampaignRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/PushCampaignRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/PushCampaignRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PushCampaignDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/push-campaigns/{id}": {
      "delete": {
        "tags": [
          "PushCampaigns"
        ],
        "operationId": "PushCampaigns_Delete",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/push-campaigns/{id}/send": {
      "post": {
        "tags": [
          "PushCampaigns"
        ],
        "operationId": "PushCampaigns_Send",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PushCampaignDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/roles": {
      "get": {
        "tags": [
          "Roles"
        ],
        "operationId": "Roles_Get",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RoleCatalogResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/roles/custom": {
      "get": {
        "tags": [
          "Roles"
        ],
        "operationId": "Roles_ListCustom",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomRoleDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Roles"
        ],
        "operationId": "Roles_CreateCustom",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomRoleRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomRoleRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CustomRoleRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomRoleDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/roles/custom/{id}": {
      "put": {
        "tags": [
          "Roles"
        ],
        "operationId": "Roles_UpdateCustom",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomRoleRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomRoleRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CustomRoleRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomRoleDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Roles"
        ],
        "operationId": "Roles_DeleteCustom",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": { }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/shifts": {
      "get": {
        "tags": [
          "Shifts"
        ],
        "operationId": "Shifts_List",
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ShiftDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Shifts"
        ],
        "operationId": "Shifts_Create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ShiftRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ShiftRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ShiftRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShiftDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/shifts/mine": {
      "get": {
        "tags": [
          "Shifts"
        ],
        "operationId": "Shifts_Mine",
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ShiftDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/shifts/{id}": {
      "get": {
        "tags": [
          "Shifts"
        ],
        "operationId": "Shifts_Get",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShiftDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Shifts"
        ],
        "operationId": "Shifts_Update",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ShiftRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ShiftRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ShiftRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ShiftDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Shifts"
        ],
        "operationId": "Shifts_Delete",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/subscriptions": {
      "get": {
        "tags": [
          "Subscriptions"
        ],
        "operationId": "Subscriptions_List",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SubscriptionDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Subscriptions"
        ],
        "operationId": "Subscriptions_Create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubscriptionRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SubscriptionRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SubscriptionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubscriptionDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/subscriptions/{id}": {
      "get": {
        "tags": [
          "Subscriptions"
        ],
        "operationId": "Subscriptions_Get",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubscriptionDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Subscriptions"
        ],
        "operationId": "Subscriptions_Update",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubscriptionRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SubscriptionRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SubscriptionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubscriptionDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Subscriptions"
        ],
        "operationId": "Subscriptions_Delete",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/time-entries": {
      "get": {
        "tags": [
          "TimeEntries"
        ],
        "operationId": "TimeEntries_List",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/TimeEntryStatus"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TimeEntryDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/time-entries/mine": {
      "get": {
        "tags": [
          "TimeEntries"
        ],
        "operationId": "TimeEntries_Mine",
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TimeEntryDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/time-entries/clock-in": {
      "post": {
        "tags": [
          "TimeEntries"
        ],
        "operationId": "TimeEntries_ClockIn",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClockInRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ClockInRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ClockInRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntryDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/time-entries/clock-out": {
      "post": {
        "tags": [
          "TimeEntries"
        ],
        "operationId": "TimeEntries_ClockOut",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClockOutRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ClockOutRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ClockOutRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntryDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/time-entries/{id}/approve": {
      "post": {
        "tags": [
          "TimeEntries"
        ],
        "operationId": "TimeEntries_Approve",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApproveTimeEntryRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ApproveTimeEntryRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ApproveTimeEntryRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeEntryDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/training-protocols": {
      "get": {
        "tags": [
          "TrainingProtocolsAdmin"
        ],
        "operationId": "TrainingProtocolsAdmin_List",
        "parameters": [
          {
            "name": "boardType",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TrainingProtocolDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "TrainingProtocolsAdmin"
        ],
        "operationId": "TrainingProtocolsAdmin_Create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveTrainingProtocolRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveTrainingProtocolRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SaveTrainingProtocolRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingProtocolDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/training-protocols/{id}": {
      "put": {
        "tags": [
          "TrainingProtocolsAdmin"
        ],
        "operationId": "TrainingProtocolsAdmin_Update",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveTrainingProtocolRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveTrainingProtocolRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SaveTrainingProtocolRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingProtocolDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "TrainingProtocolsAdmin"
        ],
        "operationId": "TrainingProtocolsAdmin_Delete",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/auth/register": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Register a new climber account and bind it to the default gym. Sends an email\n    verification token. When confirmed-email is required, the account cannot sign in until\n    verified (no token issued yet); otherwise the user is logged in immediately.",
        "operationId": "Auth_Register",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegisterResponse"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/auth/google": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Sign in with a Google ID token (Google Identity Services). Verifies the\ntoken against Google, then finds or creates the matching user by verified\nemail and issues the normal auth response. Gated on `Auth:Google:ClientId`.",
        "operationId": "Auth_GoogleSignIn",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GoogleSignInRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GoogleSignInRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GoogleSignInRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/auth/verify-email": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Confirm an email using the token from registration / resend. On success the\n    user is logged in (returns an auth response).",
        "operationId": "Auth_VerifyEmail",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VerifyEmailRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/VerifyEmailRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/VerifyEmailRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/auth/resend-verification": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Resend the email verification token. Always returns 200 to avoid email enumeration.",
        "operationId": "Auth_ResendVerification",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResendVerificationRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ResendVerificationRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ResendVerificationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResendVerificationResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/auth/login": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Authenticate with email + password. Issues a JWT in the response body and an HttpOnly cookie for browser sessions.",
        "operationId": "Auth_Login",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LoginResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/auth/2fa/challenge": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Complete a 2FA login: exchange the challenge token from `POST /auth/login`\n    plus a TOTP code (or a recovery code) for the auth tokens.",
        "operationId": "Auth_TwoFactorChallenge",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFactorChallengeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFactorChallengeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFactorChallengeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/auth/2fa": {
      "get": {
        "tags": [
          "Auth"
        ],
        "summary": "Current user's 2FA status.",
        "operationId": "Auth_TwoFactorStatus",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TwoFactorStatusResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/auth/2fa/enroll": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Start TOTP enrollment: returns the shared key and otpauth URI for the\n    authenticator app. Enrollment is confirmed via `POST /auth/2fa/verify`.",
        "operationId": "Auth_TwoFactorEnroll",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TwoFactorEnrollResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/auth/2fa/verify": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Confirm TOTP enrollment with a code from the authenticator app.\n    Enables 2FA and returns the one-time recovery codes (shown once).",
        "operationId": "Auth_TwoFactorVerify",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFactorVerifyRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFactorVerifyRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFactorVerifyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TwoFactorVerifyResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/auth/2fa/disable": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Disable 2FA. Requires a valid TOTP code (or recovery code); resets the authenticator key.",
        "operationId": "Auth_TwoFactorDisable",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFactorDisableRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFactorDisableRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFactorDisableRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": { }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/auth/accept-invite": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Accept a gym membership invite: sets the user's password and activates the membership. Returns an auth response so the client can log in immediately.",
        "operationId": "Auth_AcceptInvite",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AcceptInviteRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AcceptInviteRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AcceptInviteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "410": {
            "description": "Gone",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/auth/forgot-password": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Request a password reset. Always returns 200 to avoid email enumeration. In Development the reset token is returned in the response body so the client can complete the flow without SMTP.",
        "operationId": "Auth_ForgotPassword",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ForgotPasswordRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ForgotPasswordRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ForgotPasswordRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForgotPasswordResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/auth/reset-password": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Complete a password reset using the token from `/auth/forgot-password`.",
        "operationId": "Auth_ResetPassword",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResetPasswordRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ResetPasswordRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ResetPasswordRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/auth/switch-gym": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Switch the active gym binding for the current user; issues a fresh token bound to the new gym.",
        "operationId": "Auth_SwitchGym",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SwitchGymRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SwitchGymRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SwitchGymRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/auth/refresh": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Exchange a valid refresh token for a fresh access token. Rotates the refresh token\n    (the old one is revoked) and re-reads roles from the database so role changes propagate.",
        "operationId": "Auth_Refresh",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/auth/logout": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "Clears the browser session cookies and revokes the presented refresh token.\n    Bearer-token callers can simply discard their access token.",
        "operationId": "Auth_Logout",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/components/schemas/RefreshRequest"
                  }
                ]
              }
            },
            "text/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/components/schemas/RefreshRequest"
                  }
                ]
              }
            },
            "application/*+json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/components/schemas/RefreshRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/auth/csrf": {
      "get": {
        "tags": [
          "Auth"
        ],
        "summary": "Returns the CSRF token the browser must attach as `X-CSRF-Token` on mutating requests.",
        "operationId": "Auth_Csrf",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CsrfResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/auth/memberships": {
      "get": {
        "tags": [
          "Auth"
        ],
        "summary": "List all gym memberships of the current user (workspace picker).",
        "operationId": "Auth_Memberships",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MembershipSummaryDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/auth/me": {
      "get": {
        "tags": [
          "Auth"
        ],
        "summary": "Current authenticated user profile + gym binding.",
        "operationId": "Auth_Me",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/chats": {
      "get": {
        "tags": [
          "Chats"
        ],
        "operationId": "Chats_List",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ChatRoomDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Chats"
        ],
        "operationId": "Chats_Start",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartChatRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/StartChatRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/StartChatRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChatRoomDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/chats/{roomId}/messages": {
      "get": {
        "tags": [
          "Chats"
        ],
        "operationId": "Chats_Messages",
        "parameters": [
          {
            "name": "roomId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "afterId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "take",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32",
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ChatMessageDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Chats"
        ],
        "operationId": "Chats_Send",
        "parameters": [
          {
            "name": "roomId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SendChatMessageRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SendChatMessageRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SendChatMessageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChatMessageDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/follow/{userId}": {
      "post": {
        "tags": [
          "Follow"
        ],
        "summary": "Follow a user. Idempotent — following twice is a no-op.",
        "operationId": "Follow_Follow",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FollowStatusDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Follow"
        ],
        "summary": "Unfollow a user. Idempotent.",
        "operationId": "Follow_Unfollow",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FollowStatusDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/follow/status/{userId}": {
      "get": {
        "tags": [
          "Follow"
        ],
        "summary": "My relationship to a user plus their follower/following totals.",
        "operationId": "Follow_Status",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FollowStatusDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/follow/followers": {
      "get": {
        "tags": [
          "Follow"
        ],
        "summary": "Users who follow userId (defaults to me).",
        "operationId": "Follow_Followers",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "take",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32",
              "default": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FollowUserDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/follow/following": {
      "get": {
        "tags": [
          "Follow"
        ],
        "summary": "Users that userId follows (defaults to me).",
        "operationId": "Follow_Following",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "take",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32",
              "default": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FollowUserDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/gyms": {
      "get": {
        "tags": [
          "Gyms"
        ],
        "summary": "List all gyms. Optional case-insensitive `search` matches name, city, or slug.",
        "operationId": "Gyms_List",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GymDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Gyms"
        ],
        "summary": "Create a new gym; the caller becomes its Owner. Any authenticated user may create one\n(self-serve onboarding) — switch into it afterwards via `POST /auth/switch-gym`.\nThe gym starts inactive: platform admins verify and activate it from the Admin console.",
        "operationId": "Gyms_Create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateGymRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateGymRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateGymRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GymDto"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/gyms/nearby": {
      "get": {
        "tags": [
          "Gyms"
        ],
        "summary": "Gyms within radiusKm of (lat,lng),\nordered by distance ascending. PostGIS `ST_DWithin` on Gym.Location.",
        "operationId": "Gyms_Nearby",
        "parameters": [
          {
            "name": "lat",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
              "type": [
                "number",
                "string"
              ],
              "format": "double"
            }
          },
          {
            "name": "lng",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
              "type": [
                "number",
                "string"
              ],
              "format": "double"
            }
          },
          {
            "name": "radiusKm",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
              "type": [
                "number",
                "string"
              ],
              "format": "double",
              "default": 25
            }
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GymDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          }
        }
      }
    },
    "/api/gyms/current": {
      "get": {
        "tags": [
          "Gyms"
        ],
        "summary": "The gym the current user is bound to.",
        "operationId": "Gyms_Current",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GymDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Gyms"
        ],
        "summary": "Update the current user's gym identity, location, and contact info.",
        "operationId": "Gyms_UpdateCurrent",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateGymRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateGymRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateGymRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GymDto"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/gyms/{id}": {
      "get": {
        "tags": [
          "Gyms"
        ],
        "operationId": "Gyms_Get",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GymDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/gyms/current/logo": {
      "post": {
        "tags": [
          "Gyms"
        ],
        "summary": "Upload the current gym's logo (multipart form-data, field name `file`). Replaces any previous logo.",
        "operationId": "Gyms_UploadLogo",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "$ref": "#/components/schemas/IFormFile"
                  }
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GymDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/matches/candidates": {
      "get": {
        "tags": [
          "Matches"
        ],
        "summary": "Discovery deck: opted-in climbers I haven't swiped yet.",
        "operationId": "Matches_Candidates",
        "parameters": [
          {
            "name": "discipline",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/Discipline"
            }
          },
          {
            "name": "take",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32",
              "default": 30
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MatchCandidateDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/matches/swipe": {
      "post": {
        "tags": [
          "Matches"
        ],
        "summary": "Swipe on a candidate. Like may complete a mutual match.",
        "operationId": "Matches_Swipe",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SwipeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SwipeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SwipeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SwipeResultDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/matches": {
      "get": {
        "tags": [
          "Matches"
        ],
        "summary": "My confirmed matches, newest first.",
        "operationId": "Matches_Mine",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MatchDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/matches/pending": {
      "get": {
        "tags": [
          "Matches"
        ],
        "summary": "Incoming likes waiting on my decision.",
        "operationId": "Matches_Pending",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MatchDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/matches/preferences": {
      "get": {
        "tags": [
          "Matches"
        ],
        "summary": "My match preferences (creates defaults on first read).",
        "operationId": "Matches_GetPreferences",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchPreferencesDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Matches"
        ],
        "operationId": "Matches_UpdatePreferences",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMatchPreferencesRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMatchPreferencesRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMatchPreferencesRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MatchPreferencesDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/notifications": {
      "get": {
        "tags": [
          "Notifications"
        ],
        "summary": "Notifications for the current user, newest first.",
        "operationId": "Notifications_List",
        "parameters": [
          {
            "name": "unread",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/NotificationDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/notifications/unread-count": {
      "get": {
        "tags": [
          "Notifications"
        ],
        "summary": "Count of unread notifications.",
        "operationId": "Notifications_UnreadCount",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "pattern": "^-?(?:0|[1-9]\\d*)$",
                  "type": [
                    "integer",
                    "string"
                  ],
                  "format": "int32"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/notifications/{id}/read": {
      "post": {
        "tags": [
          "Notifications"
        ],
        "summary": "Mark one notification as read.",
        "operationId": "Notifications_MarkRead",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/notifications/broadcast": {
      "post": {
        "tags": [
          "Notifications"
        ],
        "summary": "Broadcast a notification to a gym audience (members/operators/role).",
        "operationId": "Notifications_Broadcast",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BroadcastNotificationRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BroadcastNotificationRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BroadcastNotificationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BroadcastNotificationResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/notifications/read-all": {
      "post": {
        "tags": [
          "Notifications"
        ],
        "summary": "Mark every notification of the current user as read.",
        "operationId": "Notifications_MarkAllRead",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/partners": {
      "get": {
        "tags": [
          "Partners"
        ],
        "operationId": "Partners_Search",
        "parameters": [
          {
            "name": "discipline",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/Discipline"
            }
          },
          {
            "name": "gradeMin",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "gradeMax",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lat",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
              "type": [
                "number",
                "string"
              ],
              "format": "double"
            }
          },
          {
            "name": "lng",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
              "type": [
                "number",
                "string"
              ],
              "format": "double"
            }
          },
          {
            "name": "radiusKm",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
              "type": [
                "number",
                "string"
              ],
              "format": "double"
            }
          },
          {
            "name": "sameGym",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "take",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32",
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PartnerCardDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/profile": {
      "get": {
        "tags": [
          "Profile"
        ],
        "summary": "Current user's profile.",
        "operationId": "Profile_Mine",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Profile"
        ],
        "summary": "Update the current user's profile.",
        "operationId": "Profile_Update",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProfileRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProfileRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProfileRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/profile/{userId}": {
      "get": {
        "tags": [
          "Profile"
        ],
        "summary": "Another user's profile.",
        "operationId": "Profile_Get",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/profile/avatar": {
      "post": {
        "tags": [
          "Profile"
        ],
        "summary": "Upload an avatar image (multipart form-data, field name `file`). Replaces any previous avatar.",
        "operationId": "Profile_UploadAvatar",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "$ref": "#/components/schemas/IFormFile"
                  }
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/profile/partner-prefs": {
      "put": {
        "tags": [
          "Profile"
        ],
        "summary": "Toggle partner-match opt-in and grade range.",
        "operationId": "Profile_UpdatePartnerPrefs",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdatePartnerPrefsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdatePartnerPrefsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdatePartnerPrefsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/profile/certifications": {
      "get": {
        "tags": [
          "Profile"
        ],
        "summary": "Certifications issued to the current user across gyms (active only).",
        "operationId": "Profile_MyCertifications",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CertificationDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/profile/{userId}/certifications": {
      "get": {
        "tags": [
          "Profile"
        ],
        "summary": "Public certifications for another user (only IsActive).",
        "operationId": "Profile_UserCertifications",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CertificationDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/profile/certifications/issue": {
      "post": {
        "tags": [
          "Profile"
        ],
        "summary": "Issue a certification to a member of the current gym (GymStaff only).",
        "operationId": "Profile_IssueCertification",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IssueCertificationRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/IssueCertificationRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/IssueCertificationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CertificationDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/profile/stats": {
      "get": {
        "tags": [
          "Profile"
        ],
        "summary": "Climbing stats of the current user for the current gym.",
        "operationId": "Profile_Stats",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserStatsDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/push-tokens": {
      "post": {
        "tags": [
          "PushTokens"
        ],
        "summary": "Register (or refresh) a push token for the current user/device.",
        "operationId": "PushTokens_Register",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterPushTokenRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterPushTokenRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterPushTokenRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PushTokenDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "get": {
        "tags": [
          "PushTokens"
        ],
        "summary": "List the current user's registered push tokens.",
        "operationId": "PushTokens_List",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PushTokenDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/push-tokens/{token}": {
      "delete": {
        "tags": [
          "PushTokens"
        ],
        "summary": "Unregister a push token by value (called on logout / disable notifications).",
        "operationId": "PushTokens_Unregister",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/push-tokens/test": {
      "post": {
        "tags": [
          "PushTokens"
        ],
        "summary": "Send a test push notification to the current user (dev/QA aid).",
        "operationId": "PushTokens_Test",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SendTestPushRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SendTestPushRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SendTestPushRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/routes": {
      "get": {
        "tags": [
          "Routes"
        ],
        "summary": "Paged list of routes in the current gym with optional filters.",
        "operationId": "Routes_List",
        "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"
            }
          },
          {
            "name": "Search",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SkipCount",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "TakeCount",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "sectorId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "wallId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "discipline",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/Discipline"
            }
          },
          {
            "name": "active",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagedResponseOfRouteListItem"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Routes"
        ],
        "operationId": "Routes_Create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RouteRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RouteRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RouteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouteDetailDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/routes/by-qr/{token}": {
      "get": {
        "tags": [
          "Routes"
        ],
        "summary": "Resolve a QR token printed on a wall placard to its Route id + gym scope.\nCross-gym scans are allowed at lookup time; subsequent calls to\n`GET /routes/{id}` still enforce the caller's current gym scope.",
        "operationId": "Routes_GetByQrToken",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouteByQrDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/routes/tags": {
      "get": {
        "tags": [
          "Routes"
        ],
        "summary": "Route detail incl. tags and the current user's ascent if any.",
        "operationId": "Routes_Tags",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/routes/{id}": {
      "get": {
        "tags": [
          "Routes"
        ],
        "operationId": "Routes_Get",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouteDetailDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Routes"
        ],
        "operationId": "Routes_Update",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RouteRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RouteRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RouteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouteDetailDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Routes"
        ],
        "summary": "Soft-delete a route (moves it to trash).",
        "operationId": "Routes_Delete",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/routes/{id}/active": {
      "put": {
        "tags": [
          "Routes"
        ],
        "summary": "Toggle the route's active flag.",
        "operationId": "Routes_SetActive",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BoolFlagRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BoolFlagRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BoolFlagRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/routes/{id}/featured": {
      "put": {
        "tags": [
          "Routes"
        ],
        "summary": "Toggle the route's featured flag.",
        "operationId": "Routes_SetFeatured",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BoolFlagRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BoolFlagRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BoolFlagRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/routes/trash": {
      "get": {
        "tags": [
          "Routes"
        ],
        "summary": "Soft-deleted routes of the current gym.",
        "operationId": "Routes_Trash",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RouteListItem"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/routes/{id}/restore": {
      "post": {
        "tags": [
          "Routes"
        ],
        "summary": "Restore a soft-deleted route.",
        "operationId": "Routes_Restore",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/routes/{id}/media": {
      "get": {
        "tags": [
          "Routes"
        ],
        "summary": "List media attached to a route.",
        "operationId": "Routes_ListMedia",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RouteMediaDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Routes"
        ],
        "summary": "Upload a photo/video for a route (multipart form-data, field name `file`).",
        "operationId": "Routes_UploadMedia",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "allOf": [
                  {
                    "type": "object",
                    "properties": {
                      "file": {
                        "$ref": "#/components/schemas/IFormFile"
                      }
                    }
                  },
                  {
                    "type": "object",
                    "properties": {
                      "caption": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "object",
                    "properties": {
                      "isOfficial": {
                        "type": "boolean"
                      }
                    }
                  }
                ]
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouteMediaDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/routes/{id}/media/{mediaId}": {
      "delete": {
        "tags": [
          "Routes"
        ],
        "summary": "Delete a route media entry and its file.",
        "operationId": "Routes_DeleteMedia",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/routes/{id}/feedback": {
      "get": {
        "tags": [
          "Routes"
        ],
        "summary": "Aggregate feedback for a route, the caller's own entry, and recent comments.",
        "operationId": "Routes_ListFeedback",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouteFeedbackSummaryDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Routes"
        ],
        "summary": "Create or update the caller's feedback for a route. One entry per user.",
        "operationId": "Routes_UpsertFeedback",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpsertRouteFeedbackRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpsertRouteFeedbackRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpsertRouteFeedbackRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouteFeedbackSummaryDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Routes"
        ],
        "summary": "Delete the caller's feedback for a route.",
        "operationId": "Routes_DeleteFeedback",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouteFeedbackSummaryDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/sectors": {
      "get": {
        "tags": [
          "Sectors"
        ],
        "summary": "List sectors of the current gym.",
        "operationId": "Sectors_List",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SectorDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Sectors"
        ],
        "operationId": "Sectors_Create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SectorRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SectorRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SectorRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SectorDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/sectors/{id}": {
      "get": {
        "tags": [
          "Sectors"
        ],
        "operationId": "Sectors_Get",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SectorDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Sectors"
        ],
        "operationId": "Sectors_Update",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SectorRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SectorRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SectorRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SectorDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Sectors"
        ],
        "operationId": "Sectors_Delete",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/settings": {
      "get": {
        "tags": [
          "Settings"
        ],
        "summary": "The current user's full settings (creates defaults on first read).",
        "operationId": "Settings_Get",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserSettingsDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Update the current user's full settings.",
        "operationId": "Settings_Update",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserSettingsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserSettingsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserSettingsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserSettingsDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/settings/locale": {
      "put": {
        "tags": [
          "Settings"
        ],
        "summary": "Set the current user's preferred UI locale (en | it | ar). Persisted in\n    user settings so every client (Gym Console, Coach web, mobile) can honour it.",
        "operationId": "Settings_UpdateLocale",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLocaleRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLocaleRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLocaleRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateLocaleResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/speed-runs/leaderboard": {
      "get": {
        "tags": [
          "SpeedRuns"
        ],
        "summary": "Best valid time per climber in the current gym, fastest first. Optionally\nscoped to a competition and/or a date window.",
        "operationId": "SpeedRuns_Leaderboard",
        "parameters": [
          {
            "name": "competitionId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "take",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32",
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SpeedRunLeaderboardDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/speed-runs/mine": {
      "get": {
        "tags": [
          "SpeedRuns"
        ],
        "summary": "The current user's own runs in the current gym, newest first.",
        "operationId": "SpeedRuns_Mine",
        "parameters": [
          {
            "name": "take",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32",
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SpeedRunDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/spray-walls": {
      "get": {
        "tags": [
          "SprayWalls"
        ],
        "summary": "Spray walls in the current gym.",
        "operationId": "SprayWalls_List",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SprayWallDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "SprayWalls"
        ],
        "summary": "Create a spray wall from a photo (multipart, field `file`). Staff only.",
        "operationId": "SprayWalls_Create",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "allOf": [
                  {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "object",
                    "properties": {
                      "file": {
                        "$ref": "#/components/schemas/IFormFile"
                      }
                    }
                  },
                  {
                    "type": "object",
                    "properties": {
                      "width": {
                        "pattern": "^-?(?:0|[1-9]\\d*)$",
                        "type": [
                          "integer",
                          "string"
                        ],
                        "format": "int32"
                      }
                    }
                  },
                  {
                    "type": "object",
                    "properties": {
                      "height": {
                        "pattern": "^-?(?:0|[1-9]\\d*)$",
                        "type": [
                          "integer",
                          "string"
                        ],
                        "format": "int32"
                      }
                    }
                  }
                ]
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SprayWallDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/spray-walls/{id}": {
      "get": {
        "tags": [
          "SprayWalls"
        ],
        "operationId": "SprayWalls_Get",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SprayWallDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "SprayWalls"
        ],
        "summary": "Soft-delete a spray wall (staff only).",
        "operationId": "SprayWalls_Delete",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/spray-walls/{id}/routes": {
      "get": {
        "tags": [
          "SprayWalls"
        ],
        "operationId": "SprayWalls_Routes",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SprayRouteDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "SprayWalls"
        ],
        "summary": "Create a route on a spray wall (any gym member).",
        "operationId": "SprayWalls_CreateRoute",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveSprayRouteRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveSprayRouteRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SaveSprayRouteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SprayRouteDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/spray-walls/routes/{routeId}": {
      "get": {
        "tags": [
          "SprayWalls"
        ],
        "operationId": "SprayWalls_GetRoute",
        "parameters": [
          {
            "name": "routeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SprayRouteDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "SprayWalls"
        ],
        "summary": "Update a spray route (setter or gym staff).",
        "operationId": "SprayWalls_UpdateRoute",
        "parameters": [
          {
            "name": "routeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveSprayRouteRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveSprayRouteRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SaveSprayRouteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SprayRouteDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "SprayWalls"
        ],
        "operationId": "SprayWalls_DeleteRoute",
        "parameters": [
          {
            "name": "routeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/walls": {
      "get": {
        "tags": [
          "Walls"
        ],
        "summary": "List walls of the current gym, optionally filtered by sector.",
        "operationId": "Walls_List",
        "parameters": [
          {
            "name": "sectorId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/WallDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Walls"
        ],
        "operationId": "Walls_Create",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WallRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/WallRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/WallRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WallDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/walls/{id}": {
      "get": {
        "tags": [
          "Walls"
        ],
        "operationId": "Walls_Get",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WallDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Walls"
        ],
        "operationId": "Walls_Update",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WallRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/WallRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/WallRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WallDto"
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Walls"
        ],
        "summary": "Soft-delete a wall (moves it to trash).",
        "operationId": "Walls_Delete",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/walls/trash": {
      "get": {
        "tags": [
          "Walls"
        ],
        "summary": "Soft-deleted walls of the current gym.",
        "operationId": "Walls_Trash",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/WallDto"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    },
    "/api/walls/{id}/restore": {
      "post": {
        "tags": [
          "Walls"
        ],
        "summary": "Restore a soft-deleted wall.",
        "operationId": "Walls_Restore",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": { }
            }
          },
          "500": {
            "description": "Server error."
          },
          "401": {
            "description": "Unauthorized."
          },
          "403": {
            "description": "Forbidden."
          }
        },
        "security": [
          {
            "Bearer": [ ],
            "Cookie": [ ]
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "AcceptInviteRequest": {
        "required": [
          "token",
          "password",
          "displayName"
        ],
        "type": "object",
        "properties": {
          "token": {
            "type": "string"
          },
          "password": {
            "type": "string"
          },
          "displayName": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "ApproveTimeEntryRequest": {
        "required": [
          "approve"
        ],
        "type": "object",
        "properties": {
          "approve": {
            "type": "boolean"
          }
        }
      },
      "AscentDto": {
        "required": [
          "id",
          "routeId",
          "routeName",
          "routeGrade",
          "userId",
          "userName",
          "type",
          "attempts",
          "topped",
          "climbedAt",
          "notes",
          "rating",
          "perceivedGrade",
          "isOutdoor"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "routeId": {
            "type": "string",
            "format": "uuid"
          },
          "routeName": {
            "type": [
              "null",
              "string"
            ]
          },
          "routeGrade": {
            "type": "string"
          },
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "userName": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/AscentType"
          },
          "attempts": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "topped": {
            "type": "boolean"
          },
          "climbedAt": {
            "type": "string",
            "format": "date"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          },
          "rating": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "perceivedGrade": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "isOutdoor": {
            "type": "boolean"
          }
        }
      },
      "AscentType": {
        "type": "integer"
      },
      "AthleteStatus": {
        "type": "integer"
      },
      "AuditLogDto": {
        "required": [
          "id",
          "userId",
          "userName",
          "entityType",
          "entityId",
          "action",
          "ipAddress",
          "createdAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "userId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "userName": {
            "type": [
              "null",
              "string"
            ]
          },
          "entityType": {
            "type": "string"
          },
          "entityId": {
            "type": "string",
            "format": "uuid"
          },
          "action": {
            "type": "string"
          },
          "ipAddress": {
            "type": [
              "null",
              "string"
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "AuthResponse": {
        "required": [
          "token",
          "expiresAt",
          "user",
          "refreshToken",
          "refreshExpiresAt"
        ],
        "type": "object",
        "properties": {
          "token": {
            "type": "string"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time"
          },
          "user": {
            "$ref": "#/components/schemas/MeResponse"
          },
          "refreshToken": {
            "type": "string"
          },
          "refreshExpiresAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "BoolFlagRequest": {
        "required": [
          "value"
        ],
        "type": "object",
        "properties": {
          "value": {
            "type": "boolean"
          }
        }
      },
      "BroadcastNotificationRequest": {
        "required": [
          "title",
          "body",
          "type",
          "audience",
          "role"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "body": {
            "type": [
              "null",
              "string"
            ]
          },
          "type": {
            "type": "string"
          },
          "audience": {
            "type": "string"
          },
          "role": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/GymRole"
              }
            ]
          }
        }
      },
      "BroadcastNotificationResponse": {
        "required": [
          "sent"
        ],
        "type": "object",
        "properties": {
          "sent": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "CertificationDto": {
        "required": [
          "id",
          "userId",
          "gymId",
          "gymName",
          "type",
          "grade",
          "issuedByUserId",
          "issuedByName",
          "issuedAt",
          "expiresAt",
          "notes",
          "isActive"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "gymId": {
            "type": "string",
            "format": "uuid"
          },
          "gymName": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/CertificationType"
          },
          "grade": {
            "type": [
              "null",
              "string"
            ]
          },
          "issuedByUserId": {
            "type": "string",
            "format": "uuid"
          },
          "issuedByName": {
            "type": "string"
          },
          "issuedAt": {
            "type": "string",
            "format": "date"
          },
          "expiresAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          },
          "isActive": {
            "type": "boolean"
          }
        }
      },
      "CertificationType": {
        "type": "integer"
      },
      "ChatMessageDto": {
        "required": [
          "id",
          "roomId",
          "senderId",
          "senderDisplayName",
          "senderAvatarUrl",
          "content",
          "type",
          "createdAt",
          "editedAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "roomId": {
            "type": "string",
            "format": "uuid"
          },
          "senderId": {
            "type": "string",
            "format": "uuid"
          },
          "senderDisplayName": {
            "type": "string"
          },
          "senderAvatarUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "content": {
            "type": [
              "null",
              "string"
            ]
          },
          "type": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "editedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          }
        }
      },
      "ChatRoomDto": {
        "required": [
          "id",
          "type",
          "otherUserId",
          "otherDisplayName",
          "otherAvatarUrl",
          "lastMessageContent",
          "lastMessageAt",
          "lastMessageSenderId",
          "unreadCount"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "type": {
            "type": "string"
          },
          "otherUserId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "otherDisplayName": {
            "type": [
              "null",
              "string"
            ]
          },
          "otherAvatarUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "lastMessageContent": {
            "type": [
              "null",
              "string"
            ]
          },
          "lastMessageAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "lastMessageSenderId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "unreadCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "ClockInRequest": {
        "required": [
          "shiftId",
          "notes"
        ],
        "type": "object",
        "properties": {
          "shiftId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "ClockOutRequest": {
        "required": [
          "notes"
        ],
        "type": "object",
        "properties": {
          "notes": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "CompAthleteDto": {
        "required": [
          "id",
          "userId",
          "displayName",
          "avatarUrl",
          "categoryId",
          "categoryName",
          "bibNumber",
          "status",
          "registeredAt",
          "checkedInAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "avatarUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "categoryId": {
            "type": "string",
            "format": "uuid"
          },
          "categoryName": {
            "type": "string"
          },
          "bibNumber": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "status": {
            "$ref": "#/components/schemas/AthleteStatus"
          },
          "registeredAt": {
            "type": "string",
            "format": "date-time"
          },
          "checkedInAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          }
        }
      },
      "CompAthleteRequest": {
        "required": [
          "userId",
          "categoryId",
          "bibNumber"
        ],
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "categoryId": {
            "type": "string",
            "format": "uuid"
          },
          "bibNumber": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "CompAthleteUpdateRequest": {
        "required": [
          "status",
          "bibNumber",
          "checkIn"
        ],
        "type": "object",
        "properties": {
          "status": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/AthleteStatus"
              }
            ]
          },
          "bibNumber": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "checkIn": {
            "type": [
              "null",
              "boolean"
            ]
          }
        }
      },
      "CompAttemptDto": {
        "required": [
          "id",
          "phaseId",
          "athleteId",
          "compRouteId",
          "topped",
          "zone",
          "attemptsToTop",
          "attemptsToZone",
          "timeSeconds",
          "status",
          "completedAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "phaseId": {
            "type": "string",
            "format": "uuid"
          },
          "athleteId": {
            "type": "string",
            "format": "uuid"
          },
          "compRouteId": {
            "type": "string",
            "format": "uuid"
          },
          "topped": {
            "type": "boolean"
          },
          "zone": {
            "type": "boolean"
          },
          "attemptsToTop": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "attemptsToZone": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "timeSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "status": {
            "type": "string"
          },
          "completedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          }
        }
      },
      "CompAttemptRequest": {
        "required": [
          "phaseId",
          "athleteId",
          "compRouteId",
          "topped",
          "zone",
          "attemptsToTop",
          "attemptsToZone",
          "timeSeconds",
          "judgeNotes"
        ],
        "type": "object",
        "properties": {
          "phaseId": {
            "type": "string",
            "format": "uuid"
          },
          "athleteId": {
            "type": "string",
            "format": "uuid"
          },
          "compRouteId": {
            "type": "string",
            "format": "uuid"
          },
          "topped": {
            "type": "boolean"
          },
          "zone": {
            "type": "boolean"
          },
          "attemptsToTop": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "attemptsToZone": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "timeSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "judgeNotes": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "CompCategoryDto": {
        "required": [
          "id",
          "name",
          "gender",
          "minAge",
          "maxAge",
          "minGrade",
          "maxGrade",
          "maxParticipants",
          "athleteCount"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "gender": {
            "type": [
              "null",
              "string"
            ]
          },
          "minAge": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "maxAge": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "minGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "maxGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "maxParticipants": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "athleteCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "CompCategoryRequest": {
        "required": [
          "name",
          "gender",
          "minAge",
          "maxAge",
          "minGrade",
          "maxGrade",
          "maxParticipants"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "gender": {
            "type": [
              "null",
              "string"
            ]
          },
          "minAge": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "maxAge": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "minGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "maxGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "maxParticipants": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "CompetitionDto": {
        "required": [
          "id",
          "name",
          "description",
          "type",
          "format",
          "startDate",
          "endDate",
          "registrationDeadline",
          "maxParticipants",
          "entryFee",
          "currency",
          "status",
          "isPublic",
          "bannerUrl",
          "athleteCount"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "type": {
            "$ref": "#/components/schemas/Discipline"
          },
          "format": {
            "$ref": "#/components/schemas/CompetitionFormat"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "registrationDeadline": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "maxParticipants": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "entryFee": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "currency": {
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/CompetitionStatus"
          },
          "isPublic": {
            "type": "boolean"
          },
          "bannerUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "athleteCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "CompetitionFormat": {
        "type": "integer"
      },
      "CompetitionRequest": {
        "required": [
          "name",
          "description",
          "type",
          "format",
          "startDate",
          "endDate",
          "registrationDeadline",
          "maxParticipants",
          "entryFee",
          "currency",
          "status",
          "isPublic"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "type": {
            "$ref": "#/components/schemas/Discipline"
          },
          "format": {
            "$ref": "#/components/schemas/CompetitionFormat"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "registrationDeadline": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "maxParticipants": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "entryFee": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "currency": {
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/CompetitionStatus"
          },
          "isPublic": {
            "type": "boolean"
          }
        }
      },
      "CompetitionStatus": {
        "type": "integer"
      },
      "CompPhaseDto": {
        "required": [
          "id",
          "name",
          "type",
          "phaseOrder",
          "startTime",
          "endTime",
          "routesCount",
          "topNAdvance",
          "status",
          "routes"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/PhaseType"
          },
          "phaseOrder": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "startTime": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "endTime": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "routesCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "topNAdvance": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "status": {
            "type": "string"
          },
          "routes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompRouteDto"
            }
          }
        }
      },
      "CompPhaseRequest": {
        "required": [
          "name",
          "type",
          "phaseOrder",
          "startTime",
          "endTime",
          "routesCount",
          "topNAdvance"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/PhaseType"
          },
          "phaseOrder": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "startTime": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "endTime": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "routesCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "topNAdvance": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "CompPhaseStatusRequest": {
        "required": [
          "status"
        ],
        "type": "object",
        "properties": {
          "status": {
            "type": "string"
          }
        }
      },
      "CompRankingDto": {
        "required": [
          "athleteId",
          "displayName",
          "bibNumber",
          "categoryId",
          "categoryName",
          "rank",
          "tops",
          "zones",
          "attemptsTops",
          "attemptsZones",
          "totalPoints",
          "bestTime",
          "advances"
        ],
        "type": "object",
        "properties": {
          "athleteId": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "bibNumber": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "categoryId": {
            "type": "string",
            "format": "uuid"
          },
          "categoryName": {
            "type": "string"
          },
          "rank": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "tops": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "zones": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "attemptsTops": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "attemptsZones": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "totalPoints": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "bestTime": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "advances": {
            "type": "boolean"
          }
        }
      },
      "CompRouteDetailDto": {
        "required": [
          "id",
          "routeNumber",
          "routeId",
          "routeName",
          "routeGrade",
          "points",
          "timeLimitSeconds",
          "judgingCriteria"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "routeNumber": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "routeId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "routeName": {
            "type": [
              "null",
              "string"
            ]
          },
          "routeGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "points": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "timeLimitSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "judgingCriteria": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "CompRouteDto": {
        "required": [
          "id",
          "routeNumber",
          "routeId",
          "points",
          "timeLimitSeconds"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "routeNumber": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "routeId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "points": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "timeLimitSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "CreateGymRequest": {
        "required": [
          "name",
          "slug",
          "description",
          "address",
          "city",
          "country",
          "phone",
          "email",
          "website",
          "latitude",
          "longitude"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "address": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "phone": {
            "type": [
              "null",
              "string"
            ]
          },
          "email": {
            "type": [
              "null",
              "string"
            ]
          },
          "website": {
            "type": [
              "null",
              "string"
            ]
          },
          "latitude": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "longitude": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "timezone": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "CreateIsolationZoneRequest": {
        "required": [
          "phaseId",
          "name",
          "capacity"
        ],
        "type": "object",
        "properties": {
          "phaseId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "capacity": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "CsrfResponse": {
        "required": [
          "token",
          "headerName"
        ],
        "type": "object",
        "properties": {
          "token": {
            "type": "string"
          },
          "headerName": {
            "type": "string"
          }
        }
      },
      "CustomRoleDto": {
        "required": [
          "id",
          "name",
          "description",
          "permissions"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "permissions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "CustomRoleRequest": {
        "required": [
          "name",
          "description",
          "permissions"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "permissions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "DashboardActivityDto": {
        "required": [
          "userName",
          "initials",
          "kind",
          "routeName",
          "routeGrade",
          "wallName",
          "when"
        ],
        "type": "object",
        "properties": {
          "userName": {
            "type": "string"
          },
          "initials": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "routeName": {
            "type": [
              "null",
              "string"
            ]
          },
          "routeGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "wallName": {
            "type": [
              "null",
              "string"
            ]
          },
          "when": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "DashboardDto": {
        "required": [
          "gymName",
          "liveCount",
          "activeMembers",
          "routesSet30d",
          "totalRoutes",
          "activeCompetitions",
          "metrics",
          "activity",
          "stripSoon"
        ],
        "type": "object",
        "properties": {
          "gymName": {
            "type": "string"
          },
          "liveCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "activeMembers": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "routesSet30d": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "totalRoutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "activeCompetitions": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "metrics": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DashboardMetricDto"
            }
          },
          "activity": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DashboardActivityDto"
            }
          },
          "stripSoon": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StripSoonDto"
            }
          }
        }
      },
      "DashboardMetricDto": {
        "required": [
          "key",
          "value",
          "delta",
          "direction"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "value": {
            "type": "string"
          },
          "delta": {
            "type": [
              "null",
              "string"
            ]
          },
          "direction": {
            "type": "string"
          }
        }
      },
      "DeviceApiKeyRequest": {
        "required": [
          "name",
          "expiresAt"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": [
              "null",
              "string"
            ]
          },
          "expiresAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          }
        }
      },
      "DeviceApiKeyResponse": {
        "required": [
          "hardwareId",
          "apiKey",
          "expiresAt"
        ],
        "type": "object",
        "properties": {
          "hardwareId": {
            "type": "string"
          },
          "apiKey": {
            "type": "string"
          },
          "expiresAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          }
        }
      },
      "DeviceCommandResponse": {
        "required": [
          "status",
          "queuedAt"
        ],
        "type": "object",
        "properties": {
          "status": {
            "type": "string"
          },
          "queuedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "DeviceDto": {
        "required": [
          "id",
          "deviceId",
          "name",
          "type",
          "status",
          "firmwareVersion",
          "sectorId",
          "sectorName",
          "wallId",
          "wallName",
          "lastSeenAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "deviceId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/DeviceType"
          },
          "status": {
            "$ref": "#/components/schemas/DeviceStatus"
          },
          "firmwareVersion": {
            "type": [
              "null",
              "string"
            ]
          },
          "sectorId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "sectorName": {
            "type": [
              "null",
              "string"
            ]
          },
          "wallId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "wallName": {
            "type": [
              "null",
              "string"
            ]
          },
          "lastSeenAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          }
        }
      },
      "DeviceFirmwareRequest": {
        "required": [
          "version"
        ],
        "type": "object",
        "properties": {
          "version": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "DeviceRequest": {
        "required": [
          "deviceId",
          "name",
          "type",
          "status",
          "firmwareVersion",
          "sectorId",
          "wallId"
        ],
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/DeviceType"
          },
          "status": {
            "$ref": "#/components/schemas/DeviceStatus"
          },
          "firmwareVersion": {
            "type": [
              "null",
              "string"
            ]
          },
          "sectorId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "wallId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          }
        }
      },
      "DeviceStatus": {
        "type": "integer"
      },
      "DeviceType": {
        "type": "integer"
      },
      "Discipline": {
        "type": "integer"
      },
      "EmploymentType": {
        "type": "integer"
      },
      "EnterIsolationRequest": {
        "required": [
          "athleteId"
        ],
        "type": "object",
        "properties": {
          "athleteId": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "FollowStatusDto": {
        "required": [
          "isFollowing",
          "followsMe",
          "followersCount",
          "followingCount"
        ],
        "type": "object",
        "properties": {
          "isFollowing": {
            "type": "boolean"
          },
          "followsMe": {
            "type": "boolean"
          },
          "followersCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "followingCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        },
        "description": "My relationship to a target user plus their follower/following totals."
      },
      "FollowUserDto": {
        "required": [
          "userId",
          "displayName",
          "avatarUrl",
          "city",
          "country",
          "isFollowedByMe"
        ],
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "avatarUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "city": {
            "type": [
              "null",
              "string"
            ]
          },
          "country": {
            "type": [
              "null",
              "string"
            ]
          },
          "isFollowedByMe": {
            "type": "boolean"
          }
        },
        "description": "A user in a followers/following list, with my relationship to them."
      },
      "ForgotPasswordRequest": {
        "required": [
          "email"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          }
        }
      },
      "ForgotPasswordResponse": {
        "required": [
          "sent",
          "devToken"
        ],
        "type": "object",
        "properties": {
          "sent": {
            "type": "boolean"
          },
          "devToken": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "GoogleSignInRequest": {
        "required": [
          "idToken"
        ],
        "type": "object",
        "properties": {
          "idToken": {
            "type": "string"
          }
        },
        "description": "Set the user's preferred UI locale (persisted in user settings, shared by all clients)."
      },
      "GradeSystem": {
        "type": "integer"
      },
      "GymDto": {
        "required": [
          "id",
          "name",
          "slug",
          "description",
          "logoUrl",
          "coverUrl",
          "address",
          "city",
          "country",
          "phone",
          "email",
          "website",
          "latitude",
          "longitude",
          "isActive",
          "memberCount",
          "routeCount"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "logoUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "coverUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "address": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "phone": {
            "type": [
              "null",
              "string"
            ]
          },
          "email": {
            "type": [
              "null",
              "string"
            ]
          },
          "website": {
            "type": [
              "null",
              "string"
            ]
          },
          "latitude": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "longitude": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "isActive": {
            "type": "boolean"
          },
          "memberCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "routeCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "GymRole": {
        "type": "integer"
      },
      "IFormFile": {
        "type": "string",
        "format": "binary"
      },
      "InviteMemberRequest": {
        "required": [
          "email",
          "displayName"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "role": {
            "$ref": "#/components/schemas/GymRole"
          },
          "subscriptionId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "expiresAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          }
        }
      },
      "InviteOperatorRequest": {
        "required": [
          "email",
          "displayName",
          "role",
          "employeeCode",
          "hireDate",
          "employmentType",
          "weeklyHoursTarget"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "role": {
            "$ref": "#/components/schemas/GymRole"
          },
          "employeeCode": {
            "type": [
              "null",
              "string"
            ]
          },
          "hireDate": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "employmentType": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/EmploymentType"
              }
            ]
          },
          "weeklyHoursTarget": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "InviteResponse": {
        "required": [
          "membershipId",
          "userId",
          "email",
          "displayName",
          "role",
          "inviteToken",
          "inviteTokenExpiresAt"
        ],
        "type": "object",
        "properties": {
          "membershipId": {
            "type": "string",
            "format": "uuid"
          },
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "email": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "role": {
            "$ref": "#/components/schemas/GymRole"
          },
          "inviteToken": {
            "type": "string"
          },
          "inviteTokenExpiresAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "IsolationAthleteDto": {
        "required": [
          "id",
          "athleteId",
          "displayName",
          "bibNumber",
          "enteredAt",
          "calledAt",
          "exitedAt",
          "callOrder"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "athleteId": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "bibNumber": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "enteredAt": {
            "type": "string",
            "format": "date-time"
          },
          "calledAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "exitedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "callOrder": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "IsolationZoneDto": {
        "required": [
          "id",
          "phaseId",
          "name",
          "capacity",
          "status",
          "openedAt",
          "closedAt",
          "athletes"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "phaseId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "capacity": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "status": {
            "type": "string"
          },
          "openedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "closedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "athletes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/IsolationAthleteDto"
            }
          }
        }
      },
      "IsolationZoneStatusRequest": {
        "required": [
          "status"
        ],
        "type": "object",
        "properties": {
          "status": {
            "type": "string"
          }
        }
      },
      "IssueCertificationRequest": {
        "required": [
          "userId",
          "type",
          "grade",
          "expiresAt",
          "notes"
        ],
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "type": {
            "$ref": "#/components/schemas/CertificationType"
          },
          "grade": {
            "type": [
              "null",
              "string"
            ]
          },
          "expiresAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "LoginRequest": {
        "required": [
          "email",
          "password"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "password": {
            "type": "string"
          }
        }
      },
      "LoginResponse": {
        "required": [
          "requires2fa",
          "twoFactorToken",
          "auth"
        ],
        "type": "object",
        "properties": {
          "requires2fa": {
            "type": "boolean"
          },
          "twoFactorToken": {
            "type": [
              "null",
              "string"
            ]
          },
          "auth": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/AuthResponse"
              }
            ]
          }
        },
        "description": "Login result. When `Requires2fa` is true the credentials were valid but the\n    account has TOTP enabled: complete the sign-in via `POST /auth/2fa/challenge` with\n    `TwoFactorToken` and a code. Otherwise `Auth` carries the issued tokens."
      },
      "MaintenanceEventDto": {
        "required": [
          "id",
          "gymId",
          "title",
          "notes",
          "kind",
          "status",
          "startAt",
          "endAt",
          "wallId",
          "wallName",
          "deviceId",
          "deviceName"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "gymId": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          },
          "kind": {
            "$ref": "#/components/schemas/MaintenanceKind"
          },
          "status": {
            "$ref": "#/components/schemas/MaintenanceStatus"
          },
          "startAt": {
            "type": "string",
            "format": "date-time"
          },
          "endAt": {
            "type": "string",
            "format": "date-time"
          },
          "wallId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "wallName": {
            "type": [
              "null",
              "string"
            ]
          },
          "deviceId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "deviceName": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "MaintenanceEventRequest": {
        "required": [
          "title",
          "notes",
          "kind",
          "status",
          "startAt",
          "endAt",
          "wallId",
          "deviceId"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          },
          "kind": {
            "$ref": "#/components/schemas/MaintenanceKind"
          },
          "status": {
            "$ref": "#/components/schemas/MaintenanceStatus"
          },
          "startAt": {
            "type": "string",
            "format": "date-time"
          },
          "endAt": {
            "type": "string",
            "format": "date-time"
          },
          "wallId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "deviceId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          }
        }
      },
      "MaintenanceKind": {
        "type": "integer"
      },
      "MaintenanceStatus": {
        "type": "integer"
      },
      "MatchCandidateDto": {
        "required": [
          "userId",
          "displayName",
          "avatarUrl",
          "city",
          "country",
          "gymName",
          "preferredDiscipline",
          "maxBoulderGrade",
          "maxLeadGrade",
          "bio",
          "distanceKm"
        ],
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "avatarUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "city": {
            "type": [
              "null",
              "string"
            ]
          },
          "country": {
            "type": [
              "null",
              "string"
            ]
          },
          "gymName": {
            "type": [
              "null",
              "string"
            ]
          },
          "preferredDiscipline": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Discipline"
              }
            ]
          },
          "maxBoulderGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "maxLeadGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "bio": {
            "type": [
              "null",
              "string"
            ]
          },
          "distanceKm": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          }
        },
        "description": "A swipe candidate in the discovery deck."
      },
      "MatchDto": {
        "required": [
          "id",
          "otherUserId",
          "otherDisplayName",
          "otherAvatarUrl",
          "status",
          "matchedAt",
          "chatRoomId"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "otherUserId": {
            "type": "string",
            "format": "uuid"
          },
          "otherDisplayName": {
            "type": "string"
          },
          "otherAvatarUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "status": {
            "type": "string"
          },
          "matchedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "chatRoomId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          }
        },
        "description": "A confirmed or pending match with the other climber."
      },
      "MatchPreferencesDto": {
        "required": [
          "lookingFor",
          "skillRange",
          "maxDistanceKm",
          "bio",
          "isActive"
        ],
        "type": "object",
        "properties": {
          "lookingFor": {
            "type": "string"
          },
          "skillRange": {
            "type": "string"
          },
          "maxDistanceKm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "bio": {
            "type": [
              "null",
              "string"
            ]
          },
          "isActive": {
            "type": "boolean"
          }
        }
      },
      "MemberDto": {
        "required": [
          "membershipId",
          "userId",
          "displayName",
          "email",
          "avatarUrl",
          "role",
          "subscriptionName",
          "joinedAt",
          "expiresAt",
          "isActive"
        ],
        "type": "object",
        "properties": {
          "membershipId": {
            "type": "string",
            "format": "uuid"
          },
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "avatarUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "role": {
            "$ref": "#/components/schemas/GymRole"
          },
          "subscriptionName": {
            "type": [
              "null",
              "string"
            ]
          },
          "joinedAt": {
            "type": "string",
            "format": "date"
          },
          "expiresAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "isActive": {
            "type": "boolean"
          },
          "customRoleId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "customRoleName": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "MembershipPermissionsDto": {
        "required": [
          "membershipId",
          "role",
          "defaults",
          "add",
          "remove",
          "effective"
        ],
        "type": "object",
        "properties": {
          "membershipId": {
            "type": "string",
            "format": "uuid"
          },
          "role": {
            "$ref": "#/components/schemas/GymRole"
          },
          "defaults": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "add": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "remove": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "effective": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "customRoleId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "customRoleName": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "MembershipSummaryDto": {
        "required": [
          "membershipId",
          "gymId",
          "gymName",
          "gymLogoUrl",
          "role",
          "isActive",
          "joinedAt"
        ],
        "type": "object",
        "properties": {
          "membershipId": {
            "type": "string",
            "format": "uuid"
          },
          "gymId": {
            "type": "string",
            "format": "uuid"
          },
          "gymName": {
            "type": "string"
          },
          "gymLogoUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "role": {
            "$ref": "#/components/schemas/GymRole"
          },
          "isActive": {
            "type": "boolean"
          },
          "joinedAt": {
            "type": "string",
            "format": "date"
          }
        }
      },
      "MeResponse": {
        "required": [
          "id",
          "email",
          "displayName",
          "avatarUrl",
          "gymId",
          "gymName",
          "gymRole"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "email": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "avatarUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "gymId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "gymName": {
            "type": [
              "null",
              "string"
            ]
          },
          "gymRole": {
            "type": [
              "null",
              "string"
            ]
          },
          "preferredLocale": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "NotificationDto": {
        "required": [
          "id",
          "type",
          "title",
          "body",
          "isRead",
          "createdAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "body": {
            "type": [
              "null",
              "string"
            ]
          },
          "isRead": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "OperatorDto": {
        "required": [
          "membershipId",
          "userId",
          "displayName",
          "email",
          "avatarUrl",
          "role",
          "employeeCode",
          "hireDate",
          "employmentType",
          "weeklyHoursTarget",
          "lastSeenAt",
          "joinedAt",
          "isActive",
          "isInviteAccepted",
          "inviteTokenExpiresAt"
        ],
        "type": "object",
        "properties": {
          "membershipId": {
            "type": "string",
            "format": "uuid"
          },
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "avatarUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "role": {
            "$ref": "#/components/schemas/GymRole"
          },
          "employeeCode": {
            "type": [
              "null",
              "string"
            ]
          },
          "hireDate": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "employmentType": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/EmploymentType"
              }
            ]
          },
          "weeklyHoursTarget": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "lastSeenAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "joinedAt": {
            "type": "string",
            "format": "date"
          },
          "isActive": {
            "type": "boolean"
          },
          "isInviteAccepted": {
            "type": "boolean"
          },
          "inviteTokenExpiresAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "customRoleId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "customRoleName": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "PagedResponseOfAuditLogDto": {
        "required": [
          "items",
          "page",
          "pageSize",
          "total"
        ],
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AuditLogDto"
            }
          },
          "page": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "pageSize": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "total": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "totalPages": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        },
        "description": "Uniform JSON envelope for paginated list endpoints."
      },
      "PagedResponseOfMemberDto": {
        "required": [
          "items",
          "page",
          "pageSize",
          "total"
        ],
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MemberDto"
            }
          },
          "page": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "pageSize": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "total": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "totalPages": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        },
        "description": "Uniform JSON envelope for paginated list endpoints."
      },
      "PagedResponseOfOperatorDto": {
        "required": [
          "items",
          "page",
          "pageSize",
          "total"
        ],
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OperatorDto"
            }
          },
          "page": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "pageSize": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "total": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "totalPages": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        },
        "description": "Uniform JSON envelope for paginated list endpoints."
      },
      "PagedResponseOfRouteListItem": {
        "required": [
          "items",
          "page",
          "pageSize",
          "total"
        ],
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RouteListItem"
            }
          },
          "page": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "pageSize": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "total": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "totalPages": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        },
        "description": "Uniform JSON envelope for paginated list endpoints."
      },
      "PartnerCardDto": {
        "required": [
          "userId",
          "displayName",
          "avatarUrl",
          "city",
          "country",
          "gymName",
          "preferredDiscipline",
          "partnerGradeMin",
          "partnerGradeMax",
          "maxBoulderGrade",
          "maxLeadGrade",
          "distanceKm"
        ],
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "avatarUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "city": {
            "type": [
              "null",
              "string"
            ]
          },
          "country": {
            "type": [
              "null",
              "string"
            ]
          },
          "gymName": {
            "type": [
              "null",
              "string"
            ]
          },
          "preferredDiscipline": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Discipline"
              }
            ]
          },
          "partnerGradeMin": {
            "type": [
              "null",
              "string"
            ]
          },
          "partnerGradeMax": {
            "type": [
              "null",
              "string"
            ]
          },
          "maxBoulderGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "maxLeadGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "distanceKm": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          }
        }
      },
      "PermissionDto": {
        "required": [
          "key",
          "category",
          "label"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "label": {
            "type": "string"
          }
        }
      },
      "PhaseType": {
        "type": "integer"
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": [
              "null",
              "string"
            ]
          },
          "title": {
            "type": [
              "null",
              "string"
            ]
          },
          "status": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "detail": {
            "type": [
              "null",
              "string"
            ]
          },
          "instance": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "ProfileDto": {
        "required": [
          "userId",
          "displayName",
          "email",
          "avatarUrl",
          "bio",
          "weightKg",
          "heightCm",
          "climbingSince",
          "preferredDiscipline",
          "maxBoulderGrade",
          "maxLeadGrade",
          "city",
          "country",
          "isPublic"
        ],
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "avatarUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "bio": {
            "type": [
              "null",
              "string"
            ]
          },
          "weightKg": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "heightCm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "climbingSince": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "preferredDiscipline": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Discipline"
              }
            ]
          },
          "maxBoulderGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "maxLeadGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "city": {
            "type": [
              "null",
              "string"
            ]
          },
          "country": {
            "type": [
              "null",
              "string"
            ]
          },
          "isPublic": {
            "type": "boolean"
          }
        }
      },
      "ProtocolStepDto": {
        "required": [
          "name",
          "workSec",
          "restSec",
          "reps",
          "sets",
          "grip",
          "edgeMm",
          "notes"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "workSec": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "restSec": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "reps": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "sets": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "grip": {
            "type": [
              "null",
              "string"
            ]
          },
          "edgeMm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "PushCampaignDto": {
        "required": [
          "id",
          "title",
          "body",
          "audience",
          "role",
          "status",
          "createdAt",
          "sentAt",
          "sentCount"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string"
          },
          "body": {
            "type": [
              "null",
              "string"
            ]
          },
          "audience": {
            "type": "string"
          },
          "role": {
            "type": [
              "null",
              "string"
            ]
          },
          "status": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "sentAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "sentCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "PushCampaignRequest": {
        "required": [
          "title",
          "body",
          "audience",
          "role"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "body": {
            "type": [
              "null",
              "string"
            ]
          },
          "audience": {
            "type": "string"
          },
          "role": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "PushTokenDto": {
        "required": [
          "id",
          "platform",
          "deviceName",
          "appVersion",
          "isActive",
          "lastUsedAt",
          "createdAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "platform": {
            "type": "string"
          },
          "deviceName": {
            "type": [
              "null",
              "string"
            ]
          },
          "appVersion": {
            "type": [
              "null",
              "string"
            ]
          },
          "isActive": {
            "type": "boolean"
          },
          "lastUsedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "RefreshRequest": {
        "required": [
          "refreshToken"
        ],
        "type": "object",
        "properties": {
          "refreshToken": {
            "type": [
              "null",
              "string"
            ]
          }
        },
        "description": "Exchange a refresh token for a fresh access token (and a rotated refresh token).\n    Browser clients may omit the body and rely on the HttpOnly refresh cookie."
      },
      "RegisterPushTokenRequest": {
        "required": [
          "token",
          "platform",
          "deviceName",
          "appVersion"
        ],
        "type": "object",
        "properties": {
          "token": {
            "type": "string"
          },
          "platform": {
            "type": "string"
          },
          "deviceName": {
            "type": [
              "null",
              "string"
            ]
          },
          "appVersion": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "RegisterRequest": {
        "required": [
          "email",
          "password",
          "displayName"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "password": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          }
        }
      },
      "RegisterResponse": {
        "required": [
          "requiresVerification",
          "auth",
          "devVerificationToken"
        ],
        "type": "object",
        "properties": {
          "requiresVerification": {
            "type": "boolean"
          },
          "auth": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/AuthResponse"
              }
            ]
          },
          "devVerificationToken": {
            "type": [
              "null",
              "string"
            ]
          }
        },
        "description": "Result of registration. When `RequiresVerification` is true the account exists\n    but cannot sign in until the email is confirmed, so `Auth` is null. Otherwise the user is\n    logged in immediately. `DevVerificationToken` is only populated in Development without SMTP."
      },
      "ResendVerificationRequest": {
        "required": [
          "email"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          }
        }
      },
      "ResendVerificationResponse": {
        "required": [
          "sent",
          "devToken"
        ],
        "type": "object",
        "properties": {
          "sent": {
            "type": "boolean"
          },
          "devToken": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "ResetPasswordRequest": {
        "required": [
          "email",
          "token",
          "newPassword"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "token": {
            "type": "string"
          },
          "newPassword": {
            "type": "string"
          }
        }
      },
      "RoleCatalogResponse": {
        "required": [
          "roles",
          "permissions"
        ],
        "type": "object",
        "properties": {
          "roles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RoleDto"
            }
          },
          "permissions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PermissionDto"
            }
          }
        }
      },
      "RoleDto": {
        "required": [
          "role",
          "name",
          "defaultPermissions"
        ],
        "type": "object",
        "properties": {
          "role": {
            "$ref": "#/components/schemas/GymRole"
          },
          "name": {
            "type": "string"
          },
          "defaultPermissions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "RouteByQrDto": {
        "required": [
          "id",
          "gymId",
          "gymName",
          "name",
          "grade",
          "gradeSystem",
          "sectorName",
          "wallName",
          "isActive"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "gymId": {
            "type": "string",
            "format": "uuid"
          },
          "gymName": {
            "type": "string"
          },
          "name": {
            "type": [
              "null",
              "string"
            ]
          },
          "grade": {
            "type": "string"
          },
          "gradeSystem": {
            "$ref": "#/components/schemas/GradeSystem"
          },
          "sectorName": {
            "type": "string"
          },
          "wallName": {
            "type": [
              "null",
              "string"
            ]
          },
          "isActive": {
            "type": "boolean"
          }
        },
        "description": "Minimal route info resolved from a QR token."
      },
      "RouteDetailDto": {
        "required": [
          "id",
          "name",
          "grade",
          "gradeSystem",
          "discipline",
          "color",
          "description",
          "setterNotes",
          "sectorId",
          "sectorName",
          "wallId",
          "wallName",
          "setterId",
          "setterName",
          "setAt",
          "removedAt",
          "plannedStripAt",
          "expectedAttempts",
          "isActive",
          "isFeatured",
          "ascentCount",
          "averageRating",
          "averageGradeOpinion",
          "tags",
          "myAscent"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": [
              "null",
              "string"
            ]
          },
          "grade": {
            "type": "string"
          },
          "gradeSystem": {
            "$ref": "#/components/schemas/GradeSystem"
          },
          "discipline": {
            "$ref": "#/components/schemas/Discipline"
          },
          "color": {
            "type": [
              "null",
              "string"
            ]
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "setterNotes": {
            "type": [
              "null",
              "string"
            ]
          },
          "sectorId": {
            "type": "string",
            "format": "uuid"
          },
          "sectorName": {
            "type": "string"
          },
          "wallId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "wallName": {
            "type": [
              "null",
              "string"
            ]
          },
          "setterId": {
            "type": "string",
            "format": "uuid"
          },
          "setterName": {
            "type": "string"
          },
          "setAt": {
            "type": "string",
            "format": "date"
          },
          "removedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "plannedStripAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "expectedAttempts": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "isActive": {
            "type": "boolean"
          },
          "isFeatured": {
            "type": "boolean"
          },
          "ascentCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "averageRating": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "averageGradeOpinion": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "myAscent": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/AscentDto"
              }
            ]
          }
        }
      },
      "RouteFeedbackDto": {
        "required": [
          "id",
          "userId",
          "userName",
          "userAvatarUrl",
          "gradeOpinion",
          "qualityRating",
          "comment",
          "createdAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "userName": {
            "type": "string"
          },
          "userAvatarUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "gradeOpinion": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "qualityRating": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "comment": {
            "type": [
              "null",
              "string"
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "RouteFeedbackSummaryDto": {
        "required": [
          "averageRating",
          "averageGradeOpinion",
          "count",
          "myFeedback",
          "comments"
        ],
        "type": "object",
        "properties": {
          "averageRating": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "averageGradeOpinion": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "count": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "myFeedback": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/RouteFeedbackDto"
              }
            ]
          },
          "comments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RouteFeedbackDto"
            }
          }
        },
        "description": "Aggregate feedback for a route plus the caller's own entry."
      },
      "RouteListItem": {
        "required": [
          "id",
          "name",
          "grade",
          "gradeSystem",
          "discipline",
          "color",
          "sectorId",
          "sectorName",
          "wallId",
          "wallName",
          "setterName",
          "setAt",
          "plannedStripAt",
          "isActive",
          "isFeatured",
          "ascentCount",
          "averageRating"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": [
              "null",
              "string"
            ]
          },
          "grade": {
            "type": "string"
          },
          "gradeSystem": {
            "$ref": "#/components/schemas/GradeSystem"
          },
          "discipline": {
            "$ref": "#/components/schemas/Discipline"
          },
          "color": {
            "type": [
              "null",
              "string"
            ]
          },
          "sectorId": {
            "type": "string",
            "format": "uuid"
          },
          "sectorName": {
            "type": "string"
          },
          "wallId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "wallName": {
            "type": [
              "null",
              "string"
            ]
          },
          "setterName": {
            "type": "string"
          },
          "setAt": {
            "type": "string",
            "format": "date"
          },
          "plannedStripAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "isActive": {
            "type": "boolean"
          },
          "isFeatured": {
            "type": "boolean"
          },
          "ascentCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "averageRating": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          }
        }
      },
      "RouteMediaDto": {
        "required": [
          "id",
          "routeId",
          "uploadedById",
          "uploadedByName",
          "type",
          "url",
          "thumbnailUrl",
          "caption",
          "isOfficial",
          "sortOrder",
          "createdAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "routeId": {
            "type": "string",
            "format": "uuid"
          },
          "uploadedById": {
            "type": "string",
            "format": "uuid"
          },
          "uploadedByName": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "thumbnailUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "caption": {
            "type": [
              "null",
              "string"
            ]
          },
          "isOfficial": {
            "type": "boolean"
          },
          "sortOrder": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "RouteRequest": {
        "required": [
          "name",
          "grade",
          "gradeSystem",
          "discipline",
          "color",
          "description",
          "setterNotes",
          "sectorId",
          "wallId",
          "setterId",
          "setAt",
          "plannedStripAt",
          "expectedAttempts",
          "isActive",
          "isFeatured",
          "tags"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": [
              "null",
              "string"
            ]
          },
          "grade": {
            "type": "string"
          },
          "gradeSystem": {
            "$ref": "#/components/schemas/GradeSystem"
          },
          "discipline": {
            "$ref": "#/components/schemas/Discipline"
          },
          "color": {
            "type": [
              "null",
              "string"
            ]
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "setterNotes": {
            "type": [
              "null",
              "string"
            ]
          },
          "sectorId": {
            "type": "string",
            "format": "uuid"
          },
          "wallId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "setterId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "setAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "plannedStripAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "expectedAttempts": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "isActive": {
            "type": "boolean"
          },
          "isFeatured": {
            "type": "boolean"
          },
          "tags": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          }
        }
      },
      "SaveSprayRouteRequest": {
        "required": [
          "name",
          "grade",
          "gradeSystem",
          "color",
          "description",
          "holds"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "grade": {
            "type": "string"
          },
          "gradeSystem": {
            "$ref": "#/components/schemas/GradeSystem"
          },
          "color": {
            "type": [
              "null",
              "string"
            ]
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "holds": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/SprayHoldDto"
            }
          }
        }
      },
      "SaveTrainingProtocolRequest": {
        "required": [
          "boardType",
          "name",
          "description",
          "level",
          "durationMinutes",
          "steps"
        ],
        "type": "object",
        "properties": {
          "boardType": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "level": {
            "type": "string"
          },
          "durationMinutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "steps": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/ProtocolStepDto"
            }
          }
        }
      },
      "SectorDto": {
        "required": [
          "id",
          "name",
          "description",
          "type",
          "color",
          "sortOrder",
          "isActive",
          "wallCount",
          "routeCount"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "type": {
            "$ref": "#/components/schemas/SectorType"
          },
          "color": {
            "type": [
              "null",
              "string"
            ]
          },
          "sortOrder": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "isActive": {
            "type": "boolean"
          },
          "wallCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "routeCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "SectorRequest": {
        "required": [
          "name",
          "description",
          "type",
          "color",
          "sortOrder",
          "isActive"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "type": {
            "$ref": "#/components/schemas/SectorType"
          },
          "color": {
            "type": [
              "null",
              "string"
            ]
          },
          "sortOrder": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "isActive": {
            "type": "boolean"
          }
        }
      },
      "SectorType": {
        "type": "integer"
      },
      "SendChatMessageRequest": {
        "required": [
          "body"
        ],
        "type": "object",
        "properties": {
          "body": {
            "type": "string"
          }
        }
      },
      "SendTestPushRequest": {
        "required": [
          "title",
          "body"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": [
              "null",
              "string"
            ]
          },
          "body": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "SensorLogDto": {
        "required": [
          "id",
          "deviceId",
          "eventType",
          "payload",
          "recordedAt",
          "receivedAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "deviceId": {
            "type": "string",
            "format": "uuid"
          },
          "eventType": {
            "type": "string"
          },
          "payload": {
            "type": "string"
          },
          "recordedAt": {
            "type": "string",
            "format": "date-time"
          },
          "receivedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ShiftDto": {
        "required": [
          "id",
          "gymId",
          "assigneeUserId",
          "assigneeName",
          "startAt",
          "endAt",
          "role",
          "notes",
          "status"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "gymId": {
            "type": "string",
            "format": "uuid"
          },
          "assigneeUserId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "assigneeName": {
            "type": [
              "null",
              "string"
            ]
          },
          "startAt": {
            "type": "string",
            "format": "date-time"
          },
          "endAt": {
            "type": "string",
            "format": "date-time"
          },
          "role": {
            "$ref": "#/components/schemas/GymRole"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          },
          "status": {
            "$ref": "#/components/schemas/ShiftStatus"
          }
        }
      },
      "ShiftRequest": {
        "required": [
          "assigneeUserId",
          "startAt",
          "endAt",
          "role",
          "notes",
          "status"
        ],
        "type": "object",
        "properties": {
          "assigneeUserId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "startAt": {
            "type": "string",
            "format": "date-time"
          },
          "endAt": {
            "type": "string",
            "format": "date-time"
          },
          "role": {
            "$ref": "#/components/schemas/GymRole"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          },
          "status": {
            "$ref": "#/components/schemas/ShiftStatus"
          }
        }
      },
      "ShiftStatus": {
        "type": "integer"
      },
      "SpeedRunDto": {
        "required": [
          "id",
          "userId",
          "displayName",
          "timeSeconds",
          "isValid",
          "invalidationReason",
          "finishedAt",
          "competitionId"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "timeSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "isValid": {
            "type": "boolean"
          },
          "invalidationReason": {
            "type": [
              "null",
              "string"
            ]
          },
          "finishedAt": {
            "type": "string",
            "format": "date-time"
          },
          "competitionId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          }
        }
      },
      "SpeedRunIngestRequest": {
        "required": [
          "userId",
          "timeSeconds",
          "startedAt",
          "finishedAt",
          "competitionId"
        ],
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "timeSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "startedAt": {
            "type": "string",
            "format": "date-time"
          },
          "finishedAt": {
            "type": "string",
            "format": "date-time"
          },
          "competitionId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "isValid": {
            "type": "boolean",
            "default": true
          },
          "invalidationReason": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "SpeedRunLeaderboardDto": {
        "required": [
          "rank",
          "userId",
          "displayName",
          "avatarUrl",
          "bestTimeSeconds",
          "runCount",
          "achievedAt"
        ],
        "type": "object",
        "properties": {
          "rank": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "avatarUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "bestTimeSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "runCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "achievedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "SprayHoldDto": {
        "required": [
          "x",
          "y",
          "role"
        ],
        "type": "object",
        "properties": {
          "x": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "y": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "role": {
            "type": "string"
          }
        },
        "description": "A marked hold: x/y normalized to 0..1 over the photo, plus its role."
      },
      "SprayRouteDto": {
        "required": [
          "id",
          "sprayWallId",
          "name",
          "grade",
          "gradeSystem",
          "color",
          "description",
          "setterId",
          "setterName",
          "holds",
          "createdAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "sprayWallId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "grade": {
            "type": "string"
          },
          "gradeSystem": {
            "$ref": "#/components/schemas/GradeSystem"
          },
          "color": {
            "type": [
              "null",
              "string"
            ]
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "setterId": {
            "type": "string",
            "format": "uuid"
          },
          "setterName": {
            "type": "string"
          },
          "holds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SprayHoldDto"
            }
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "SprayWallDto": {
        "required": [
          "id",
          "name",
          "photoUrl",
          "thumbnailUrl",
          "photoWidth",
          "photoHeight",
          "routeCount",
          "createdAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "photoUrl": {
            "type": "string"
          },
          "thumbnailUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "photoWidth": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "photoHeight": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "routeCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "StartChatRequest": {
        "required": [
          "otherUserId"
        ],
        "type": "object",
        "properties": {
          "otherUserId": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "StripSoonDto": {
        "required": [
          "routeId",
          "name",
          "grade",
          "daysOld"
        ],
        "type": "object",
        "properties": {
          "routeId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": [
              "null",
              "string"
            ]
          },
          "grade": {
            "type": "string"
          },
          "daysOld": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "SubscriptionDto": {
        "required": [
          "id",
          "name",
          "description",
          "price",
          "currency",
          "billingPeriod",
          "durationDays",
          "isActive",
          "memberCount"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "price": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "currency": {
            "type": "string"
          },
          "billingPeriod": {
            "type": "string"
          },
          "durationDays": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "isActive": {
            "type": "boolean"
          },
          "memberCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "SubscriptionRequest": {
        "required": [
          "name",
          "description",
          "price",
          "currency",
          "billingPeriod",
          "durationDays",
          "isActive"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "price": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "currency": {
            "type": "string"
          },
          "billingPeriod": {
            "type": "string"
          },
          "durationDays": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "isActive": {
            "type": "boolean"
          }
        }
      },
      "SwipeRequest": {
        "required": [
          "targetUserId",
          "like"
        ],
        "type": "object",
        "properties": {
          "targetUserId": {
            "type": "string",
            "format": "uuid"
          },
          "like": {
            "type": "boolean"
          }
        }
      },
      "SwipeResultDto": {
        "required": [
          "matchId",
          "status",
          "isMatch",
          "chatRoomId"
        ],
        "type": "object",
        "properties": {
          "matchId": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string"
          },
          "isMatch": {
            "type": "boolean"
          },
          "chatRoomId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          }
        },
        "description": "Outcome of a swipe: whether it produced a mutual match + chat."
      },
      "SwitchGymRequest": {
        "required": [
          "gymId"
        ],
        "type": "object",
        "properties": {
          "gymId": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "TelemetryBatchRequest": {
        "required": [
          "events"
        ],
        "type": "object",
        "properties": {
          "events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TelemetryEventRequest"
            }
          }
        }
      },
      "TelemetryEventRequest": {
        "required": [
          "eventType",
          "payload",
          "recordedAt"
        ],
        "type": "object",
        "properties": {
          "eventType": {
            "type": "string"
          },
          "payload": {
            "type": [
              "null",
              "string"
            ]
          },
          "recordedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          }
        }
      },
      "TimeEntryDto": {
        "required": [
          "id",
          "gymId",
          "userId",
          "userName",
          "shiftId",
          "clockInAt",
          "clockOutAt",
          "status",
          "approvedByUserId",
          "approvedAt",
          "notes"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "gymId": {
            "type": "string",
            "format": "uuid"
          },
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "userName": {
            "type": "string"
          },
          "shiftId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "clockInAt": {
            "type": "string",
            "format": "date-time"
          },
          "clockOutAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "status": {
            "$ref": "#/components/schemas/TimeEntryStatus"
          },
          "approvedByUserId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "approvedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "notes": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "TimeEntryStatus": {
        "type": "integer"
      },
      "TrainingProtocolDto": {
        "required": [
          "id",
          "boardType",
          "name",
          "description",
          "level",
          "durationMinutes",
          "isSystem",
          "gymId",
          "steps"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "boardType": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "level": {
            "type": "string"
          },
          "durationMinutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "isSystem": {
            "type": "boolean"
          },
          "gymId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "steps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProtocolStepDto"
            }
          }
        }
      },
      "TwoFactorChallengeRequest": {
        "required": [
          "email",
          "twoFactorToken",
          "code"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "twoFactorToken": {
            "type": "string"
          },
          "code": {
            "type": "string"
          }
        }
      },
      "TwoFactorDisableRequest": {
        "required": [
          "code"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          }
        }
      },
      "TwoFactorEnrollResponse": {
        "required": [
          "sharedKey",
          "otpauthUri"
        ],
        "type": "object",
        "properties": {
          "sharedKey": {
            "type": "string"
          },
          "otpauthUri": {
            "type": "string"
          }
        },
        "description": "Authenticator enrollment material: the Base32 shared key plus the\n    `otpauth://` URI to load into a TOTP app (QR-encodable client-side)."
      },
      "TwoFactorStatusResponse": {
        "required": [
          "enabled",
          "recoveryCodesLeft"
        ],
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "recoveryCodesLeft": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "TwoFactorVerifyRequest": {
        "required": [
          "code"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          }
        }
      },
      "TwoFactorVerifyResponse": {
        "required": [
          "enabled",
          "recoveryCodes"
        ],
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "recoveryCodes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "description": "Returned once when TOTP is enabled: store the recovery codes safely, they are not retrievable later."
      },
      "UpdateCompRouteRequest": {
        "required": [
          "routeId",
          "points",
          "timeLimitSeconds",
          "judgingCriteria"
        ],
        "type": "object",
        "properties": {
          "routeId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "points": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "timeLimitSeconds": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "judgingCriteria": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "UpdateGymRequest": {
        "required": [
          "name",
          "slug",
          "description",
          "address",
          "city",
          "country",
          "phone",
          "email",
          "website",
          "latitude",
          "longitude"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "description": {
            "type": [
              "null",
              "string"
            ]
          },
          "address": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "phone": {
            "type": [
              "null",
              "string"
            ]
          },
          "email": {
            "type": [
              "null",
              "string"
            ]
          },
          "website": {
            "type": [
              "null",
              "string"
            ]
          },
          "latitude": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "longitude": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          }
        }
      },
      "UpdateIsolationZoneRequest": {
        "required": [
          "name",
          "capacity"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "capacity": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "UpdateLocaleRequest": {
        "required": [
          "locale"
        ],
        "type": "object",
        "properties": {
          "locale": {
            "type": "string"
          }
        }
      },
      "UpdateLocaleResponse": {
        "required": [
          "locale"
        ],
        "type": "object",
        "properties": {
          "locale": {
            "type": "string"
          }
        }
      },
      "UpdateMatchPreferencesRequest": {
        "required": [
          "lookingFor",
          "skillRange",
          "maxDistanceKm",
          "bio",
          "isActive"
        ],
        "type": "object",
        "properties": {
          "lookingFor": {
            "type": "string"
          },
          "skillRange": {
            "type": "string"
          },
          "maxDistanceKm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "bio": {
            "type": [
              "null",
              "string"
            ]
          },
          "isActive": {
            "type": "boolean"
          }
        }
      },
      "UpdateMemberRequest": {
        "required": [
          "role",
          "isActive",
          "subscriptionId"
        ],
        "type": "object",
        "properties": {
          "role": {
            "$ref": "#/components/schemas/GymRole"
          },
          "isActive": {
            "type": "boolean"
          },
          "subscriptionId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          },
          "customRoleId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          }
        }
      },
      "UpdateMembershipPermissionsRequest": {
        "required": [
          "add",
          "remove"
        ],
        "type": "object",
        "properties": {
          "add": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "remove": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "UpdateOperatorRequest": {
        "required": [
          "role",
          "employeeCode",
          "hireDate",
          "employmentType",
          "weeklyHoursTarget",
          "isActive"
        ],
        "type": "object",
        "properties": {
          "role": {
            "$ref": "#/components/schemas/GymRole"
          },
          "employeeCode": {
            "type": [
              "null",
              "string"
            ]
          },
          "hireDate": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "employmentType": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/EmploymentType"
              }
            ]
          },
          "weeklyHoursTarget": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "isActive": {
            "type": "boolean"
          },
          "customRoleId": {
            "type": [
              "null",
              "string"
            ],
            "format": "uuid"
          }
        }
      },
      "UpdatePartnerPrefsRequest": {
        "required": [
          "lookingForPartner",
          "partnerGradeMin",
          "partnerGradeMax",
          "availabilityJson"
        ],
        "type": "object",
        "properties": {
          "lookingForPartner": {
            "type": "boolean"
          },
          "partnerGradeMin": {
            "type": [
              "null",
              "string"
            ]
          },
          "partnerGradeMax": {
            "type": [
              "null",
              "string"
            ]
          },
          "availabilityJson": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "UpdateProfileRequest": {
        "required": [
          "displayName",
          "bio",
          "weightKg",
          "heightCm",
          "climbingSince",
          "preferredDiscipline",
          "maxBoulderGrade",
          "maxLeadGrade",
          "city",
          "country",
          "isPublic"
        ],
        "type": "object",
        "properties": {
          "displayName": {
            "type": "string"
          },
          "bio": {
            "type": [
              "null",
              "string"
            ]
          },
          "weightKg": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "heightCm": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "climbingSince": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          },
          "preferredDiscipline": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Discipline"
              }
            ]
          },
          "maxBoulderGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "maxLeadGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "city": {
            "type": [
              "null",
              "string"
            ]
          },
          "country": {
            "type": [
              "null",
              "string"
            ]
          },
          "isPublic": {
            "type": "boolean"
          }
        }
      },
      "UpdateUserSettingsRequest": {
        "required": [
          "pushNotifications",
          "emailNotifications",
          "language",
          "units",
          "showInMatching",
          "privacySettings"
        ],
        "type": "object",
        "properties": {
          "pushNotifications": {
            "type": "boolean"
          },
          "emailNotifications": {
            "type": "boolean"
          },
          "language": {
            "type": "string"
          },
          "units": {
            "type": "string"
          },
          "showInMatching": {
            "type": "boolean"
          },
          "privacySettings": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "UpsertRouteFeedbackRequest": {
        "required": [
          "gradeOpinion",
          "qualityRating",
          "comment"
        ],
        "type": "object",
        "properties": {
          "gradeOpinion": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "qualityRating": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "comment": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "UserSettingsDto": {
        "required": [
          "pushNotifications",
          "emailNotifications",
          "language",
          "units",
          "showInMatching",
          "privacySettings"
        ],
        "type": "object",
        "properties": {
          "pushNotifications": {
            "type": "boolean"
          },
          "emailNotifications": {
            "type": "boolean"
          },
          "language": {
            "type": "string"
          },
          "units": {
            "type": "string"
          },
          "showInMatching": {
            "type": "boolean"
          },
          "privacySettings": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "UserStatsDto": {
        "required": [
          "totalAscents",
          "totalRoutes",
          "flashCount",
          "highestBoulderGrade",
          "highestLeadGrade",
          "currentStreakDays",
          "longestStreakDays",
          "lastClimbDate"
        ],
        "type": "object",
        "properties": {
          "totalAscents": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "totalRoutes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "flashCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "highestBoulderGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "highestLeadGrade": {
            "type": [
              "null",
              "string"
            ]
          },
          "currentStreakDays": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "longestStreakDays": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "lastClimbDate": {
            "type": [
              "null",
              "string"
            ],
            "format": "date"
          }
        }
      },
      "VerifyEmailRequest": {
        "required": [
          "email",
          "token"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "token": {
            "type": "string"
          }
        }
      },
      "WallAngle": {
        "type": "integer"
      },
      "WallDto": {
        "required": [
          "id",
          "sectorId",
          "sectorName",
          "name",
          "angle",
          "angleDegrees",
          "heightMeters",
          "imageUrl",
          "sortOrder",
          "isActive",
          "routeCount"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "sectorId": {
            "type": "string",
            "format": "uuid"
          },
          "sectorName": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "angle": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/WallAngle"
              }
            ]
          },
          "angleDegrees": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "heightMeters": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "imageUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "sortOrder": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "isActive": {
            "type": "boolean"
          },
          "routeCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        }
      },
      "WallRequest": {
        "required": [
          "sectorId",
          "name",
          "angle",
          "angleDegrees",
          "heightMeters",
          "imageUrl",
          "sortOrder",
          "isActive"
        ],
        "type": "object",
        "properties": {
          "sectorId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "angle": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/WallAngle"
              }
            ]
          },
          "angleDegrees": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "heightMeters": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "imageUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "sortOrder": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "isActive": {
            "type": "boolean"
          }
        }
      }
    },
    "securitySchemes": {
      "Bearer": {
        "type": "http",
        "description": "JWT issued by /api/auth/login. Mobile and programmatic clients send `Authorization: Bearer <jwt>`.",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      },
      "Cookie": {
        "type": "apiKey",
        "description": "HttpOnly session cookie set by /api/auth/login. Browser-only.",
        "name": "climbup_auth",
        "in": "cookie"
      },
      "CsrfToken": {
        "type": "apiKey",
        "description": "Antiforgery token from /api/auth/csrf; required on POST/PUT/PATCH/DELETE from cookie callers.",
        "name": "X-CSRF-Token",
        "in": "header"
      }
    }
  },
  "tags": [
    {
      "name": "ClimbUp.Api.Web"
    },
    {
      "name": "Audit"
    },
    {
      "name": "Competitions"
    },
    {
      "name": "CompetitionSetup"
    },
    {
      "name": "Dashboard"
    },
    {
      "name": "Devices"
    },
    {
      "name": "Ingest"
    },
    {
      "name": "Isolation"
    },
    {
      "name": "MaintenanceEvents"
    },
    {
      "name": "Members"
    },
    {
      "name": "Operators"
    },
    {
      "name": "PushCampaigns"
    },
    {
      "name": "Roles"
    },
    {
      "name": "Shifts"
    },
    {
      "name": "Subscriptions"
    },
    {
      "name": "TimeEntries"
    },
    {
      "name": "TrainingProtocolsAdmin"
    },
    {
      "name": "Auth"
    },
    {
      "name": "Chats"
    },
    {
      "name": "Follow"
    },
    {
      "name": "Gyms"
    },
    {
      "name": "Matches"
    },
    {
      "name": "Notifications"
    },
    {
      "name": "Partners"
    },
    {
      "name": "Profile"
    },
    {
      "name": "PushTokens"
    },
    {
      "name": "Routes"
    },
    {
      "name": "Sectors"
    },
    {
      "name": "Settings"
    },
    {
      "name": "SpeedRuns"
    },
    {
      "name": "SprayWalls"
    },
    {
      "name": "Walls"
    }
  ]
}