{
  "openapi": "3.0.4",
  "info": {
    "title": "Uptivo Cloud API - Clubs Integrations",
    "description": "Uptivo Cloud API for Clubs.\r\n\r\nEvery request requires both authentication credentials, and both must be valid and active:\r\n\r\n- \u0060X-Sub-Key: \u003Csubscription-key\u003E\u0060 identifies the authorized integration.\r\n- \u0060Authorization: Bearer \u003Cclub-api-key\u003E\u0060 selects the club and grants access according to the key permissions.\r\n\r\nRequests that omit either credential are rejected. When using this reference, configure both authentication entries before sending a request.",
    "version": "v1"
  },
  "servers": [
    {
      "url": "https://api-gw.uptivo.fit/club"
    }
  ],
  "paths": {
    "/Athletes": {
      "get": {
        "tags": [
          "Athletes"
        ],
        "summary": "List the athletes of the selected club",
        "description": "Start a complete forward traversal with \u0060fromId=1\u0060, then pass each returned NextCursor unchanged as cursor.\r\nDemo athletes are excluded from this list.",
        "parameters": [
          {
            "name": "fromId",
            "in": "query",
            "description": "Optional inclusive UserId range start. Results are sorted in ascending order when specified.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Optional inclusive UserId range end. Results are sorted in descending order when only this value is specified.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Maximum number of results (default: 500; maximum: 1000).",
            "schema": {
              "maximum": 1000,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 500
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAthleteDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The requested ID range is invalid"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      },
      "post": {
        "tags": [
          "Athletes"
        ],
        "summary": "Add an athlete to the selected club, creating a user when necessary",
        "description": "A successful response contains \u0060ClubAthleteCreateResultDTO\u0060. Its \u0060Result\u0060 is \u0060Created\u0060,\r\n\u0060Added\u0060, \u0060Invited\u0060, \u0060AlreadyInClub\u0060, or \u0060PendingInvitation\u0060.\r\nFailed outcomes use their corresponding HTTP status and return \u0060ApiErrorDTO\u0060 instead.\r\nA user who already has an Uptivo account may be\r\nadded immediately or invited, depending on the existing account and club relationship.\r\nExisting manager or trainer roles do not make the user an athlete and are preserved when the\r\nathlete role is added. If the user already has a pending staff invitation for the selected club,\r\nthat invitation is extended to include the athlete role.\r\nEmail is the only unconditionally required property. When a new user is created, omitted country,\r\ntimezone, language, units, first-day-of-week, and date/time-format settings inherit the selected club defaults.\r\nWhen the email belongs to an existing Uptivo user, profile values and account-creation-only options are ignored.\r\n\u0060EmailVerified=true\u0060 still promotes the existing email to verified, and \u0060Sensors\u0060 are merged into the\r\nuser\u0027s existing sensors without creating duplicate associations. \u0060EmailVerified=false\u0060 never removes an\r\nexisting verification, and omitted or empty \u0060Sensors\u0060 do not remove existing sensors.",
        "requestBody": {
          "description": "The athlete and account-creation settings.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClubAthleteCreateDTO"
              },
              "example": {
                "Email": "alex.rossi@example.com",
                "FirstMidName": "Alex",
                "LastName": "Rossi",
                "BirthDate": "1990-06-15",
                "Gender": "Unspecified",
                "UserConfirmed": true,
                "EmailVerified": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAthleteCreateResultDTO"
                },
                "example": {
                  "Result": "Created",
                  "User": {
                    "UserId": 8472,
                    "Email": "alex.rossi@example.com",
                    "FirstMidName": "Alex",
                    "LastName": "Rossi",
                    "IsDemo": false,
                    "IsGuest": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "The athlete data, sensor brand, or sensor serial is invalid; an application-level rejection returns ErrorType InvalidData",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorDTO"
                },
                "example": {
                  "ErrorType": "InvalidData",
                  "Message": "The athlete data was rejected while creating the Uptivo account."
                }
              }
            }
          },
          "403": {
            "description": "The Club API license is inactive, the Club API Key lacks permission, or the athlete limit has been reached",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorDTO"
                },
                "example": {
                  "ErrorType": "LicenseResourceLimitExceeded",
                  "Message": "The club license does not allow another athlete."
                }
              }
            }
          },
          "409": {
            "description": "The email address became unavailable while creating the Uptivo account",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorDTO"
                },
                "example": {
                  "ErrorType": "EmailAlreadyInUse",
                  "Message": "The email address is already in use."
                }
              }
            }
          },
          "500": {
            "description": "The athlete workflow could not be completed because of an internal error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorDTO"
                },
                "example": {
                  "ErrorType": "Internal",
                  "Message": "The athlete workflow could not be completed because of an internal error."
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "404": {
            "description": "The club selected by the Club API Key does not exist"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/EngagementSummaries": {
      "get": {
        "tags": [
          "Athletes"
        ],
        "summary": "List engagement summaries of current non-demo athletes in the selected club.",
        "description": "Returns the same DTO as the individual engagement summary, including zero totals for athletes without activity. Personal totals include activity outside the club. Each current month uses the athlete\u0027s timezone. Live totals, awards and levels are not a snapshot or change feed. Paginate by UserId; retain all query parameters except cursor and count between requests.",
        "parameters": [
          {
            "name": "fromId",
            "in": "query",
            "description": "Inclusive UserId lower bound; selects ascending order.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Inclusive UserId upper bound; supplied alone selects descending order.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Page size, default 100; maximum 500.",
            "schema": {
              "maximum": 500,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAthleteEngagementSummaryDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}": {
      "put": {
        "tags": [
          "Athletes"
        ],
        "summary": "Partially update an athlete of the selected club",
        "description": "Only supplied values are applied to the global Uptivo user profile; omitted values retain their current value.\r\nThe operation is rejected when the selected athlete also has a trainer or manager role in any club.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The athlete UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "The user fields to update.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClubAthleteUpdateDTO"
              },
              "example": {
                "Email": "alex.rossi@example.com",
                "FirstMidName": "Alex",
                "LastName": "Rossi",
                "Phone": "\u002B390212345678"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAthleteDTO"
                }
              }
            }
          },
          "409": {
            "description": "Specified email is already in use",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorDTO"
                },
                "example": {
                  "ErrorType": "EmailAlreadyInUse",
                  "Message": "The email address is already in use."
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The operation is not permitted by the license, key permissions, or the athlete\u0027s roles"
          },
          "400": {
            "description": "The supplied user data is invalid"
          },
          "404": {
            "description": "The athlete does not exist in the selected club"
          },
          "500": {
            "description": "The athlete could not be updated because of an internal error"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      },
      "get": {
        "tags": [
          "Athletes"
        ],
        "summary": "Get an athlete of the selected club",
        "description": "Returns 404 both when the athlete is absent and when the UserId belongs to a different club.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The athlete UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAthleteDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "The athlete does not exist in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Athletes"
        ],
        "summary": "Remove an athlete from the selected club",
        "description": "Removes the athlete\u0027s membership from this club. It does not delete the user\u0027s Uptivo account.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The athlete UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAthleteDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The operation is not permitted by the license, key permissions, or the athlete\u0027s current state"
          },
          "404": {
            "description": "The athlete does not exist in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/ClientStage": {
      "put": {
        "tags": [
          "Athletes"
        ],
        "summary": "Set an athlete\u0027s commercial stage in the selected club",
        "description": "Send one of \u0060Lead\u0060, \u0060Qualified\u0060, \u0060Prospect\u0060, or \u0060Client\u0060 in\r\n\u0060ClientStage\u0060. This changes only the selected club\u0027s Athlete relationship, not the\r\nglobal user profile or memberships in other clubs. The response is the updated\r\n\u0060ClubAthleteDTO\u0060. A real change publishes \u0060Athlete.Updated\u0060; repeating the\r\ncurrent value succeeds without publishing another event. When the stage first reaches\r\nQualified, Prospect, or Client, the corresponding UTC milestone is recorded; setting\r\na different stage later does not erase an earlier milestone.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The Athlete UserId in the selected club.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "The required, non-null commercial stage.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClubClientStageUpdateDTO"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAthleteDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the key does not grant update permission"
          },
          "400": {
            "description": "The body or ClientStage is missing or invalid"
          },
          "404": {
            "description": "No non-demo Athlete with this UserId exists in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/IsGuest": {
      "put": {
        "tags": [
          "Athletes"
        ],
        "summary": "Set an athlete\u0027s guest flag in the selected club",
        "description": "Send an explicit \u0060true\u0060 or \u0060false\u0060 in \u0060IsGuest\u0060. This changes only\r\nthe selected club\u0027s Athlete relationship, not the global user profile or memberships\r\nin other clubs. The response is the updated \u0060ClubAthleteDTO\u0060. A real change\r\npublishes \u0060Athlete.Updated\u0060; repeating the current value succeeds without\r\npublishing another event. Guest Athletes are excluded from the selected club\u0027s\r\nranking athlete set; setting the flag to false does not override other ranking\r\neligibility requirements.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The Athlete UserId in the selected club.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "The required, non-null guest flag.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClubAthleteGuestUpdateDTO"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAthleteDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the key does not grant update permission"
          },
          "400": {
            "description": "The body or IsGuest is missing or invalid"
          },
          "404": {
            "description": "No non-demo Athlete with this UserId exists in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/ByEmail": {
      "get": {
        "tags": [
          "Athletes"
        ],
        "summary": "Find an athlete of the selected club by email",
        "description": "Matches the complete email address after trimming surrounding whitespace.\r\nReturns the same athlete representation as the ID lookup. Returns 404 for unknown emails,\r\nusers outside the selected club, and users associated only as contacts. Never creates or invites a user.\r\nURL-encode the query value, including any plus sign in the email address.",
        "parameters": [
          {
            "name": "email",
            "in": "query",
            "description": "The athlete\u0027s complete email address (maximum 254 characters).",
            "required": true,
            "schema": {
              "maxLength": 254,
              "type": "string",
              "format": "email"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAthleteDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The license is inactive or the key does not grant athlete read permission"
          },
          "400": {
            "description": "The email is missing or invalid"
          },
          "404": {
            "description": "No athlete with this email exists in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/EngagementSummary": {
      "get": {
        "tags": [
          "Athletes"
        ],
        "summary": "Get current-month and lifetime engagement results for an athlete",
        "description": "Activity totals include all of the athlete\u0027s activity, not just activity in the selected club.\r\nThe current month follows the athlete\u0027s timezone. Missing activity summaries contain zero totals.\r\nCurrentYear and CurrentMonth identify that month. CurrentMonthTotals and LifetimeTotals share the same metrics.\r\nCurrentMonthBadges includes individual awards earned so far in that month. Levels are current:\r\nUptivo and the selected club\u0027s brand (null when unassigned). No historical period selector is supported.\r\nCurrentLevel and MonthToDatePoints follow the selected brand\u0027s ranking source. MonthlyPointsGoal\r\nuses the configured brand goal or the Uptivo goal, and MonthlyPointsResetAtUtc is the next local month boundary in UTC.\r\nPrevious level is supplied by Athlete.LevelChanged events, not inferred from the current summary.\r\nTotals reflect the stored aggregates, not an atomic snapshot.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The athlete UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAthleteEngagementSummaryDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The license is inactive or the key does not grant athlete read permission"
          },
          "404": {
            "description": "The athlete does not exist in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/BadgeAwards": {
      "get": {
        "tags": [
          "BadgeAwards"
        ],
        "summary": "List badge awards visible to the connected club",
        "description": "Returns the latest awards by default, ordered by descending AchievedBadgeId. fromId starts an ascending\r\ntraversal; toId supplied alone selects a descending upper bound. PrevCursor moves toward smaller award IDs\r\nand NextCursor toward larger IDs. Retain the original query parameters and replace only cursor; count may change.\r\nEach repeated award of the same badge has a distinct AchievedBadgeId. Visibility follows current club\r\nathlete membership and the challenge\u0027s club or brand, not the badge design\u0027s owner. AchievedAt is the\r\neffective award date, which may precede assignment, so paginate by award ID rather than this date.\r\nOptional challenge, goal, and ranking context may be null. This read contract does not include\r\nTrainingChallengeId or AwardType; use Badge.Awarded webhook data when those fields are needed.",
        "parameters": [
          {
            "name": "fromId",
            "in": "query",
            "description": "Optional inclusive assignment ID lower bound.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Optional inclusive assignment ID upper bound.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Page size, default 100; maximum 1000.",
            "schema": {
              "maximum": 1000,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of visible badge awards; no matching awards yields an empty page",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubBadgeAwardDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID range, count, or cursor"
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/BadgeAwards": {
      "get": {
        "tags": [
          "BadgeAwards"
        ],
        "summary": "List badge awards for one current athlete of the connected club",
        "description": "Uses the same item DTO and pagination rules as the club list. Returns 404 when the athlete is not currently associated with this club.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The UserId of a current athlete in the selected club.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "fromId",
            "in": "query",
            "description": "Optional inclusive award ID lower bound; selects ascending order.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Optional inclusive award ID upper bound; supplied alone selects descending order.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Page size, default 100; maximum 1000.",
            "schema": {
              "maximum": 1000,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of this athlete\u0027s visible badge awards",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubBadgeAwardDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID range, count, or cursor"
          },
          "404": {
            "description": "The user is not a current athlete of the selected club"
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/BadgeAwards/{achievedBadgeId}": {
      "get": {
        "tags": [
          "BadgeAwards"
        ],
        "summary": "Get one badge award visible to the connected club",
        "description": "Returns the same item as the list operations. Use AchievedBadgeId, not BadgeId, in this path. Visibility requires a current athlete relationship and a challenge award associated with the selected club or its brand.",
        "parameters": [
          {
            "name": "achievedBadgeId",
            "in": "path",
            "description": "The unique award identifier returned by the lists or Badge.Awarded.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The visible badge award",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubBadgeAwardDTO"
                }
              }
            }
          },
          "404": {
            "description": "The award is absent or not visible to the selected club"
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Classes/Bookings": {
      "get": {
        "tags": [
          "Bookings"
        ],
        "summary": "List saved bookings of the selected club.",
        "description": "Same DTO as the individual booking, including class and subscription context. Class Begin is filtered in [from,to). Order is Class Begin, ClassId, UserId; NextCursor always moves forward and PrevCursor backward, even within one class. With only to, start with the most recent classes; otherwise ascending. Deleted bookings are absent; corrections do not move the cursor. Not a snapshot or update feed. Retain all original query parameters except cursor/count.",
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "description": "Optional inclusive Class Begin instant.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Optional exclusive Class Begin instant.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Page size, default 100; maximum 500.",
            "schema": {
              "maximum": 500,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "400": {
            "description": "Bad Request"
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubClassParticipationDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Classes/{classId}/Bookings": {
      "get": {
        "tags": [
          "Bookings"
        ],
        "summary": "List saved bookings of one published class in the selected club.",
        "description": "Same DTO and pagination as the club bookings list. Includes confirmed and queued participants. A cursor belongs to this class and these filters, not another class or endpoint. The legacy participants array remains available.",
        "parameters": [
          {
            "name": "classId",
            "in": "path",
            "description": "Class identifier.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Optional inclusive Class Begin instant.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Optional exclusive Class Begin instant.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Page size, default 100; maximum 500.",
            "schema": {
              "maximum": 500,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "400": {
            "description": "Bad Request"
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubClassParticipationDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          },
          "404": {
            "description": "Not Found"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/Bookings": {
      "get": {
        "tags": [
          "Bookings"
        ],
        "summary": "List a user\u0027s saved bookings in the selected club.",
        "description": "Same DTO and pagination as the club bookings list. Includes saved bookings of former athletes; membership in the club is not required now. An unknown user or no matching bookings returns an empty page. Does not expose bookings from other clubs.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "User identifier.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Optional inclusive Class Begin instant.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Optional exclusive Class Begin instant.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Page size, default 100; maximum 500.",
            "schema": {
              "maximum": 500,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "400": {
            "description": "Bad Request"
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubClassParticipationDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Classes/Calendars/{calendarType}": {
      "get": {
        "tags": [
          "Calendars"
        ],
        "summary": "List classes in a calendar of the selected club",
        "description": "Only \u0060Club\u0060, \u0060PT\u0060, and \u0060Services\u0060 are accepted as calendar types.\r\nOnly published classes whose \u0060Begin\u0060 is greater than or equal to \u0060from\u0060 and lower than\r\n\u0060to\u0060 are returned. A class that begins before the range is excluded even if it ends inside it.\r\nPass the returned NextCursor or PrevCursor unchanged as cursor, retaining the original filters; only count may change.\r\nWithout dates, use the standard ID-range pattern: fromId is ascending; toId alone is descending. Without boundaries, return the first page by ascending ID.",
        "parameters": [
          {
            "name": "calendarType",
            "in": "path",
            "description": "Calendar type: \u0060Club\u0060, \u0060PT\u0060, or \u0060Services\u0060.",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/CalendarType"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Optional inclusive Begin filter. Keep unchanged when using cursor.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Optional exclusive Begin filter. Keep unchanged when using cursor.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Maximum number of results (default: 100; maximum: 500).",
            "schema": {
              "maximum": 500,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 100
            }
          },
          {
            "name": "withDescriptions",
            "in": "query",
            "description": "Include the class description (default: false).",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "withSubscriptions",
            "in": "query",
            "description": "Populate the subscription product IDs accepted for remote and in-site attendance (default: false).",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "withParticipants",
            "in": "query",
            "description": "Populate \u0060ParticipantUserIds\u0060 with confirmed participants; queued athletes are excluded (default: false).",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "fromId",
            "in": "query",
            "description": "Inclusive ID filter; without cursor selects ascending ID order when no dates are provided.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Inclusive ID filter; without cursor and fromId selects descending ID order when no dates are provided.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubActivityForCalendarDTOIClubQueryIdTSRangeResultDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The cursor or range is invalid, ID and date/time filters are combined, or the calendar type is not supported"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Challenges": {
      "get": {
        "tags": [
          "Challenges"
        ],
        "summary": "List challenges available to the connected club",
        "description": "One page in challenge ID order. fromId selects ascending order; toId alone selects descending order. Without boundaries, return the first page ascending. Pass the returned NextCursor or PrevCursor unchanged as cursor, retaining the original filters. Club-owned disabled challenges are included; brand challenges must be enabled and brand gamification active. Templates are excluded, but their concrete monthly instances are included.",
        "parameters": [
          {
            "name": "fromId",
            "in": "query",
            "description": "Optional inclusive challenge ID range start.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Page size (default: 100; maximum: 1000).",
            "schema": {
              "maximum": 1000,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 100
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Optional inclusive challenge ID range end; supplied alone selects descending order.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubChallengeDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Challenges/{challengeId}": {
      "get": {
        "tags": [
          "Challenges"
        ],
        "summary": "Get a challenge available to the connected club",
        "description": "Returns 404 for another club/brand, personal challenges, or scheduled templates. Awarded describes completion of final award processing, not whether every athlete has won a medal. Immediate goals may award medals before Awarded becomes true.",
        "parameters": [
          {
            "name": "challengeId",
            "in": "path",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubChallengeDTO"
                }
              }
            }
          },
          "404": {
            "description": "Not Found"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Challenges/{challengeId}/Results": {
      "get": {
        "tags": [
          "Challenges"
        ],
        "summary": "List one page of athlete results for a challenge",
        "description": "Results are ordered by UserId, not rank: fromId selects ascending order, toId alone selects descending order, and no boundaries means ascending. Pass the returned NextCursor or PrevCursor unchanged as cursor, retaining the original filters. Rank and RankPrc remain relative to all scored participants across the challenge, including other brand clubs. Participants is that full count. Only current non-demo athletes of the selected club are returned. Live scores/ranks can change between requests; the page is not a snapshot. No result is an awarded-medal notification: use Badge.Awarded for actual awards.",
        "parameters": [
          {
            "name": "challengeId",
            "in": "path",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "fromId",
            "in": "query",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "count",
            "in": "query",
            "schema": {
              "maximum": 1000,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 100
            }
          },
          {
            "name": "toId",
            "in": "query",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubChallengeResultsDTO"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "404": {
            "description": "Not Found"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Challenges/{challengeId}/Results/{userId}": {
      "get": {
        "tags": [
          "Challenges"
        ],
        "summary": "Get an athlete\u0027s result for a challenge",
        "description": "Returns the same result envelope as the list, with exactly one row and Continue=false. Returns 404 for an inaccessible challenge, an athlete outside the club, a demo athlete, or an athlete without scored activity. Does not invent a zero score or enroll the athlete.",
        "parameters": [
          {
            "name": "challengeId",
            "in": "path",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubChallengeResultsDTO"
                }
              }
            }
          },
          "404": {
            "description": "Not Found"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Classes/{classId}": {
      "get": {
        "tags": [
          "Classes"
        ],
        "summary": "Get a published class of the selected club.",
        "description": "Club, PT and Services calendars only. Returns the calendar representation with description; optional subscription and participant lists are not populated.",
        "parameters": [
          {
            "name": "classId",
            "in": "path",
            "description": "The stable Class identifier returned by calendar operations and Class events.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubActivityForCalendarDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "Class absent, unpublished, or outside the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Classes/{classId}/Participants/{userId}": {
      "get": {
        "tags": [
          "Classes"
        ],
        "summary": "Get a booking and its class context.",
        "description": "NoShow is the stored flag, not proof of check-in. A future class or queued booking is not completed attendance. Only published Club, PT and Services classes and non-demo users are returned.",
        "parameters": [
          {
            "name": "classId",
            "in": "path",
            "description": "The Class identifier.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "userId",
            "in": "path",
            "description": "The participant\u0027s User identifier.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubClassParticipationDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "Booking or published class not found in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Classes"
        ],
        "summary": "Remove an athlete\u0027s participation from a class",
        "description": "The class calendar type must support participants. Participants already in the queue are removable without\r\nclass-end or cancellation-deadline checks. For other participants, \u0060disableDateTimeChecks=true\u0060 bypasses\r\nthose checks directly; it does not depend on a trainer or manager role and should only be used by trusted integrations.\r\nA successful removal refunds credits or limited-subscription activities consumed by the booking. Uptivo may\r\nthen promote another athlete from the queue. Removing a remote participant\r\nalso removes that athlete from the associated live session when one exists.",
        "parameters": [
          {
            "name": "classId",
            "in": "path",
            "description": "The ClassId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "userId",
            "in": "path",
            "description": "The participant UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "disableDateTimeChecks",
            "in": "query",
            "description": "Bypass class-end and cancellation-deadline checks (default: false).",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassParticipantOpResultDTO"
                },
                "example": {
                  "ClassId": 3105,
                  "UserId": 8472,
                  "CreatedAtUtc": "2030-09-07T09:15:00Z",
                  "Mode": "InSite",
                  "State": "Participant",
                  "Trial": false,
                  "NoShow": false,
                  "CreditsCost": 0,
                  "TotalCredits": 12,
                  "UserClassSubscriptionId": 9021,
                  "ClassSubscriptionId": 120
                }
              }
            }
          },
          "400": {
            "description": "The class calendar type does not support participants"
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "The class is outside the selected club or the athlete is not a participant"
          },
          "409": {
            "description": "The class has finished or its cancellation deadline has passed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorDTO"
                },
                "example": {
                  "ErrorType": "CancelTimeIsPastDue",
                  "Message": "The class cancellation deadline has passed."
                }
              }
            }
          },
          "500": {
            "description": "The participant could not be removed because of an internal error"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Classes/Participants/Recent": {
      "get": {
        "tags": [
          "Classes"
        ],
        "summary": "Read the most recently created bookings still present in the selected club.",
        "description": "Bounded snapshot for sampling, not an update feed or deletion history. Includes queues, past and future published classes in Club, PT and Services calendars. Demo users are excluded.",
        "parameters": [
          {
            "name": "count",
            "in": "query",
            "description": "Number of bookings, between 1 and 100; default 3.",
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 3
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ClubClassParticipationDTO"
                  }
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "Invalid count"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/AttendanceSummary": {
      "get": {
        "tags": [
          "Classes"
        ],
        "summary": "Summarize an athlete\u0027s class attendance in the selected club.",
        "description": "Requires Read or ReadWrite access. FirstCheckIn, LastCheckIn and LifetimeCheckInCount cover all saved history in this club. RollingCheckInCount covers [now minus days, now]; PriorCheckInCount covers [now minus twice days, now minus days). Boundaries are calculated at request time. Only published Club, PT and Services classes are included. Check-ins are confirmed NoShow=false bookings whose classes have started, including ongoing classes; future and queued bookings do not count. Check-in dates use Class Begin, not physical check-in timestamps. Uses current saved flags, including corrections; deleted bookings are not retained. An automatically present booking is not independent evidence of physical check-in. See the [attendance guide](/guides/bulk-summaries-and-bookings/#read-athlete-attendance-in-bulk).",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The User identifier of a non-demo athlete in the selected club.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Elapsed UTC days in each RollingCheckInCount/PriorCheckInCount window, default 30, range 1-366. Does not affect lifetime metrics.",
            "schema": {
              "maximum": 366,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 30
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAttendanceSummaryDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "Invalid days value"
          },
          "404": {
            "description": "No non-demo athlete in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/AttendanceSummaries": {
      "get": {
        "tags": [
          "Classes"
        ],
        "summary": "List attendance summaries of current non-demo athletes in the selected club.",
        "description": "Same DTO and check-in rules as the individual summary. Includes athletes without bookings with zero counts. First/last check-in and total count cover lifetime history; two consecutive windows are calculated from days at request time. Paginated by UserId, not attendance time. Requires Read or ReadWrite access. Current saved state, not a historical change feed; keep original query parameters except cursor/count.",
        "parameters": [
          {
            "name": "fromId",
            "in": "query",
            "description": "Inclusive UserId lower bound; selects ascending order.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Inclusive UserId upper bound; supplied alone selects descending order.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Page size, default 100; maximum 500.",
            "schema": {
              "maximum": 500,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Elapsed UTC days in each RollingCheckInCount/PriorCheckInCount window, default 30, range 1-366. Response enrichment; athlete selection and cursor context are unchanged.",
            "schema": {
              "maximum": 366,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 30
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAttendanceSummaryDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Classes/{classId}/Participants": {
      "post": {
        "tags": [
          "Classes"
        ],
        "summary": "Add an athlete as a class participant",
        "description": "The class and athlete must belong to the selected club. The class calendar type must support participants.\r\nWith \u0060PaymentMode.Auto\u0060, a valid subscription is preferred and credits are used as fallback.\r\nWhen the class is full, the athlete is placed in the queue unless \u0060DisableQueue\u0060 is true.\r\nA confirmed booking can consume a subscription activity or credits; a queued booking is not charged immediately.\r\n\r\nThe \u0060Disable*\u0060 flags deliberately bypass individual business checks. They should only be enabled by\r\ntrusted server-side integrations that have independently enforced the corresponding rules.\r\nA 409 response contains \u0060ApiErrorDTO\u0060. Relevant ErrorType values include \u0060ClassNotPublished\u0060,\r\n\u0060ClassNotBookable\u0060, \u0060Conflict\u0060, \u0060RequiredMedicalCertificate\u0060, \u0060RequiredMembership\u0060,\r\n\u0060AthleteBookingDisabled\u0060, \u0060ClassIsFinished\u0060, \u0060ClassBookingIsEarly\u0060, \u0060ClassHasStarted\u0060,\r\n\u0060ClassBookingIsPastDue\u0060, \u0060ClassFull\u0060, \u0060InvalidPaymentOption\u0060, \u0060NotEnoughCredits\u0060,\r\n\u0060SubscriptionLimitsExceeded\u0060, \u0060NoValidSubscriptions\u0060, \u0060PoliciesNotAccepted\u0060, and \u0060ClubLimitsExceeded\u0060.",
        "parameters": [
          {
            "name": "classId",
            "in": "path",
            "description": "The ClassId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "The athlete, attendance mode, payment mode, and optional check overrides.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddClassParticipantRequestDTO"
              },
              "example": {
                "UserId": 8472,
                "Mode": "InSite",
                "Trial": false,
                "PaymentMode": "Auto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClassParticipantOpResultDTO"
                },
                "example": {
                  "ClassId": 3105,
                  "UserId": 8472,
                  "CreatedAtUtc": "2030-09-07T09:15:00Z",
                  "Mode": "InSite",
                  "State": "Participant",
                  "Trial": false,
                  "NoShow": false,
                  "CreditsCost": 0,
                  "TotalCredits": 12,
                  "UserClassSubscriptionId": 9021,
                  "ClassSubscriptionId": 120
                }
              }
            }
          },
          "400": {
            "description": "The request is invalid or the class calendar type does not support participants"
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "404": {
            "description": "The class or athlete does not exist in the selected club"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "409": {
            "description": "A class, athlete, eligibility, booking, or payment rule prevents the operation",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorDTO"
                },
                "example": {
                  "ErrorType": "ClassFull",
                  "Message": "The class is full for the requested attendance mode."
                }
              }
            }
          },
          "500": {
            "description": "The participant could not be added because of an internal error"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      },
      "get": {
        "tags": [
          "Classes"
        ],
        "summary": "List the participants of a class",
        "description": "The response remains a non-paginated array containing confirmed participants and queued athletes.\r\nEach item now includes the same class/subscription context as the individual booking. Legacy BookActorId and BookActorName are retained.\r\nFor bounded pages use /Classes/{classId}/Bookings. This legacy route retains its existing class visibility and demo-user behavior.\r\nThe class calendar type must support participants.",
        "parameters": [
          {
            "name": "classId",
            "in": "path",
            "description": "The ClassId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ClubClassParticipationDTO"
                  }
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The class calendar type does not support participants"
          },
          "404": {
            "description": "The class does not exist in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/AuthCheck": {
      "get": {
        "tags": [
          "Club"
        ],
        "summary": "Verify Club API access without reading club data",
        "description": "Validates the usual gateway and club credentials, token revocation and API license.\r\nReturns the club ID from the authenticated token without additional storage reads.\r\nThis is an access check, not a database health check. Do not cache its response.",
        "responses": {
          "200": {
            "description": "Club API access is valid",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubApiAuthCheckDTO"
                }
              }
            }
          },
          "401": {
            "description": "Authentication failed"
          },
          "403": {
            "description": "Access is denied or the Club API license is inactive"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Profile": {
      "get": {
        "tags": [
          "Club"
        ],
        "summary": "Get the profile of the club selected by the Club API Key",
        "description": "Returns the public identity, contact, and locale settings of the club associated with the supplied Club API Key.\r\nA Club API Key never grants access to another club. The response contains only the fields declared by the public profile schema.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubProfileDTO"
                },
                "example": {
                  "ClubId": 42,
                  "BrandId": 7,
                  "ClubCode": "DEMO42",
                  "Name": "Example Fitness Club",
                  "PictureUri": "https://example.com/clubs/42/profile.png",
                  "Address": "Via Roma 10, Milano",
                  "Latitude": 45.4642,
                  "Longitude": 9.1900,
                  "Phone": "\u002B39 02 1234567",
                  "Email": "info@example.com",
                  "WebSiteUri": "https://example.com",
                  "CountryCode": "IT",
                  "TimeZoneCode": "Europe/Rome",
                  "FirstDayOfWeek": "Monday",
                  "DateFormat": "ddmmyyyy",
                  "TimeFormat": "h24",
                  "UnitsSystem": "Metric",
                  "Language": "Italian",
                  "DefaultCurrency": "EUR"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "The club selected by the Club API Key does not exist"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Contacts/{userId}/ClientStage": {
      "put": {
        "tags": [
          "Contacts"
        ],
        "summary": "Set a contact\u0027s commercial stage in the selected club",
        "description": "Send one of \u0060Lead\u0060, \u0060Qualified\u0060, \u0060Prospect\u0060, or \u0060Client\u0060 in\r\n\u0060ClientStage\u0060. A null value cannot clear the stage. This changes only the\r\nselected club\u0027s Contact relationship; it does not invite the user, make them an\r\nAthlete, or change their global profile. The response is the updated\r\n\u0060ClubContactDTO\u0060. A real change publishes \u0060Contact.Updated\u0060; repeating\r\nthe current value succeeds without publishing another event.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The Contact UserId in the selected club.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "The required, non-null commercial stage.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClubClientStageUpdateDTO"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubContactDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the key does not grant update permission"
          },
          "400": {
            "description": "The body or ClientStage is missing or invalid"
          },
          "404": {
            "description": "No non-demo Contact with this UserId exists in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Contacts": {
      "get": {
        "tags": [
          "Contacts"
        ],
        "summary": "List the contacts of the selected club",
        "description": "For a complete forward traversal, start with \u0060fromId=1\u0060, then pass each returned NextCursor\r\nunchanged as cursor. \u0060toId\u0060 alone returns descending UserIds. Demo users are excluded.\r\nA contact relationship does not grant access to athlete training or engagement data.",
        "parameters": [
          {
            "name": "fromId",
            "in": "query",
            "description": "Optional inclusive UserId range start; results are sorted ascending when supplied.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Optional inclusive UserId range end; results are sorted descending when supplied alone.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Maximum number of results (default: 500; maximum: 1000).",
            "schema": {
              "maximum": 1000,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 500
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubContactDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant read permission"
          },
          "400": {
            "description": "The requested ID range is invalid"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Contacts/ByEmail": {
      "get": {
        "tags": [
          "Contacts"
        ],
        "summary": "Find a contact of the selected club by email",
        "description": "Matches the complete email address after trimming surrounding whitespace. URL-encode the query value,\r\nincluding any plus sign. This is a read-only lookup:\r\nit never creates a user or adds a club relationship. An athlete-only relationship does not match.",
        "parameters": [
          {
            "name": "email",
            "in": "query",
            "description": "The contact\u0027s complete email address (maximum 254 characters).",
            "required": true,
            "schema": {
              "maxLength": 254,
              "type": "string",
              "format": "email"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubContactDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The license is inactive or the key does not grant contact read permission"
          },
          "400": {
            "description": "The email is missing or invalid"
          },
          "404": {
            "description": "No non-demo contact with this email exists in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Contacts/{userId}": {
      "get": {
        "tags": [
          "Contacts"
        ],
        "summary": "Get a contact of the selected club by UserId",
        "description": "Returns 404 when the user is absent, belongs to another club, is a demo user, or has only an\r\nAthlete relationship with this club. The UserId identifies the same Uptivo user if their club\r\nrelationship later changes between Contact and Athlete.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The contact\u0027s global Uptivo UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubContactDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The license is inactive or the key does not grant contact read permission"
          },
          "404": {
            "description": "No non-demo contact with this UserId exists in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/MembershipSummaries": {
      "get": {
        "tags": [
          "MembershipSummaries"
        ],
        "summary": "List effective membership states of current non-demo athletes in the selected club.",
        "description": "Returns the same representation as the individual MembershipSummary operation, including assignment IDs,\r\nproduct names, validity dates, remaining activities, and suspension dates. Athletes without assignments\r\nreceive Status=None and an empty Memberships array. States are evaluated at request time and may change\r\nwhen dates pass without a webhook; periodically rescan existing athletes. Start with fromId=1 for a\r\nforward scan. Retain the original query parameters and replace only cursor, optionally changing count.\r\nSee the individual MembershipSummary operation for state rules. Requires Read or ReadWrite access.",
        "parameters": [
          {
            "name": "fromId",
            "in": "query",
            "description": "Inclusive UserId lower bound; selects ascending order.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Inclusive UserId upper bound; supplied alone selects descending order.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Page size, default 100; maximum 500.",
            "schema": {
              "maximum": 500,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of membership summaries, including athletes without assignments",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAthleteMembershipSummaryDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID range, count, or cursor"
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/MembershipSummary": {
      "get": {
        "tags": [
          "MembershipSummaries"
        ],
        "summary": "Get the effective membership state of an athlete in the selected club.",
        "description": "Active wins over Paused, then Pending. Active requires a non-disabled subscription within its inclusive From/To interval, with available or unlimited tickets and no current suspension. Paused requires a non-disabled subscription with available or unlimited tickets and a suspension active at request time, even when its original To has passed. Pending requires a non-disabled future subscription with available or unlimited tickets. Otherwise the most recently started subscription (From descending, UserClassSubscriptionId descending for ties) determines Canceled when disabled, or Expired when ended or out of tickets. A finite-ticket subscription with no remaining tickets is exhausted regardless of its end date. Expired is immediate; campaign delays belong to the integration. No subscription yields None. Dates describe subscriptions and are not state-transition timestamps.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The athlete UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The current state and all assignment details; no assignments yields Status=None and an empty Memberships array",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubAthleteMembershipSummaryDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "The athlete is missing, outside the selected club, or a demo user"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Subscriptions": {
      "get": {
        "tags": [
          "Subscriptions"
        ],
        "summary": "List subscription products configured by the selected club",
        "description": "These are the club\u0027s subscription products, not the memberships assigned to individual athletes.\r\nFor a complete forward traversal, start with \u0060fromId=1\u0060, then pass each returned NextCursor unchanged as cursor.",
        "parameters": [
          {
            "name": "fromId",
            "in": "query",
            "description": "Optional inclusive ClassSubscriptionId range start.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Optional inclusive ClassSubscriptionId range end.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Maximum number of results (default: 100; maximum: 500).",
            "schema": {
              "maximum": 500,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 100
            }
          },
          {
            "name": "withLongDescription",
            "in": "query",
            "description": "Include long descriptions (default: false).",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "withPlans",
            "in": "query",
            "description": "Include associated plans (default: false).",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "publishState",
            "in": "query",
            "description": "Optional published/unpublished state filter.",
            "schema": {
              "$ref": "#/components/schemas/PublishState"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubscriptionForListDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The requested ID range is invalid"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/Telemetry/Heartbeats": {
      "get": {
        "tags": [
          "Telemetry"
        ],
        "summary": "Get heart-rate telemetry for an athlete in a time range",
        "description": "Both boundaries are inclusive and the maximum interval is five hours. Date/time values accept ISO 8601\r\noffsets, for example \u00602016-03-09T21:24:33\u002B01:00\u0060. Each data point is the compact tuple\r\n\u0060[timestampUnixMs, beatsPerMinute]\u0060.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The athlete UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Inclusive time range start, in ISO 8601 format.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Inclusive time range end, in ISO 8601 format.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "maxItems": 2,
                    "minItems": 2,
                    "type": "array",
                    "items": {
                      "type": "integer",
                      "format": "int64"
                    },
                    "example": [
                      1603317955000,
                      92
                    ]
                  }
                },
                "example": [
                  [
                    1603317955000,
                    92
                  ],
                  [
                    1603317960000,
                    91
                  ],
                  [
                    1603317965000,
                    93
                  ]
                ]
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The range is inverted or exceeds five hours"
          },
          "404": {
            "description": "The athlete does not exist in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/Telemetry/GeoPositions": {
      "get": {
        "tags": [
          "Telemetry"
        ],
        "summary": "Get geoposition telemetry for an athlete in a time range",
        "description": "Both boundaries are inclusive and the maximum interval is five hours. Date/time values accept ISO 8601\r\noffsets, for example \u00602016-03-09T21:24:33\u002B01:00\u0060. Each data point is the compact tuple\r\n\u0060[timestampUnixMs, distanceFromStart, latitude, longitude, altitude]\u0060.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The athlete UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Inclusive time range start, in ISO 8601 format.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Inclusive time range end, in ISO 8601 format.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "maxItems": 5,
                    "minItems": 5,
                    "type": "array",
                    "items": {
                      "type": "number",
                      "format": "double"
                    },
                    "example": [
                      1602916604000,
                      1750.97509765625,
                      45.7227933,
                      9.1307737,
                      401.0517578125
                    ]
                  }
                },
                "example": [
                  [
                    1602916604000,
                    1750.97509765625,
                    45.7227933,
                    9.1307737,
                    401.0517578125
                  ],
                  [
                    1602916649000,
                    1762.345127105713,
                    45.7227452,
                    9.1306448,
                    401.71923828125
                  ]
                ]
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The range is inverted or exceeds five hours"
          },
          "404": {
            "description": "The athlete does not exist in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/Telemetry/Power": {
      "get": {
        "tags": [
          "Telemetry"
        ],
        "summary": "Get power telemetry for an athlete in a time range",
        "description": "Both boundaries are inclusive and the maximum interval is five hours. Date/time values accept ISO 8601\r\noffsets, for example \u00602016-03-09T21:24:33\u002B01:00\u0060. Each data point is the compact tuple\r\n\u0060[timestampUnixMs, watts]\u0060.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The athlete UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Inclusive time range start, in ISO 8601 format.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Inclusive time range end, in ISO 8601 format.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "maxItems": 2,
                    "minItems": 2,
                    "type": "array",
                    "items": {
                      "type": "integer",
                      "format": "int64"
                    },
                    "example": [
                      1603350935000,
                      203
                    ]
                  }
                },
                "example": [
                  [
                    1603350935000,
                    203
                  ],
                  [
                    1603350940000,
                    202
                  ],
                  [
                    1603350945000,
                    201
                  ]
                ]
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The range is inverted or exceeds five hours"
          },
          "404": {
            "description": "The athlete does not exist in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/Telemetry/Cadence": {
      "get": {
        "tags": [
          "Telemetry"
        ],
        "summary": "Get cadence telemetry for an athlete in a time range",
        "description": "Both boundaries are inclusive and the maximum interval is five hours. Date/time values accept ISO 8601\r\noffsets, for example \u00602016-03-09T21:24:33\u002B01:00\u0060. Each data point is the compact tuple\r\n\u0060[timestampUnixMs, revolutionsPerMinute]\u0060.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The athlete UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Inclusive time range start, in ISO 8601 format.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Inclusive time range end, in ISO 8601 format.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "maxItems": 2,
                    "minItems": 2,
                    "type": "array",
                    "items": {
                      "type": "integer",
                      "format": "int64"
                    },
                    "example": [
                      1596470835000,
                      82
                    ]
                  }
                },
                "example": [
                  [
                    1596470835000,
                    82
                  ],
                  [
                    1596470840000,
                    84
                  ],
                  [
                    1596470845000,
                    92
                  ]
                ]
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The range is inverted or exceeds five hours"
          },
          "404": {
            "description": "The athlete does not exist in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/Telemetry/Hits": {
      "get": {
        "tags": [
          "Telemetry"
        ],
        "summary": "Get HIT telemetry for an athlete in a time range",
        "description": "Both boundaries are inclusive and the maximum interval is five hours. Date/time values accept ISO 8601\r\noffsets, for example \u00602016-03-09T21:24:33\u002B01:00\u0060. Each data point is a compact tuple of 19 values.\r\nPosition 0 is the UTC Unix timestamp in milliseconds. Positions 1-9 contain right-side count,\r\naverage force (g), maximum force (g), average speed (km/h), maximum speed (km/h), out time (seconds),\r\nminimum out time (seconds), in time (seconds), and minimum in time (seconds). Positions 10-18 contain\r\nthe same values for the left side.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The athlete UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Inclusive time range start, in ISO 8601 format.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Inclusive time range end, in ISO 8601 format.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "maxItems": 19,
                    "minItems": 19,
                    "type": "array",
                    "items": {
                      "type": "number",
                      "format": "double"
                    },
                    "description": "HIT sample tuple: [timestamp in Unix milliseconds, right count, right average force in g, right maximum force in g, right average speed in km/h, right maximum speed in km/h, right out time in seconds, right minimum out time in seconds, right in time in seconds, right minimum in time in seconds, left count, left average force in g, left maximum force in g, left average speed in km/h, left maximum speed in km/h, left out time in seconds, left minimum out time in seconds, left in time in seconds, left minimum in time in seconds].",
                    "example": [
                      1603350935000,
                      1,
                      215.25,
                      320.5,
                      8.2,
                      9.7,
                      0.3,
                      0.2,
                      0.4,
                      0.25,
                      1,
                      210.75,
                      315,
                      8.1,
                      9.6,
                      0.31,
                      0.21,
                      0.41,
                      0.26
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The range is inverted or exceeds five hours"
          },
          "404": {
            "description": "The athlete does not exist in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Trainings": {
      "get": {
        "tags": [
          "Trainings"
        ],
        "summary": "List trainings visible in the selected club context",
        "description": "A training always belongs to its user; ClubId identifies only where it was performed.\r\nPass NextCursor or PrevCursor unchanged, preserving selection filters. Count, withTelemetry and withUser may change.\r\nWith telemetry, count defaults to 10 and is capped at 30; otherwise it defaults to 30 and is capped at 100.\r\nTelemetry and User are independent optional enrichments, not different resources or response envelopes.",
        "parameters": [
          {
            "name": "origin",
            "in": "query",
            "description": "Origin relative to this club: Club means performed here; Personal means owned by a current athlete but performed elsewhere or without a club; Any includes both.",
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/TrainingOrigin"
                }
              ],
              "default": "Any"
            }
          },
          {
            "name": "fromId",
            "in": "query",
            "description": "Inclusive ID filter; selects ascending ID order without date filters.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Inclusive ID filter; selects descending ID order when only this ID bound is supplied.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Inclusive ISO 8601 date/time range start.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Inclusive ISO 8601 date/time range end.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Page size: default 30, maximum 100. With withTelemetry=true, default 10 and maximum 30; larger values are capped.",
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 30
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "withTelemetry",
            "in": "query",
            "description": "Include Telemetry with all five series, empty when no samples are available. Default false.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "withUser",
            "in": "query",
            "description": "Include the current club athlete as User when available. Default false; historical owners who left the club have no User enrichment.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubTrainingDTOIClubQueryIdTSRangeResultDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The cursor or range is invalid, or ID and date/time filters are combined"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Trainings/{trainingId}": {
      "get": {
        "tags": [
          "Trainings"
        ],
        "summary": "Get a training visible in the selected club context",
        "description": "A training is visible when performed in this club or owned by a current athlete. Optional enrichments preserve the base DTO and do not bypass visibility checks.",
        "parameters": [
          {
            "name": "trainingId",
            "in": "path",
            "description": "The TrainingId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "withTelemetry",
            "in": "query",
            "description": "Include the available telemetry series in Telemetry. Default false.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "withUser",
            "in": "query",
            "description": "Include the current club athlete as User when available. Default false.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubTrainingDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "The training does not exist or is not visible to this club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/Trainings": {
      "get": {
        "tags": [
          "Trainings"
        ],
        "summary": "List trainings for a specified athlete of the selected club",
        "description": "A training always belongs to this athlete; ClubId identifies only where it was performed.\r\nSelection filters bind the cursor; count, withTelemetry and withUser may change during navigation.\r\nWith telemetry, count defaults to 10 and is capped at 30; otherwise it defaults to 30 and is capped at 100.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The athlete UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "origin",
            "in": "query",
            "description": "Origin relative to this club: Club, Personal or Any.",
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/TrainingOrigin"
                }
              ],
              "default": "Any"
            }
          },
          {
            "name": "fromId",
            "in": "query",
            "description": "Inclusive ID filter; selects ascending ID order without date filters.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Inclusive ID filter; selects descending ID order when only this ID bound is supplied.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Inclusive ISO 8601 date/time range start.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Inclusive ISO 8601 date/time range end.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Page size: default 30, maximum 100. With withTelemetry=true, default 10 and maximum 30; larger values are capped.",
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 30
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "withTelemetry",
            "in": "query",
            "description": "Include Telemetry with all five series. Default false.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "withUser",
            "in": "query",
            "description": "Include the current club athlete as User. Default false.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClubTrainingDTOIClubQueryIdTSRangeResultDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The cursor or range is invalid, or ID and date/time filters are combined"
          },
          "404": {
            "description": "The athlete does not exist in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Athletes/{userId}/UserSubscriptions": {
      "get": {
        "tags": [
          "UserSubscriptions"
        ],
        "summary": "List all memberships assigned to a specified athlete",
        "description": "This endpoint is not paginated and returns all of the athlete\u0027s UserSubscriptions in the selected club.",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The athlete UserId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserClassSubscriptionDTO"
                  }
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "The athlete does not exist in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/UserSubscriptions": {
      "get": {
        "tags": [
          "UserSubscriptions"
        ],
        "summary": "List memberships assigned to athletes of the selected club",
        "description": "Each result is a UserSubscription, that is, an assignment of a subscription product to an athlete.\r\nFor a complete forward traversal, start with \u0060fromId=1\u0060, then pass each returned NextCursor unchanged as cursor.",
        "parameters": [
          {
            "name": "fromId",
            "in": "query",
            "description": "Optional inclusive UserClassSubscriptionId range start.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Optional inclusive UserClassSubscriptionId range end.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Maximum number of results (default: 1000; maximum: 5000).",
            "schema": {
              "maximum": 5000,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 1000
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserClassSubscriptionDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The requested ID range is invalid"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      },
      "post": {
        "tags": [
          "UserSubscriptions"
        ],
        "summary": "Assign a subscription product to an athlete",
        "description": "When \u0060ClassSubscriptionPlanId\u0060 is supplied, the plan must belong to the specified subscription.\r\nRecurring plans are not supported by this endpoint. The validity interval must be at least one day;\r\n\u0060MaxActivities=0\u0060 represents an unlimited membership.",
        "requestBody": {
          "description": "The athlete, subscription, optional plan, validity interval, and activity limit.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateUserClassSubscriptionDTO"
              },
              "example": {
                "ClassSubscriptionId": 120,
                "UserId": 8472,
                "From": "2030-09-08T00:00:00\u002B02:00",
                "To": "2030-12-07T23:59:59\u002B01:00",
                "MaxActivities": 20
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserClassSubscriptionDTO"
                },
                "example": {
                  "UserClassSubscriptionId": 9021,
                  "ClassSubscriptionId": 120,
                  "UserId": 8472,
                  "From": "2030-09-08T00:00:00\u002B02:00",
                  "To": "2030-12-31T23:59:59\u002B01:00",
                  "MaxActivities": 24,
                  "AvailableActivities": 18,
                  "SuspensionState": "None",
                  "IsSuspended": false
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The request is invalid, the plan belongs to another subscription, or the plan is recurring"
          },
          "404": {
            "description": "The athlete, subscription, or plan does not exist in the selected club"
          },
          "500": {
            "description": "The membership could not be created because of an internal error"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/UserSubscriptions/Active": {
      "get": {
        "tags": [
          "UserSubscriptions"
        ],
        "summary": "List active memberships assigned to athletes of the selected club",
        "description": "A membership is active when it is not disabled or suspended, the current time is inside its From/To interval,\r\nand it either has unlimited activities (\u0060MaxActivities=0\u0060) or has activities available.\r\nFor a complete forward traversal, start with \u0060fromId=1\u0060, then pass each returned NextCursor unchanged as cursor.",
        "parameters": [
          {
            "name": "fromId",
            "in": "query",
            "description": "Optional inclusive UserClassSubscriptionId range start.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "toId",
            "in": "query",
            "description": "Optional inclusive UserClassSubscriptionId range end.",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Maximum number of results (default: 1000; maximum: 5000).",
            "schema": {
              "maximum": 5000,
              "minimum": 1,
              "type": "integer",
              "format": "int32",
              "default": 1000
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque NextCursor or PrevCursor returned by this endpoint. Keep the same endpoint and all original selection filters; replace cursor and optionally change count or response-enrichment options. Pass the token unchanged. Invalid tokens or changes to the club, endpoint, or filters return 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserClassSubscriptionDTOIClubQueryIdRangeResultDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The requested ID range is invalid"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/UserSubscriptions/Plans": {
      "post": {
        "tags": [
          "UserSubscriptions"
        ],
        "summary": "Assign a subscription to an athlete using a plan",
        "description": "The plan determines the subscription settings. Recurring plans are not supported by this endpoint.\r\nThe supplied From date must be between 2020-01-01 and 2100-01-01.",
        "requestBody": {
          "description": "The athlete, plan, and membership start date.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateUserClassSubscriptionFromPlanDTO"
              },
              "example": {
                "ClassSubscriptionPlanId": 34,
                "UserId": 8472,
                "From": "2030-09-08T00:00:00\u002B02:00"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserClassSubscriptionDTO"
                },
                "example": {
                  "UserClassSubscriptionId": 9021,
                  "ClassSubscriptionId": 120,
                  "UserId": 8472,
                  "From": "2030-09-08T00:00:00\u002B02:00",
                  "To": "2030-12-31T23:59:59\u002B01:00",
                  "MaxActivities": 24,
                  "AvailableActivities": 18,
                  "SuspensionState": "None",
                  "IsSuspended": false
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The request is invalid or the selected plan is recurring"
          },
          "404": {
            "description": "The athlete or plan does not exist in the selected club"
          },
          "500": {
            "description": "The membership could not be created because of an internal error"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/UserSubscriptions/{userSubscriptionId}": {
      "get": {
        "tags": [
          "UserSubscriptions"
        ],
        "summary": "Get a membership assigned to an athlete",
        "description": "Returns 404 both when the membership is absent and when its subscription product belongs to another club.",
        "parameters": [
          {
            "name": "userSubscriptionId",
            "in": "path",
            "description": "The UserClassSubscriptionId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserClassSubscriptionDTO"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "The membership does not exist in the selected club"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      },
      "put": {
        "tags": [
          "UserSubscriptions"
        ],
        "summary": "Update a membership assigned to an athlete",
        "description": "The validity interval must be at least one day and activity counts must remain consistent.\r\nRecurring memberships do not allow changing the start date or maximum activities.\r\nManage the suspension lifecycle through\r\n\u0060POST /UserSubscriptions/{userSubscriptionId}/Suspension\u0060 and\r\n\u0060DELETE /UserSubscriptions/{userSubscriptionId}/Suspension\u0060. Existing integrations can still send\r\n\u0060IsSuspended\u0060 and \u0060ReactivationDate\u0060; omitting them preserves any scheduled or active suspension.",
        "parameters": [
          {
            "name": "userSubscriptionId",
            "in": "path",
            "description": "The UserClassSubscriptionId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "The updated validity, activity-limit, and optional suspension compatibility values.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserSubscriptionDTO"
              },
              "example": {
                "From": "2030-09-08T00:00:00\u002B02:00",
                "To": "2030-12-31T23:59:59\u002B01:00",
                "MaxActivities": 24,
                "AvailableActivities": 18
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserClassSubscriptionDTO"
                },
                "example": {
                  "UserClassSubscriptionId": 9021,
                  "ClassSubscriptionId": 120,
                  "UserId": 8472,
                  "From": "2030-09-08T00:00:00\u002B02:00",
                  "To": "2030-12-31T23:59:59\u002B01:00",
                  "MaxActivities": 24,
                  "AvailableActivities": 18,
                  "SuspensionState": "None",
                  "IsSuspended": false
                }
              }
            }
          },
          "409": {
            "description": "The membership has active class bookings and cannot be suspended",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorDTO"
                },
                "example": {
                  "ErrorType": "SubscriptionInUse",
                  "Message": "The membership has class bookings in the affected period."
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "The supplied values violate membership validation or recurring-plan rules"
          },
          "404": {
            "description": "The membership does not exist in the selected club"
          },
          "500": {
            "description": "The membership could not be updated because of an internal error"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      },
      "delete": {
        "tags": [
          "UserSubscriptions"
        ],
        "summary": "Delete a membership assigned to an athlete",
        "description": "A membership with active class bookings cannot be deleted.",
        "parameters": [
          {
            "name": "userSubscriptionId",
            "in": "path",
            "description": "The UserClassSubscriptionId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserClassSubscriptionDTO"
                }
              }
            }
          },
          "409": {
            "description": "The membership has active class bookings",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorDTO"
                },
                "example": {
                  "ErrorType": "SubscriptionInUse",
                  "Message": "The membership has class bookings in the affected period."
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "The membership does not exist in the selected club"
          },
          "500": {
            "description": "The membership could not be deleted because of an internal error"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/UserSubscriptions/{userSubscriptionId}/Suspension": {
      "post": {
        "tags": [
          "UserSubscriptions"
        ],
        "summary": "Schedule, start, or update a membership suspension",
        "description": "\u0060SuspensionStartDate\u0060 and \u0060SuspensionEndDate\u0060 are calendar dates in the selected club\u0027s time zone. Omit\r\n            \u0060SuspensionStartDate\u0060 to suspend immediately, or supply today for the same result. A future suspension\r\n            requires an end and becomes effective at the beginning of \u0060SuspensionStartDate\u0060. \u0060SuspensionEndDate\u0060 is\r\n            inclusive: automatic reactivation occurs at the beginning of the following local day.\r\n            Suspensions can last from one through 365 calendar days. Sending this operation again updates a\r\n            scheduled suspension or the end of an active suspension; the start of an active suspension cannot\r\n            be changed. A suspension cannot overlap an existing class booking. Future suspensions are not supported\r\n            for externally managed recurring memberships.",
        "parameters": [
          {
            "name": "userSubscriptionId",
            "in": "path",
            "description": "The UserClassSubscriptionId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "requestBody": {
          "description": "The local suspension dates.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubscriptionSuspensionDTO"
              },
              "example": {
                "SuspensionStartDate": "2030-10-01",
                "SuspensionEndDate": "2030-10-14"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated UserSubscription, including its current SuspensionState",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserClassSubscriptionDTO"
                },
                "example": {
                  "UserClassSubscriptionId": 9021,
                  "ClassSubscriptionId": 120,
                  "UserId": 8472,
                  "From": "2030-09-08T00:00:00\u002B02:00",
                  "To": "2030-12-31T23:59:59\u002B01:00",
                  "MaxActivities": 24,
                  "AvailableActivities": 18,
                  "SuspensionState": "None",
                  "IsSuspended": false
                }
              }
            }
          },
          "400": {
            "description": "The dates or membership state do not allow the requested suspension"
          },
          "409": {
            "description": "A class booking overlaps the requested suspension period",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorDTO"
                },
                "example": {
                  "ErrorType": "SubscriptionInUse",
                  "Message": "The membership has class bookings in the affected period."
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "The membership does not exist in the selected club"
          },
          "500": {
            "description": "The suspension could not be saved because of an internal error"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      },
      "delete": {
        "tags": [
          "UserSubscriptions"
        ],
        "summary": "Cancel a scheduled suspension or immediately reactivate a suspended membership",
        "description": "Cancelling a future suspension clears its dates without changing the membership validity interval.\r\nReactivating an active suspension clears it immediately and can move \u0060To\u0060 forward to preserve\r\nthe time during which the membership was paused. Persist the returned representation. This operation\r\nis idempotent: when no suspension exists, it returns the current UserSubscription without changes.",
        "parameters": [
          {
            "name": "userSubscriptionId",
            "in": "path",
            "description": "The UserClassSubscriptionId.",
            "required": true,
            "schema": {
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The current UserSubscription after cancellation or reactivation",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserClassSubscriptionDTO"
                },
                "example": {
                  "UserClassSubscriptionId": 9021,
                  "ClassSubscriptionId": 120,
                  "UserId": 8472,
                  "From": "2030-09-08T00:00:00\u002B02:00",
                  "To": "2030-12-31T23:59:59\u002B01:00",
                  "MaxActivities": 24,
                  "AvailableActivities": 18,
                  "SuspensionState": "None",
                  "IsSuspended": false
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "The membership does not exist in the selected club"
          },
          "500": {
            "description": "The suspension could not be removed because of an internal error"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Webhooks/Subscriptions": {
      "get": {
        "tags": [
          "Webhooks"
        ],
        "summary": "List webhook subscriptions for the selected club",
        "description": "Only subscriptions belonging to the club selected by the Club API Key are returned. The response is a\r\nnon-paginated array; an empty array means that the selected club has no webhook subscriptions.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UptivoWebHookSubscriptionDTO"
                  }
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "502": {
            "description": "Unexpected webhook service error"
          },
          "503": {
            "description": "Webhook service temporarily unavailable"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      },
      "post": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Create a webhook subscription for the selected club",
        "description": "The destination must be a fully qualified HTTP or HTTPS URL. \u0060EventTypes\u0060 must contain at least one\r\nsupported, case-sensitive event name and cannot contain unknown names. Creation immediately starts endpoint\r\nvalidation, so the destination must already handle the webhook subscription validation handshake. A\r\nsuccessful operation returns 200 with the created subscription and its generated \u0060SubscriptionId\u0060.",
        "requestBody": {
          "description": "The destination URL and event types.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UptivoWebHookSubscriptionCreateDTO"
              },
              "example": {
                "Url": "https://integrator.example.com/uptivo/events",
                "EventTypes": [
                  "Athlete.Created",
                  "Athlete.Updated"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UptivoWebHookSubscriptionDTO"
                },
                "example": {
                  "Url": "https://integrator.example.com/uptivo/events",
                  "EventTypes": [
                    "Athlete.Created",
                    "Athlete.Updated"
                  ],
                  "SubscriptionId": "club-42-events",
                  "ProvisioningState": "Succeeded"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "Invalid webhook request"
          },
          "409": {
            "description": "Webhook creation conflicts with its current state"
          },
          "502": {
            "description": "Unexpected webhook service error"
          },
          "503": {
            "description": "Webhook service temporarily unavailable"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    },
    "/Webhooks/Subscriptions/{subscriptionId}": {
      "put": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Partially update a webhook subscription",
        "description": "Supply at least one of \u0060Url\u0060 or \u0060EventTypes\u0060. A supplied URL must be fully qualified HTTP or HTTPS;\r\na supplied event set replaces the complete current set, must be non-empty, and can contain only supported,\r\ncase-sensitive names. Omitted properties retain their current value. Changing \u0060Url\u0060 can trigger endpoint\r\nvalidation of the new destination.",
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "description": "The webhook subscription identifier.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "The destination URL and/or event types to replace.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UptivoWebHookSubscriptionUpdateDTO"
              },
              "example": {
                "EventTypes": [
                  "Athlete.Created",
                  "Athlete.Updated",
                  "Training.Created"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UptivoWebHookSubscriptionDTO"
                },
                "example": {
                  "Url": "https://integrator.example.com/uptivo/events",
                  "EventTypes": [
                    "Athlete.Created",
                    "Athlete.Updated"
                  ],
                  "SubscriptionId": "club-42-events",
                  "ProvisioningState": "Succeeded"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "400": {
            "description": "Invalid webhook request"
          },
          "404": {
            "description": "Webhook subscription not found in the club"
          },
          "409": {
            "description": "Webhook update conflicts with its current state"
          },
          "502": {
            "description": "Unexpected webhook service error"
          },
          "503": {
            "description": "Webhook service temporarily unavailable"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      },
      "get": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Get a webhook subscription of the selected club",
        "description": "Returns 404 when the identifier is absent or belongs to another club. Inspect \u0060ProvisioningState\u0060 before\r\nassuming the subscription is active; \u0060Succeeded\u0060 is the normal active state.",
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "description": "The webhook subscription identifier.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UptivoWebHookSubscriptionDTO"
                },
                "example": {
                  "Url": "https://integrator.example.com/uptivo/events",
                  "EventTypes": [
                    "Athlete.Created",
                    "Athlete.Updated"
                  ],
                  "SubscriptionId": "club-42-events",
                  "ProvisioningState": "Succeeded"
                }
              }
            }
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "Webhook subscription not found in the club"
          },
          "502": {
            "description": "Unexpected webhook service error"
          },
          "503": {
            "description": "Webhook service temporarily unavailable"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Delete a webhook subscription of the selected club",
        "description": "A successful deletion returns 200 with no response body.",
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "description": "The webhook subscription identifier.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "description": "The Subscription Key or Club API Key is missing or invalid"
          },
          "403": {
            "description": "The Club API license is inactive or the Club API Key does not grant the required permission"
          },
          "404": {
            "description": "Webhook subscription not found in the club"
          },
          "409": {
            "description": "Webhook deletion conflicts with its current state"
          },
          "502": {
            "description": "Unexpected webhook service error"
          },
          "503": {
            "description": "Webhook service temporarily unavailable"
          }
        },
        "security": [
          {
            "ClubApiKey": [],
            "SubscriptionKey": []
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "ActivityType": {
        "enum": [
          "Unspecified",
          "Running",
          "Cycling",
          "Walking",
          "MountainBiking",
          "CrossCountrySkiing",
          "DownhillSkiing",
          "FunctionalTraining",
          "Rowing",
          "NordicWalking",
          "Skating",
          "Hiking",
          "Tennis",
          "Squash",
          "WeightTraining",
          "OtherWithGPS",
          "OtherWithoutGPS",
          "TreadmillRunning",
          "IndoorCycling",
          "IndoorWalking",
          "HIIT",
          "IndoorRowing",
          "AquaCycling",
          "WaterAerobics",
          "Yoga",
          "Zumba",
          "Basketball",
          "Volleyball",
          "Kayak",
          "Bootcamp",
          "Calisthenics",
          "ClimbingOutdoor",
          "ClimbingIndoor",
          "Crossfit",
          "Dancing",
          "EMS",
          "Fitboxing",
          "CombatFitness",
          "Padel",
          "PersonalTraining",
          "Pilates",
          "Swimming",
          "Trampoline",
          "PoleDance",
          "GAG",
          "Fencing",
          "Soccer",
          "ZRFit",
          "ZRStrong",
          "ZRBooster",
          "ZRBilanInBody",
          "ZRHypericeExperience",
          "UnspecifiedService",
          "Osteopathy",
          "MassageTherapy",
          "Nutrition",
          "BioMeasurements",
          "Orthopedics",
          "Manicure",
          "Pedicure",
          "HairRemoval",
          "BodyCare",
          "FacialCleansing",
          "BodyMassages",
          "Solarium",
          "AntiCelluliteTreatment",
          "Cryotherapy",
          "PosturalAssessment",
          "Switching",
          "Golf",
          "Elliptical",
          "Strafit",
          "HorseRiding",
          "Dressage",
          "ShowJumping",
          "Postural",
          "BlastJump",
          "Boxing",
          "HybridTraining",
          "ATHX",
          "Motorcycling"
        ],
        "type": "string"
      },
      "AddClassParticipantRequestDTO": {
        "required": [
          "UserId"
        ],
        "type": "object",
        "properties": {
          "UserId": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "description": "The UserId of an athlete in the selected club.",
            "format": "int32"
          },
          "Mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ClassParticipantMode"
              }
            ],
            "description": "Whether the athlete participates locally or remotely.",
            "default": "InSite"
          },
          "Trial": {
            "type": "boolean",
            "description": "Marks this booking as a trial participation.",
            "default": false
          },
          "PaymentMode": {
            "type": "string",
            "allOf": [
              {
                "$ref": "#/components/schemas/AddParticipantPaymentMode"
              }
            ],
            "description": "Payment method. When omitted, Auto prefers a valid subscription and falls back to credits.",
            "default": "Auto",
            "nullable": true
          },
          "DisableMedicalCertificateCheck": {
            "type": "boolean",
            "description": "Bypass the medical-certificate requirement.",
            "default": false
          },
          "DisableMembershipCheck": {
            "type": "boolean",
            "description": "Bypass the valid membership-expiration requirement configured by the club.",
            "default": false
          },
          "DisableQueue": {
            "type": "boolean",
            "description": "Reject the request instead of placing the athlete in the queue when the class is full.",
            "default": false
          },
          "DisableClassCostsCheck": {
            "type": "boolean",
            "description": "Bypass validation that the athlete has enough credits or a usable subscription; configured class costs still apply.",
            "default": false
          },
          "DisablePolicyCheck": {
            "type": "boolean",
            "description": "Bypass the requirement to accept the club purchase policies.",
            "default": false
          },
          "DisableClubBookingLimitsCheck": {
            "type": "boolean",
            "description": "Bypass the club weekly and monthly booking limits.",
            "default": false
          },
          "DisableDateTimeChecks": {
            "type": "boolean",
            "description": "Bypass class visibility, booking deadline, start, and end time checks.",
            "default": false
          },
          "DisableUserNoBookingsCheck": {
            "type": "boolean",
            "description": "Bypass an athlete-level booking restriction.",
            "default": false
          }
        },
        "additionalProperties": false,
        "description": "Booking request for an athlete in the selected club. UserId is required; all other properties use the documented defaults when omitted."
      },
      "AddParticipantPaymentMode": {
        "enum": [
          "Credits",
          "Subscription",
          "Auto"
        ],
        "type": "string",
        "description": "Payment source to use when booking a class.",
        "x-enumDescriptions": [
          "Use the athlete\u0027s club credit balance.",
          "Use a valid membership accepted by the class.",
          "Prefer a valid membership, then fall back to credits."
        ],
        "x-enumDeprecated": [
          false,
          false,
          false
        ]
      },
      "ApiErrorDTO": {
        "required": [
          "ErrorType"
        ],
        "type": "object",
        "properties": {
          "ErrorType": {
            "$ref": "#/components/schemas/ApiErrorType"
          },
          "Message": {
            "type": "string",
            "description": "Optional human-readable diagnostic detail. The text is not a stable programmatic contract.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Structured application error returned by selected Club API operations. ErrorType is the stable machine-readable identifier;\r\nMessage is optional diagnostic text and must not be used as a programmatic contract.",
        "example": {
          "ErrorType": "ClassFull",
          "Message": "The class is full for the requested attendance mode."
        }
      },
      "ApiErrorType": {
        "enum": [
          "Internal",
          "LicenseResourceLimitExceeded",
          "ClassNotPublished",
          "Conflict",
          "ClassNotBookable",
          "ClassFull",
          "NotEnoughCredits",
          "ClassBookingIsPastDue",
          "ClassBookingIsEarly",
          "CancelTimeIsPastDue",
          "ClassHasStarted",
          "ClassIsFinished",
          "SubscriptionInUse",
          "NoValidSubscriptions",
          "SubscriptionLimitsExceeded",
          "InvalidPaymentOption",
          "ClubLimitsExceeded",
          "AthleteBookingDisabled",
          "RequiredMedicalCertificate",
          "RequiredMembership",
          "PoliciesNotAccepted",
          "InvalidData",
          "EmailAlreadyInUse"
        ],
        "type": "string",
        "description": "Machine-readable error codes that can be returned by Club API operations."
      },
      "AthleteEngagementBadgeDTO": {
        "type": "object",
        "properties": {
          "AchievedBadgeId": {
            "type": "integer",
            "format": "int32"
          },
          "BadgeId": {
            "type": "integer",
            "format": "int32"
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "PictureUri": {
            "type": "string",
            "nullable": true,
            "readOnly": true
          },
          "AwardedAt": {
            "type": "string",
            "format": "date-time"
          },
          "Details": {
            "type": "string",
            "description": "Stored award details, including the challenge or award reason when present.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AthleteEngagementBrandLevelDTO": {
        "type": "object",
        "properties": {
          "BrandId": {
            "type": "integer",
            "format": "int32"
          },
          "Level": {
            "type": "integer",
            "format": "int32"
          },
          "Name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AthleteEngagementTotalsDTO": {
        "type": "object",
        "properties": {
          "Trainings": {
            "type": "integer",
            "format": "int32"
          },
          "Points": {
            "type": "integer",
            "description": "UPP earned by the athlete.",
            "format": "int32"
          },
          "Calories": {
            "type": "integer",
            "format": "int32"
          },
          "DurationSecs": {
            "type": "integer",
            "format": "int32"
          },
          "Distance": {
            "type": "integer",
            "description": "Total distance in meters.",
            "format": "int32"
          },
          "TargetZoneTimeSecs": {
            "type": "integer",
            "format": "int32"
          },
          "HitsACount": {
            "type": "integer",
            "format": "int32"
          },
          "HitsPoints": {
            "type": "integer",
            "format": "int32"
          },
          "ClubPoints": {
            "type": "integer",
            "description": "UPP earned in any club, not exclusively the selected club.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "All personal activity, including activity outside the selected club. Missing aggregates return zeroes."
      },
      "BillingInterval": {
        "enum": [
          "None",
          "Day",
          "Month",
          "Year"
        ],
        "type": "string"
      },
      "BrandLevelSource": {
        "enum": [
          "None",
          "Club",
          "All"
        ],
        "type": "string"
      },
      "CalendarType": {
        "enum": [
          "Club",
          "PT",
          "Services"
        ],
        "type": "string",
        "description": "Class calendar type accepted by the Club API."
      },
      "ChallengeAssignmentMode": {
        "enum": [
          "Athletes",
          "Open",
          "Invite"
        ],
        "type": "string"
      },
      "ClassParticipantMode": {
        "enum": [
          "InSite",
          "Remote"
        ],
        "type": "string",
        "description": "How an athlete attends a class.",
        "x-enumDescriptions": [
          "The athlete attends at the club location.",
          "The athlete attends through the remote live session."
        ],
        "x-enumDeprecated": [
          false,
          false
        ]
      },
      "ClassParticipantOpResultDTO": {
        "type": "object",
        "properties": {
          "CreditsCost": {
            "type": "integer",
            "description": "Credits charged by the operation; zero when credits were not used.",
            "format": "int32"
          },
          "TotalCredits": {
            "type": "integer",
            "description": "The athlete\u0027s remaining credit balance after the operation.",
            "format": "int32"
          },
          "AvailableActivities": {
            "type": "integer",
            "description": "Remaining activities when a membership was used.",
            "format": "int32",
            "nullable": true
          },
          "MaxActivities": {
            "type": "integer",
            "description": "Maximum activities of the membership used; zero means unlimited.",
            "format": "int32",
            "nullable": true
          },
          "UserClassSubscriptionId": {
            "type": "integer",
            "description": "The membership assignment used for payment, when applicable.",
            "format": "int32",
            "nullable": true
          },
          "ClassSubscriptionId": {
            "type": "integer",
            "description": "The subscription product used for payment, when applicable.",
            "format": "int32",
            "nullable": true
          },
          "ClassId": {
            "type": "integer",
            "description": "The ClassId.",
            "format": "int32"
          },
          "UserId": {
            "type": "integer",
            "description": "The participant\u0027s UserId.",
            "format": "int32"
          },
          "CreatedAtUtc": {
            "type": "string",
            "description": "Creation time in UTC. It determines the ordering of queued athletes.",
            "format": "date-time"
          },
          "Mode": {
            "$ref": "#/components/schemas/ClassParticipantMode"
          },
          "State": {
            "$ref": "#/components/schemas/ClassParticipantState"
          },
          "NoShow": {
            "type": "boolean",
            "description": "Whether Uptivo marks the participation as a no-show."
          },
          "Trial": {
            "type": "boolean",
            "description": "Whether the participation is treated as a trial."
          },
          "ActorId": {
            "type": "integer",
            "description": "UserId of the operation actor, when available.",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ClassParticipantState": {
        "enum": [
          "Participant",
          "InQueue"
        ],
        "type": "string",
        "x-enumDescriptions": [
          "The athlete has a confirmed place.",
          "The athlete is waiting for a place in the queue."
        ],
        "x-enumDeprecated": [
          false,
          false
        ]
      },
      "ClassSubscriptionPlanForListDTO": {
        "type": "object",
        "properties": {
          "UnitMultiplier": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          },
          "ClassSubscriptionPlanId": {
            "type": "integer",
            "format": "int32"
          },
          "DurationDays": {
            "maximum": 36500,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "MaxActivities": {
            "maximum": 100,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "Amount": {
            "type": "integer",
            "format": "int32"
          },
          "Currency": {
            "type": "string",
            "nullable": true
          },
          "Interval": {
            "$ref": "#/components/schemas/BillingInterval"
          },
          "IntervalCount": {
            "maximum": 90,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "Iterations": {
            "maximum": 24,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ClassSubscriptionType": {
        "enum": [
          "Other",
          "Trial",
          "Membership"
        ],
        "type": "string"
      },
      "ClassType": {
        "enum": [
          "Course",
          "Single",
          "Group"
        ],
        "type": "string"
      },
      "ClientStage": {
        "enum": [
          "Lead",
          "Qualified",
          "Prospect",
          "Client"
        ],
        "type": "string"
      },
      "ClubActivityForCalendarDTO": {
        "required": [
          "ClassId",
          "Name",
          "Begin",
          "End",
          "ActivityType",
          "Color",
          "PictureUri",
          "TrainerId",
          "TrainerName",
          "TrainerPictureUri",
          "CreditsCostLocal",
          "CreditsCostRemote",
          "TicketsCostLocal",
          "TicketsCostRemote",
          "MaxLocalParticipants",
          "MaxRemoteParticipants"
        ],
        "type": "object",
        "properties": {
          "ClassId": {
            "minimum": 1,
            "type": "integer",
            "description": "Stable Class identifier used by participant operations and webhook events.",
            "format": "int32"
          },
          "Name": {
            "maxLength": 64,
            "minLength": 1,
            "type": "string"
          },
          "Description": {
            "maxLength": 4096,
            "type": "string",
            "description": "Class description. Present only when withDescriptions is true.",
            "nullable": true
          },
          "Begin": {
            "type": "string",
            "description": "Class start as an absolute instant.",
            "format": "date-time"
          },
          "End": {
            "type": "string",
            "description": "Class end as an absolute instant.",
            "format": "date-time"
          },
          "ActivityType": {
            "$ref": "#/components/schemas/ActivityType"
          },
          "Color": {
            "maxLength": 12,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "PictureUri": {
            "maxLength": 256,
            "type": "string",
            "format": "uri",
            "nullable": true
          },
          "TrainerId": {
            "minimum": 1,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "TrainerName": {
            "maxLength": 64,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "TrainerPictureUri": {
            "maxLength": 256,
            "type": "string",
            "format": "uri",
            "nullable": true
          },
          "CreditsCostLocal": {
            "maximum": 1000,
            "minimum": 0,
            "type": "integer",
            "description": "Club credits charged for in-site attendance.",
            "format": "int32"
          },
          "CreditsCostRemote": {
            "maximum": 1000,
            "minimum": 0,
            "type": "integer",
            "description": "Club credits charged for remote attendance.",
            "format": "int32"
          },
          "TicketsCostLocal": {
            "maximum": 1000,
            "minimum": 0,
            "type": "integer",
            "description": "Activities consumed from a limited UserSubscription for in-site attendance.",
            "format": "int32"
          },
          "TicketsCostRemote": {
            "maximum": 1000,
            "minimum": 0,
            "type": "integer",
            "description": "Activities consumed from a limited UserSubscription for remote attendance.",
            "format": "int32"
          },
          "MaxLocalParticipants": {
            "maximum": 100,
            "minimum": 0,
            "type": "integer",
            "description": "Maximum confirmed participants attending in site.",
            "format": "int32"
          },
          "MaxRemoteParticipants": {
            "maximum": 200,
            "minimum": 0,
            "type": "integer",
            "description": "Maximum confirmed remote participants.",
            "format": "int32"
          },
          "LocalSubscriptionIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Subscription product IDs accepted for in-site attendance. Present only when withSubscriptions is true.",
            "nullable": true
          },
          "RemoteSubscriptionIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Subscription product IDs accepted for remote attendance. Present only when withSubscriptions is true.",
            "nullable": true
          },
          "ParticipantUserIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Confirmed participant UserIds. Present only when withParticipants is true; queued athletes are excluded.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Published class returned by a Club API calendar operation. Description, subscription IDs, and participant IDs are optional and appear only when requested."
      },
      "ClubActivityForCalendarDTOIClubQueryIdTSRangeResultDTO": {
        "type": "object",
        "properties": {
          "Results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClubActivityForCalendarDTO"
            },
            "description": "Results from the query",
            "nullable": true
          },
          "Continue": {
            "type": "boolean",
            "description": "If max number of results have been returned, a new query may be required to retrieve remaining data"
          },
          "NextId": {
            "type": "integer",
            "description": "If navigating in ascending order, this is the next Id value (fromId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "PrevId": {
            "type": "integer",
            "description": "If navigating in descending order, this is the previous Id value (toId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "NextDateTime": {
            "type": "string",
            "description": "If navigating in ascending order, this is the next date/time value (from) to use for fetch more data",
            "format": "date-time",
            "nullable": true
          },
          "PrevDateTime": {
            "type": "string",
            "description": "If navigating in descending order, this is the previous date/time value (to) to use for fetch more data",
            "format": "date-time",
            "nullable": true
          },
          "NextCursor": {
            "type": "string",
            "description": "Opaque cursor towards larger IDs or newer Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "PrevCursor": {
            "type": "string",
            "description": "Opaque cursor towards smaller IDs or older Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ClubApiAuthCheckDTO": {
        "type": "object",
        "properties": {
          "ClubId": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ClubAthleteCreateDTO": {
        "required": [
          "Email"
        ],
        "type": "object",
        "properties": {
          "Email": {
            "maxLength": 254,
            "minLength": 1,
            "type": "string",
            "format": "email",
            "example": "user@emailsample.com"
          },
          "UserConfirmed": {
            "type": "boolean",
            "description": "Add the user as a club member without an Uptivo confirmation flow. The club must collect consent separately."
          },
          "EmailVerified": {
            "type": "boolean",
            "description": "Indicates that the supplied email address has already been verified. When the Uptivo user already exists,\r\ntrue promotes the existing address to verified; false never removes an existing verification."
          },
          "ShowPasswordOnCreate": {
            "type": "boolean",
            "description": "Return the generated password when a new Uptivo user is created."
          },
          "SetPasswordOnCreate": {
            "maxLength": 16,
            "minLength": 6,
            "type": "string",
            "description": "Password to assign when a new Uptivo user is created.",
            "nullable": true
          },
          "NoEmailOnCreate": {
            "type": "boolean",
            "description": "Suppress the account-creation email. The user will need to recover the password if none is supplied."
          },
          "UptivoLevel": {
            "type": "integer",
            "description": "Optional starting Uptivo level. Zero selects the default level.",
            "format": "int32"
          },
          "Sensors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ImportSensorDTO"
            },
            "description": "Sensors to associate with the athlete during creation or import. Existing associations are preserved,\r\nand a sensor already associated with the same user is not duplicated.",
            "nullable": true
          },
          "BirthDate": {
            "type": "string",
            "description": "The athlete\u0027s calendar date of birth. Use YYYY-MM-DD. Time and timezone are not part of this value.\r\nThe legacy YYYY-MM-DDT00:00:00 input format is deprecated and will be removed by December 2026.",
            "format": "date",
            "nullable": true
          },
          "FirstMidName": {
            "maxLength": 32,
            "type": "string",
            "nullable": true
          },
          "LastName": {
            "maxLength": 32,
            "type": "string",
            "nullable": true
          },
          "Nickname": {
            "maxLength": 32,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "Gender": {
            "$ref": "#/components/schemas/Gender"
          },
          "Weight": {
            "maximum": 600,
            "minimum": 10,
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "Height": {
            "maximum": 250,
            "minimum": 60,
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "Phone": {
            "maxLength": 16,
            "type": "string",
            "format": "tel",
            "nullable": true
          },
          "TaxId": {
            "maxLength": 64,
            "minLength": 2,
            "type": "string",
            "nullable": true
          },
          "Address1": {
            "maxLength": 48,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "Address2": {
            "maxLength": 48,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "Zone": {
            "maxLength": 32,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "PostalCode": {
            "maxLength": 16,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "City": {
            "maxLength": 32,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "CountryCode": {
            "maxLength": 3,
            "type": "string",
            "nullable": true
          },
          "TimeZoneCode": {
            "maxLength": 32,
            "type": "string",
            "nullable": true
          },
          "UnitsSystem": {
            "$ref": "#/components/schemas/UnitsSystem"
          },
          "Language": {
            "$ref": "#/components/schemas/Language"
          },
          "FirstDayOfWeek": {
            "$ref": "#/components/schemas/DayOfWeek"
          },
          "DateFormat": {
            "$ref": "#/components/schemas/DateFormat"
          },
          "TimeFormat": {
            "$ref": "#/components/schemas/TimeFormat"
          },
          "Occupation": {
            "maxLength": 32,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "FitnessGoals": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "InjuriesHistory": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "ToAvoid": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "CustomHBZones": {
            "type": "boolean",
            "nullable": true
          },
          "Zone0Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "Zone1Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "Zone2Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "Zone3Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "Zone4Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "Zone5Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "CustomTargetZone": {
            "type": "boolean",
            "nullable": true
          },
          "TargetZoneLowBpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "TargetZoneHighBpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "WarningHighBpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "CustomCyclingFTP": {
            "type": "boolean",
            "nullable": true
          },
          "CyclingFTP": {
            "maximum": 1000,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "DefaultTrainingType": {
            "$ref": "#/components/schemas/TrainingType"
          }
        },
        "additionalProperties": false,
        "description": "Create or import an athlete. Email is the only unconditionally required property. Omitted locale and formatting settings inherit the selected club defaults; explicitly supplied values override those defaults."
      },
      "ClubAthleteCreateResultDTO": {
        "type": "object",
        "properties": {
          "Result": {
            "$ref": "#/components/schemas/UserImportResultState"
          },
          "User": {
            "$ref": "#/components/schemas/ClubAthleteDTO"
          },
          "Password": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ClubAthleteDTO": {
        "required": [
          "UserId",
          "Email",
          "FirstMidName",
          "LastName",
          "Nickname",
          "Gender",
          "Weight",
          "Height",
          "Phone",
          "TaxId",
          "PictureUri",
          "Address1",
          "Address2",
          "Zone",
          "PostalCode",
          "City",
          "CountryCode",
          "TimeZoneCode",
          "UnitsSystem",
          "Language",
          "FirstDayOfWeek",
          "DateFormat",
          "TimeFormat",
          "Occupation",
          "FitnessGoals",
          "InjuriesHistory",
          "ToAvoid",
          "CustomHBZones",
          "Zone0Bpm",
          "Zone1Bpm",
          "Zone2Bpm",
          "Zone3Bpm",
          "Zone4Bpm",
          "Zone5Bpm",
          "CustomTargetZone",
          "TargetZoneLowBpm",
          "TargetZoneHighBpm",
          "WarningHighBpm",
          "CustomCyclingFTP",
          "CyclingFTP",
          "DefaultTrainingType",
          "IsDemo",
          "JoinMode",
          "IsGuest",
          "CreatedAt",
          "QualifiedUtc",
          "ProspectUtc",
          "ClientUtc",
          "ClientStage"
        ],
        "type": "object",
        "properties": {
          "UserId": {
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "Email": {
            "type": "string",
            "nullable": true
          },
          "BirthDate": {
            "type": "string",
            "description": "Calendar date of birth for a real athlete. Omitted for demo athletes, which expose Age instead.",
            "format": "date",
            "nullable": true
          },
          "FirstMidName": {
            "type": "string",
            "nullable": true
          },
          "LastName": {
            "type": "string",
            "nullable": true
          },
          "Nickname": {
            "type": "string",
            "nullable": true
          },
          "Gender": {
            "$ref": "#/components/schemas/Gender"
          },
          "Weight": {
            "maximum": 600,
            "minimum": 10,
            "type": "number",
            "format": "double"
          },
          "Height": {
            "maximum": 250,
            "minimum": 60,
            "type": "number",
            "format": "double"
          },
          "Phone": {
            "type": "string",
            "nullable": true
          },
          "TaxId": {
            "type": "string",
            "nullable": true
          },
          "PictureUri": {
            "type": "string",
            "nullable": true
          },
          "Address1": {
            "type": "string",
            "nullable": true
          },
          "Address2": {
            "type": "string",
            "nullable": true
          },
          "Zone": {
            "type": "string",
            "nullable": true
          },
          "PostalCode": {
            "type": "string",
            "nullable": true
          },
          "City": {
            "type": "string",
            "nullable": true
          },
          "CountryCode": {
            "type": "string",
            "nullable": true
          },
          "TimeZoneCode": {
            "type": "string",
            "nullable": true
          },
          "UnitsSystem": {
            "$ref": "#/components/schemas/UnitsSystem"
          },
          "Language": {
            "$ref": "#/components/schemas/Language"
          },
          "FirstDayOfWeek": {
            "$ref": "#/components/schemas/DayOfWeek"
          },
          "DateFormat": {
            "$ref": "#/components/schemas/DateFormat"
          },
          "TimeFormat": {
            "$ref": "#/components/schemas/TimeFormat"
          },
          "Occupation": {
            "type": "string",
            "nullable": true
          },
          "FitnessGoals": {
            "type": "string",
            "nullable": true
          },
          "InjuriesHistory": {
            "type": "string",
            "nullable": true
          },
          "ToAvoid": {
            "type": "string",
            "nullable": true
          },
          "CustomHBZones": {
            "type": "boolean"
          },
          "Zone0Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "Zone1Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "Zone2Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "Zone3Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "Zone4Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "Zone5Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "CustomTargetZone": {
            "type": "boolean"
          },
          "TargetZoneLowBpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "TargetZoneHighBpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "WarningHighBpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "CustomCyclingFTP": {
            "type": "boolean"
          },
          "CyclingFTP": {
            "maximum": 1000,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "DefaultTrainingType": {
            "$ref": "#/components/schemas/TrainingType"
          },
          "IsDemo": {
            "type": "boolean"
          },
          "JoinMode": {
            "$ref": "#/components/schemas/ClubJoinMode"
          },
          "IsGuest": {
            "type": "boolean"
          },
          "CreatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "QualifiedUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "ProspectUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "ClientUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "ClientStage": {
            "$ref": "#/components/schemas/ClientStage"
          },
          "Age": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Athlete data in the selected club context. Profile properties belong to the global Uptivo user and are consistent across clubs; membership properties describe only the relationship with the selected club. Real athletes expose BirthDate as a calendar date; demo athletes expose Age instead."
      },
      "ClubAthleteDTOIClubQueryIdRangeResultDTO": {
        "type": "object",
        "properties": {
          "NextCursor": {
            "type": "string",
            "description": "Opaque cursor towards larger IDs or newer Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "PrevCursor": {
            "type": "string",
            "description": "Opaque cursor towards smaller IDs or older Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "NextId": {
            "type": "integer",
            "description": "If navigating in ascending order, this is the next Id value (fromId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "PrevId": {
            "type": "integer",
            "description": "If navigating in descending order, this is the previous Id value (toId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "Results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClubAthleteDTO"
            },
            "description": "Results from the query",
            "nullable": true
          },
          "Continue": {
            "type": "boolean",
            "description": "If max number of results have been returned, a new query may be required to retrieve remaining data"
          }
        },
        "additionalProperties": false
      },
      "ClubAthleteEngagementSummaryDTO": {
        "type": "object",
        "properties": {
          "UserId": {
            "type": "integer",
            "format": "int32"
          },
          "ClubId": {
            "type": "integer",
            "format": "int32"
          },
          "CurrentYear": {
            "type": "integer",
            "description": "Year of the athlete\u0027s current local month.",
            "format": "int32"
          },
          "CurrentMonth": {
            "type": "integer",
            "description": "Month of the year (1-12) in the athlete\u0027s timezone.",
            "format": "int32"
          },
          "CurrentMonthTotals": {
            "$ref": "#/components/schemas/AthleteEngagementTotalsDTO"
          },
          "LifetimeTotals": {
            "$ref": "#/components/schemas/AthleteEngagementTotalsDTO"
          },
          "CurrentMonthBadges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AthleteEngagementBadgeDTO"
            },
            "description": "Individual awards earned so far in the athlete\u0027s current local month, including repeated awards of the same badge.",
            "nullable": true
          },
          "UptivoLevel": {
            "type": "integer",
            "description": "Current Uptivo level; no historical level is inferred.",
            "format": "int32"
          },
          "BrandLevel": {
            "$ref": "#/components/schemas/AthleteEngagementBrandLevelDTO"
          },
          "BrandLevelSource": {
            "$ref": "#/components/schemas/BrandLevelSource"
          },
          "CurrentLevel": {
            "type": "integer",
            "description": "Effective current level: UptivoLevel for BrandLevelSource=None, otherwise BrandLevel.Level (zero when unassigned).",
            "format": "int32"
          },
          "MonthToDatePoints": {
            "type": "integer",
            "description": "Current local month\u0027s UPPs measured against MonthlyPointsGoal. Uses ClubPoints for BrandLevelSource=Club, otherwise Points.",
            "format": "int32"
          },
          "MonthlyPointsGoal": {
            "type": "integer",
            "description": "Monthly UPPs goal for the effective ranking configuration. Zero disables goal-based nudges.",
            "format": "int32"
          },
          "MonthlyPointsResetAtUtc": {
            "type": "string",
            "description": "UTC instant corresponding to the next month\u0027s start in the athlete\u0027s timezone, when month-to-date UPPs reset.",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "Personal activity totals and current gamification results for a club athlete."
      },
      "ClubAthleteEngagementSummaryDTOIClubQueryIdRangeResultDTO": {
        "type": "object",
        "properties": {
          "NextCursor": {
            "type": "string",
            "description": "Opaque cursor towards larger IDs or newer Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "PrevCursor": {
            "type": "string",
            "description": "Opaque cursor towards smaller IDs or older Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "NextId": {
            "type": "integer",
            "description": "If navigating in ascending order, this is the next Id value (fromId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "PrevId": {
            "type": "integer",
            "description": "If navigating in descending order, this is the previous Id value (toId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "Results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClubAthleteEngagementSummaryDTO"
            },
            "description": "Results from the query",
            "nullable": true
          },
          "Continue": {
            "type": "boolean",
            "description": "If max number of results have been returned, a new query may be required to retrieve remaining data"
          }
        },
        "additionalProperties": false
      },
      "ClubAthleteGuestUpdateDTO": {
        "required": [
          "IsGuest"
        ],
        "type": "object",
        "properties": {
          "IsGuest": {
            "type": "boolean",
            "description": "Guest status in the selected club only."
          }
        },
        "additionalProperties": false,
        "description": "Set the guest flag of one Athlete in the selected club."
      },
      "ClubAthleteMembershipDTO": {
        "type": "object",
        "properties": {
          "UserClassSubscriptionId": {
            "type": "integer",
            "format": "int32"
          },
          "ClassSubscriptionId": {
            "type": "integer",
            "format": "int32"
          },
          "ClassSubscriptionPlanId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "SubscriptionName": {
            "type": "string",
            "description": "Current product name; plans have no separate display name.",
            "nullable": true
          },
          "From": {
            "type": "string",
            "format": "date-time"
          },
          "To": {
            "type": "string",
            "format": "date-time"
          },
          "Disabled": {
            "type": "boolean",
            "description": "Disabled assignments include cancellation after an unpaid invoice. No cancellation timestamp is implied."
          },
          "MaxActivities": {
            "type": "integer",
            "description": "Zero means unlimited activities.",
            "format": "int32"
          },
          "AvailableActivities": {
            "type": "integer",
            "format": "int32"
          },
          "SuspendedAtUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "ReactivationDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One membership assignment with product context for CRM synchronization."
      },
      "ClubAthleteMembershipSummaryDTO": {
        "type": "object",
        "properties": {
          "UserId": {
            "type": "integer",
            "format": "int32"
          },
          "ClubId": {
            "type": "integer",
            "format": "int32"
          },
          "Memberships": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClubAthleteMembershipDTO"
            },
            "description": "All membership assignments in this club, ordered by start descending then assignment ID descending. Includes disabled and exhausted assignments; no representative plan is selected.",
            "nullable": true
          },
          "Status": {
            "type": "string",
            "description": "One of None, Active, Paused, Pending, Expired or Canceled.",
            "nullable": true
          },
          "CalculatedAtUtc": {
            "type": "string",
            "description": "Instant at which the state was calculated; this is not a transition timestamp.",
            "format": "date-time"
          },
          "ActiveFrom": {
            "type": "string",
            "description": "Earliest start among currently active memberships, if any.",
            "format": "date-time",
            "nullable": true
          },
          "ActiveUntil": {
            "type": "string",
            "description": "Latest end among currently active memberships, if any. This does not imply uninterrupted coverage.",
            "format": "date-time",
            "nullable": true
          },
          "NextPendingStart": {
            "type": "string",
            "description": "Earliest start of a usable future membership, if any.",
            "format": "date-time",
            "nullable": true
          },
          "MostRecentEnd": {
            "type": "string",
            "description": "End date of the most recently started membership, if any; ticket exhaustion may precede this date.",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "The effective membership state of one athlete in the selected club."
      },
      "ClubAthleteMembershipSummaryDTOIClubQueryIdRangeResultDTO": {
        "type": "object",
        "properties": {
          "NextCursor": {
            "type": "string",
            "description": "Opaque cursor towards larger IDs or newer Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "PrevCursor": {
            "type": "string",
            "description": "Opaque cursor towards smaller IDs or older Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "NextId": {
            "type": "integer",
            "description": "If navigating in ascending order, this is the next Id value (fromId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "PrevId": {
            "type": "integer",
            "description": "If navigating in descending order, this is the previous Id value (toId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "Results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClubAthleteMembershipSummaryDTO"
            },
            "description": "Results from the query",
            "nullable": true
          },
          "Continue": {
            "type": "boolean",
            "description": "If max number of results have been returned, a new query may be required to retrieve remaining data"
          }
        },
        "additionalProperties": false
      },
      "ClubAthleteUpdateDTO": {
        "type": "object",
        "properties": {
          "Email": {
            "maxLength": 254,
            "type": "string",
            "format": "email",
            "nullable": true
          },
          "BirthDate": {
            "type": "string",
            "description": "The athlete\u0027s calendar date of birth. Use YYYY-MM-DD. Time and timezone are not part of this value.\r\nThe legacy YYYY-MM-DDT00:00:00 input format is deprecated and will be removed by December 2026.",
            "format": "date",
            "nullable": true
          },
          "FirstMidName": {
            "maxLength": 32,
            "type": "string",
            "nullable": true
          },
          "LastName": {
            "maxLength": 32,
            "type": "string",
            "nullable": true
          },
          "Nickname": {
            "maxLength": 32,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "Gender": {
            "$ref": "#/components/schemas/Gender"
          },
          "Weight": {
            "maximum": 600,
            "minimum": 10,
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "Height": {
            "maximum": 250,
            "minimum": 60,
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "Phone": {
            "maxLength": 16,
            "type": "string",
            "format": "tel",
            "nullable": true
          },
          "TaxId": {
            "maxLength": 64,
            "minLength": 2,
            "type": "string",
            "nullable": true
          },
          "Address1": {
            "maxLength": 48,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "Address2": {
            "maxLength": 48,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "Zone": {
            "maxLength": 32,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "PostalCode": {
            "maxLength": 16,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "City": {
            "maxLength": 32,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "CountryCode": {
            "maxLength": 3,
            "type": "string",
            "nullable": true
          },
          "TimeZoneCode": {
            "maxLength": 32,
            "type": "string",
            "nullable": true
          },
          "UnitsSystem": {
            "$ref": "#/components/schemas/UnitsSystem"
          },
          "Language": {
            "$ref": "#/components/schemas/Language"
          },
          "FirstDayOfWeek": {
            "$ref": "#/components/schemas/DayOfWeek"
          },
          "DateFormat": {
            "$ref": "#/components/schemas/DateFormat"
          },
          "TimeFormat": {
            "$ref": "#/components/schemas/TimeFormat"
          },
          "Occupation": {
            "maxLength": 32,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "FitnessGoals": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "InjuriesHistory": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "ToAvoid": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "CustomHBZones": {
            "type": "boolean",
            "nullable": true
          },
          "Zone0Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "Zone1Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "Zone2Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "Zone3Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "Zone4Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "Zone5Bpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "CustomTargetZone": {
            "type": "boolean",
            "nullable": true
          },
          "TargetZoneLowBpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "TargetZoneHighBpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "WarningHighBpm": {
            "maximum": 250,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "CustomCyclingFTP": {
            "type": "boolean",
            "nullable": true
          },
          "CyclingFTP": {
            "maximum": 1000,
            "minimum": 0,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "DefaultTrainingType": {
            "$ref": "#/components/schemas/TrainingType"
          }
        },
        "additionalProperties": false,
        "description": "Partial update of the athlete\u0027s global Uptivo user profile. Every property is optional and omitted properties retain their current value."
      },
      "ClubAttendanceSummaryDTO": {
        "required": [
          "ClubId",
          "UserId",
          "CalculatedAtUtc",
          "FirstCheckIn",
          "LastCheckIn",
          "LifetimeCheckInCount",
          "WindowDays",
          "RollingCheckInCount",
          "PriorCheckInCount"
        ],
        "type": "object",
        "properties": {
          "ClubId": {
            "minimum": 1,
            "type": "integer",
            "description": "The selected club.",
            "format": "int32"
          },
          "UserId": {
            "minimum": 1,
            "type": "integer",
            "description": "The athlete\u0027s UserId.",
            "format": "int32"
          },
          "CalculatedAtUtc": {
            "type": "string",
            "description": "UTC instant used to calculate check-in metrics and both configurable window boundaries.",
            "format": "date-time"
          },
          "FirstCheckIn": {
            "type": "string",
            "description": "Earliest Class Begin of a confirmed booking with NoShow=false and Class Begin at or before CalculatedAtUtc, across all saved history in this club. Not the kiosk timestamp; null when absent.",
            "format": "date-time",
            "nullable": true
          },
          "LastCheckIn": {
            "type": "string",
            "description": "Latest Class Begin under the same lifetime rule as FirstCheckIn; null when absent.",
            "format": "date-time",
            "nullable": true
          },
          "LifetimeCheckInCount": {
            "minimum": 0,
            "type": "integer",
            "description": "All saved confirmed bookings with NoShow=false whose classes have started in this club, across lifetime history. Includes ongoing classes.",
            "format": "int32"
          },
          "WindowDays": {
            "maximum": 366,
            "minimum": 1,
            "type": "integer",
            "description": "Number of elapsed UTC days in each configurable window, requested through days (default 30, range 1-366).",
            "format": "int32"
          },
          "RollingCheckInCount": {
            "minimum": 0,
            "type": "integer",
            "description": "Check-ins with Class Begin in [CalculatedAtUtc minus WindowDays days, CalculatedAtUtc].",
            "format": "int32"
          },
          "PriorCheckInCount": {
            "minimum": 0,
            "type": "integer",
            "description": "Check-ins with Class Begin in [CalculatedAtUtc minus twice WindowDays days, CalculatedAtUtc minus WindowDays days).",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Lifetime and rolling check-in metrics from current saved bookings in the selected club. First/last check-in and total count cover all history; two consecutive windows are calculated from WindowDays at CalculatedAtUtc. Check-ins include started classes with confirmed NoShow=false bookings. Dates use Class Begin, not kiosk timestamps. Every property is present; check-in dates are null when absent."
      },
      "ClubAttendanceSummaryDTOIClubQueryIdRangeResultDTO": {
        "type": "object",
        "properties": {
          "NextCursor": {
            "type": "string",
            "description": "Opaque cursor towards larger IDs or newer Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "PrevCursor": {
            "type": "string",
            "description": "Opaque cursor towards smaller IDs or older Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "NextId": {
            "type": "integer",
            "description": "If navigating in ascending order, this is the next Id value (fromId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "PrevId": {
            "type": "integer",
            "description": "If navigating in descending order, this is the previous Id value (toId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "Results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClubAttendanceSummaryDTO"
            },
            "description": "Results from the query",
            "nullable": true
          },
          "Continue": {
            "type": "boolean",
            "description": "If max number of results have been returned, a new query may be required to retrieve remaining data"
          }
        },
        "additionalProperties": false
      },
      "ClubBadgeAwardDTO": {
        "type": "object",
        "properties": {
          "Id": {
            "type": "string",
            "description": "Stable string identity in the form badge-{AchievedBadgeId}; not a webhook event ID.",
            "nullable": true,
            "readOnly": true
          },
          "AchievedBadgeId": {
            "type": "integer",
            "description": "Unique award ID used for detail reads and pagination. Repeated awards of the same badge have different IDs.",
            "format": "int32"
          },
          "UserId": {
            "type": "integer",
            "description": "The recipient\u0027s UserId in the selected club.",
            "format": "int32"
          },
          "BadgeId": {
            "type": "integer",
            "description": "The badge design ID; this alone does not identify an individual award.",
            "format": "int32"
          },
          "BadgeName": {
            "type": "string",
            "nullable": true
          },
          "PictureUri": {
            "type": "string",
            "nullable": true
          },
          "AchievedAt": {
            "type": "string",
            "description": "Effective award date. It may precede assignment and does not determine pagination order.",
            "format": "date-time"
          },
          "ChallengeName": {
            "type": "string",
            "description": "Challenge name when available; no Challenge ID is included in this read contract.",
            "nullable": true
          },
          "ClubId": {
            "type": "integer",
            "description": "Challenge owner club when available, not the badge design\u0027s owner.",
            "format": "int32",
            "nullable": true
          },
          "BrandId": {
            "type": "integer",
            "description": "Challenge owner brand when available.",
            "format": "int32",
            "nullable": true
          },
          "GoalStep": {
            "type": "integer",
            "description": "Zero-based goal step when available, otherwise null.",
            "format": "int32",
            "nullable": true
          },
          "Rank": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "RankPercent": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "Score": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "RankingCriteria": {
            "type": "string",
            "nullable": true
          },
          "Participants": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "A challenge badge award visible to the selected club, distinct from the badge design and the webhook event."
      },
      "ClubBadgeAwardDTOIClubQueryIdRangeResultDTO": {
        "type": "object",
        "properties": {
          "NextCursor": {
            "type": "string",
            "description": "Opaque cursor towards larger IDs or newer Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "PrevCursor": {
            "type": "string",
            "description": "Opaque cursor towards smaller IDs or older Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "NextId": {
            "type": "integer",
            "description": "If navigating in ascending order, this is the next Id value (fromId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "PrevId": {
            "type": "integer",
            "description": "If navigating in descending order, this is the previous Id value (toId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "Results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClubBadgeAwardDTO"
            },
            "description": "Results from the query",
            "nullable": true
          },
          "Continue": {
            "type": "boolean",
            "description": "If max number of results have been returned, a new query may be required to retrieve remaining data"
          }
        },
        "additionalProperties": false
      },
      "ClubChallengeDTO": {
        "type": "object",
        "properties": {
          "TrainingChallengeId": {
            "type": "integer",
            "format": "int32"
          },
          "OwnerClubId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "OwnerBrandId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "Description": {
            "type": "string",
            "nullable": true
          },
          "PictureUri": {
            "type": "string",
            "nullable": true
          },
          "From": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "To": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "Enabled": {
            "type": "boolean"
          },
          "Awarded": {
            "type": "boolean"
          },
          "AwardGoals": {
            "type": "boolean"
          },
          "AwardRanks": {
            "type": "boolean"
          },
          "AwardGoalsAtEnd": {
            "type": "boolean"
          },
          "RankingCriteria": {
            "$ref": "#/components/schemas/RankingCriteria"
          },
          "Origin": {
            "$ref": "#/components/schemas/TrainingOrigin"
          },
          "AssignMode": {
            "$ref": "#/components/schemas/ChallengeAssignmentMode"
          },
          "Gender": {
            "$ref": "#/components/schemas/Gender"
          }
        },
        "additionalProperties": false
      },
      "ClubChallengeDTOIClubQueryIdRangeResultDTO": {
        "type": "object",
        "properties": {
          "NextCursor": {
            "type": "string",
            "description": "Opaque cursor towards larger IDs or newer Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "PrevCursor": {
            "type": "string",
            "description": "Opaque cursor towards smaller IDs or older Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "NextId": {
            "type": "integer",
            "description": "If navigating in ascending order, this is the next Id value (fromId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "PrevId": {
            "type": "integer",
            "description": "If navigating in descending order, this is the previous Id value (toId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "Results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClubChallengeDTO"
            },
            "description": "Results from the query",
            "nullable": true
          },
          "Continue": {
            "type": "boolean",
            "description": "If max number of results have been returned, a new query may be required to retrieve remaining data"
          }
        },
        "additionalProperties": false
      },
      "ClubChallengeResultsDTO": {
        "type": "object",
        "properties": {
          "Challenge": {
            "$ref": "#/components/schemas/ClubChallengeDTO"
          },
          "Participants": {
            "type": "integer",
            "description": "Total scored participants across the entire challenge, not just this club/page.",
            "format": "int32"
          },
          "Results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TrainingChallengeRankingDTO"
            },
            "nullable": true
          },
          "Continue": {
            "type": "boolean"
          },
          "NextId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "PrevId": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "NextCursor": {
            "type": "string",
            "description": "Cursor towards larger UserIds, independent of returned order.",
            "nullable": true
          },
          "PrevCursor": {
            "type": "string",
            "description": "Cursor towards smaller UserIds, independent of returned order.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ClubClassParticipationDTO": {
        "required": [
          "ClubId",
          "ClassName",
          "ClassBegin",
          "ClassEnd",
          "CalendarType",
          "ClassType",
          "TrainingType",
          "Location",
          "TrainerId",
          "TrainerName",
          "BookAsNoShow",
          "CreditsCost",
          "SubscriptionCost",
          "UserClassSubscriptionId",
          "ClassSubscriptionId",
          "SubscriptionName",
          "SubscriptionType",
          "SubscriptionFrom",
          "SubscriptionTo",
          "MaxActivities",
          "AvailableActivities",
          "ClassId",
          "UserId",
          "CreatedAtUtc",
          "Mode",
          "State",
          "NoShow",
          "Trial",
          "ActorId"
        ],
        "type": "object",
        "properties": {
          "BookActorId": {
            "type": "integer",
            "description": "Legacy alias of ActorId, retained for existing participant-list clients.",
            "format": "int32",
            "nullable": true,
            "readOnly": true
          },
          "BookActorName": {
            "type": "string",
            "description": "Display name of the booking actor, when available.",
            "nullable": true
          },
          "ClubId": {
            "minimum": 1,
            "type": "integer",
            "description": "The club that owns the Class and scopes the booking.",
            "format": "int32"
          },
          "ClassName": {
            "type": "string",
            "description": "The current Class name."
          },
          "ClassBegin": {
            "type": "string",
            "description": "The Class start as an absolute instant.",
            "format": "date-time"
          },
          "ClassEnd": {
            "type": "string",
            "description": "The Class end as an absolute instant.",
            "format": "date-time"
          },
          "CalendarType": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CalendarType"
              }
            ],
            "description": "The public calendar containing the Class."
          },
          "ClassType": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ClassType"
              }
            ],
            "description": "Whether the Class is a course, a single appointment, or a group activity."
          },
          "TrainingType": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ActivityType"
              }
            ],
            "description": "The activity classification associated with the Class."
          },
          "Location": {
            "type": "string",
            "description": "The Class location, or null when none is configured.",
            "nullable": true
          },
          "TrainerId": {
            "type": "integer",
            "description": "The assigned trainer\u0027s UserId, or null when the trainer is not linked to a user.",
            "format": "int32",
            "nullable": true
          },
          "TrainerName": {
            "type": "string",
            "description": "The trainer display name, or null when unavailable.",
            "nullable": true
          },
          "BookAsNoShow": {
            "type": "boolean",
            "description": "Whether bookings for the Class are initially marked as no-shows."
          },
          "CreditsCost": {
            "type": "integer",
            "description": "Credits associated with the booking, not a signed charge/refund for this event.",
            "format": "int32"
          },
          "SubscriptionCost": {
            "type": "integer",
            "description": "Membership activities associated with the booking, not a signed change in balance.",
            "format": "int32"
          },
          "UserClassSubscriptionId": {
            "type": "integer",
            "description": "The athlete\u0027s UserSubscription assignment used by the booking, or null when none was used.",
            "format": "int32",
            "nullable": true
          },
          "ClassSubscriptionId": {
            "type": "integer",
            "description": "The Subscription product associated with that assignment, or null when unavailable.",
            "format": "int32",
            "nullable": true
          },
          "SubscriptionName": {
            "type": "string",
            "description": "The Subscription product name captured with the booking, or null when unavailable.",
            "nullable": true
          },
          "SubscriptionType": {
            "type": "string",
            "allOf": [
              {
                "$ref": "#/components/schemas/ClassSubscriptionType"
              }
            ],
            "description": "The Subscription product type, or null when no product information is available.",
            "nullable": true
          },
          "SubscriptionFrom": {
            "type": "string",
            "description": "The assignment start instant, or null when no UserSubscription is associated.",
            "format": "date-time",
            "nullable": true
          },
          "SubscriptionTo": {
            "type": "string",
            "description": "The assignment end instant, or null when no UserSubscription is associated.",
            "format": "date-time",
            "nullable": true
          },
          "MaxActivities": {
            "type": "integer",
            "description": "Maximum membership activities; zero means unlimited.",
            "format": "int32",
            "nullable": true
          },
          "AvailableActivities": {
            "type": "integer",
            "description": "Remaining activities at the time of the snapshot, after saving any operation.",
            "format": "int32",
            "nullable": true
          },
          "ClassId": {
            "minimum": 1,
            "type": "integer",
            "description": "The ClassId.",
            "format": "int32"
          },
          "UserId": {
            "minimum": 1,
            "type": "integer",
            "description": "The participant\u0027s UserId.",
            "format": "int32"
          },
          "CreatedAtUtc": {
            "type": "string",
            "description": "Creation time in UTC. It determines the ordering of queued athletes.",
            "format": "date-time"
          },
          "Mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ClassParticipantMode"
              }
            ],
            "description": "Whether attendance is in site or remote."
          },
          "State": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ClassParticipantState"
              }
            ],
            "description": "Whether the athlete has a confirmed place or is in the queue."
          },
          "NoShow": {
            "type": "boolean",
            "description": "Whether Uptivo marks the participation as a no-show."
          },
          "Trial": {
            "type": "boolean",
            "description": "Whether the participation is treated as a trial."
          },
          "ActorId": {
            "type": "integer",
            "description": "UserId of the operation actor, when available.",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "A saved booking with Class and payment context, shared by single and list reads. All properties except the optional legacy BookActorId/BookActorName are present; nullable properties can contain null. The legacy participants array preserves its original class visibility; new reads only expose published classes."
      },
      "ClubClassParticipationDTOIClubQueryIdRangeResultDTO": {
        "type": "object",
        "properties": {
          "NextCursor": {
            "type": "string",
            "description": "Opaque cursor towards larger IDs or newer Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "PrevCursor": {
            "type": "string",
            "description": "Opaque cursor towards smaller IDs or older Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "NextId": {
            "type": "integer",
            "description": "If navigating in ascending order, this is the next Id value (fromId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "PrevId": {
            "type": "integer",
            "description": "If navigating in descending order, this is the previous Id value (toId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "Results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClubClassParticipationDTO"
            },
            "description": "Results from the query",
            "nullable": true
          },
          "Continue": {
            "type": "boolean",
            "description": "If max number of results have been returned, a new query may be required to retrieve remaining data"
          }
        },
        "additionalProperties": false
      },
      "ClubClientStageUpdateDTO": {
        "required": [
          "ClientStage"
        ],
        "type": "object",
        "properties": {
          "ClientStage": {
            "$ref": "#/components/schemas/ClientStage"
          }
        },
        "additionalProperties": false,
        "description": "Set the commercial stage of one Athlete or Contact in the selected club."
      },
      "ClubContactDTO": {
        "type": "object",
        "properties": {
          "ClubId": {
            "type": "integer",
            "format": "int32"
          },
          "UserId": {
            "type": "integer",
            "format": "int32"
          },
          "Email": {
            "type": "string",
            "nullable": true
          },
          "FirstMidName": {
            "type": "string",
            "nullable": true
          },
          "LastName": {
            "type": "string",
            "nullable": true
          },
          "Nickname": {
            "type": "string",
            "nullable": true
          },
          "Phone": {
            "type": "string",
            "nullable": true
          },
          "CreatedAt": {
            "type": "string",
            "description": "When this user became a contact of this club.",
            "format": "date-time"
          },
          "JoinedAt": {
            "type": "string",
            "description": "Original athlete joining date, when the contact was previously an athlete.",
            "format": "date-time",
            "nullable": true
          },
          "ClientStage": {
            "$ref": "#/components/schemas/ClientStage"
          }
        },
        "additionalProperties": false,
        "description": "Public contact relationship with a club, without private notes or health data."
      },
      "ClubContactDTOIClubQueryIdRangeResultDTO": {
        "type": "object",
        "properties": {
          "NextCursor": {
            "type": "string",
            "description": "Opaque cursor towards larger IDs or newer Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "PrevCursor": {
            "type": "string",
            "description": "Opaque cursor towards smaller IDs or older Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "NextId": {
            "type": "integer",
            "description": "If navigating in ascending order, this is the next Id value (fromId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "PrevId": {
            "type": "integer",
            "description": "If navigating in descending order, this is the previous Id value (toId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "Results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClubContactDTO"
            },
            "description": "Results from the query",
            "nullable": true
          },
          "Continue": {
            "type": "boolean",
            "description": "If max number of results have been returned, a new query may be required to retrieve remaining data"
          }
        },
        "additionalProperties": false
      },
      "ClubJoinMode": {
        "enum": [
          "System",
          "SelfJoin"
        ],
        "type": "string"
      },
      "ClubProfileDTO": {
        "required": [
          "ClubId",
          "BrandId",
          "ClubCode",
          "Name",
          "PictureUri",
          "Address",
          "Latitude",
          "Longitude",
          "Phone",
          "Email",
          "WebSiteUri",
          "CountryCode",
          "TimeZoneCode",
          "FirstDayOfWeek",
          "DateFormat",
          "TimeFormat",
          "UnitsSystem",
          "Language",
          "DefaultCurrency"
        ],
        "type": "object",
        "properties": {
          "ClubId": {
            "minimum": 1,
            "type": "integer",
            "description": "The stable Uptivo identifier of the selected club.",
            "format": "int32"
          },
          "BrandId": {
            "minimum": 1,
            "type": "integer",
            "description": "The identifier of the brand to which the club belongs.",
            "format": "int32"
          },
          "ClubCode": {
            "maxLength": 36,
            "type": "string",
            "description": "The club\u0027s human-readable Uptivo code, when configured.",
            "nullable": true
          },
          "Name": {
            "maxLength": 32,
            "minLength": 3,
            "type": "string",
            "description": "The club\u0027s display name."
          },
          "PictureUri": {
            "maxLength": 256,
            "type": "string",
            "description": "The absolute URI of the club\u0027s profile image, when configured.",
            "format": "uri",
            "nullable": true
          },
          "Address": {
            "maxLength": 256,
            "type": "string",
            "description": "The club\u0027s postal address, when configured.",
            "nullable": true
          },
          "Latitude": {
            "maximum": 90,
            "minimum": -90,
            "type": "number",
            "description": "The latitude of the club\u0027s location, when configured.",
            "format": "double",
            "nullable": true
          },
          "Longitude": {
            "maximum": 180,
            "minimum": -180,
            "type": "number",
            "description": "The longitude of the club\u0027s location, when configured.",
            "format": "double",
            "nullable": true
          },
          "Phone": {
            "maxLength": 32,
            "type": "string",
            "description": "The club\u0027s contact phone number, when configured.",
            "format": "tel",
            "nullable": true
          },
          "Email": {
            "maxLength": 254,
            "type": "string",
            "description": "The club\u0027s contact email address, when configured.",
            "format": "email",
            "nullable": true
          },
          "WebSiteUri": {
            "maxLength": 256,
            "type": "string",
            "description": "The club\u0027s website URI, when configured.",
            "format": "uri",
            "nullable": true
          },
          "CountryCode": {
            "maxLength": 3,
            "type": "string",
            "description": "The ISO 3166-1 alpha-2 country code used by the club.",
            "nullable": true
          },
          "TimeZoneCode": {
            "maxLength": 32,
            "type": "string",
            "description": "The IANA time-zone identifier used for the club\u0027s local dates and times.",
            "nullable": true
          },
          "FirstDayOfWeek": {
            "$ref": "#/components/schemas/DayOfWeek"
          },
          "DateFormat": {
            "$ref": "#/components/schemas/DateFormat"
          },
          "TimeFormat": {
            "$ref": "#/components/schemas/TimeFormat"
          },
          "UnitsSystem": {
            "$ref": "#/components/schemas/UnitsSystem"
          },
          "Language": {
            "$ref": "#/components/schemas/Language"
          },
          "DefaultCurrency": {
            "type": "string",
            "description": "The ISO 4217 currency inferred from the club country code, when known.",
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false,
        "description": "Public identity, contact, and locale settings of the club selected by the Club API Key. Nullable properties are serialized as null; every property in this schema is present in the profile response."
      },
      "ClubTrainingDTO": {
        "required": [
          "TrainingId",
          "UserId",
          "ClubId",
          "GroupTrainingId",
          "Title",
          "TrainingType",
          "Begin",
          "BeginDateLocal",
          "End",
          "Duration",
          "IsLive",
          "IsSubTraining",
          "MinBpm",
          "MaxBpm",
          "AvgBpm",
          "Zone0Bpm",
          "Zone1Bpm",
          "Zone2Bpm",
          "Zone3Bpm",
          "Zone4Bpm",
          "Zone5Bpm",
          "Zone0Time",
          "Zone1Time",
          "Zone2Time",
          "Zone3Time",
          "Zone4Time",
          "Zone5Time",
          "TargetZoneTime",
          "TargetZoneLowBpm",
          "TargetZoneHighBpm",
          "Points",
          "CaloriesTotal",
          "Distance",
          "MinSpeed",
          "MaxSpeed",
          "AvgSpeed",
          "ElevationGain",
          "ElevationLoss",
          "StartLatitude",
          "StartLongitude",
          "HitsACount",
          "HitsAPowerAvg",
          "HitsASpeedAvg",
          "HitsATimeAvg",
          "HitsPoints",
          "MaxPower",
          "AvgPower",
          "CyclingFTP",
          "PowerZone0Time",
          "PowerZone1Time",
          "PowerZone2Time",
          "PowerZone3Time",
          "PowerZone4Time",
          "PowerZone5Time",
          "Zone0Power",
          "Zone1Power",
          "Zone2Power",
          "Zone3Power",
          "Zone4Power",
          "Zone5Power",
          "AvgCadence"
        ],
        "type": "object",
        "properties": {
          "TrainingId": {
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "UserId": {
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "ClubId": {
            "minimum": 1,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "GroupTrainingId": {
            "minimum": 1,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "Title": {
            "type": "string",
            "nullable": true
          },
          "TrainingType": {
            "$ref": "#/components/schemas/TrainingType"
          },
          "Begin": {
            "type": "string",
            "format": "date-time"
          },
          "BeginDateLocal": {
            "type": "string",
            "description": "Stored start date in the athlete\u0027s local timezone, formatted as yyyy-MM-dd.",
            "format": "date"
          },
          "End": {
            "type": "string",
            "format": "date-time"
          },
          "Duration": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "IsLive": {
            "type": "boolean"
          },
          "IsSubTraining": {
            "type": "boolean"
          },
          "MinBpm": {
            "type": "integer",
            "format": "int32"
          },
          "MaxBpm": {
            "type": "integer",
            "format": "int32"
          },
          "AvgBpm": {
            "type": "integer",
            "format": "int32"
          },
          "Zone0Bpm": {
            "type": "integer",
            "format": "int32"
          },
          "Zone1Bpm": {
            "type": "integer",
            "format": "int32"
          },
          "Zone2Bpm": {
            "type": "integer",
            "format": "int32"
          },
          "Zone3Bpm": {
            "type": "integer",
            "format": "int32"
          },
          "Zone4Bpm": {
            "type": "integer",
            "format": "int32"
          },
          "Zone5Bpm": {
            "type": "integer",
            "format": "int32"
          },
          "Zone0Time": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "Zone1Time": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "Zone2Time": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "Zone3Time": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "Zone4Time": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "Zone5Time": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "TargetZoneTime": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "TargetZoneLowBpm": {
            "type": "integer",
            "format": "int32"
          },
          "TargetZoneHighBpm": {
            "type": "integer",
            "format": "int32"
          },
          "Points": {
            "type": "integer",
            "format": "int32"
          },
          "CaloriesTotal": {
            "type": "integer",
            "format": "int32"
          },
          "Distance": {
            "type": "integer",
            "format": "int32"
          },
          "MinSpeed": {
            "type": "number",
            "format": "double"
          },
          "MaxSpeed": {
            "type": "number",
            "format": "double"
          },
          "AvgSpeed": {
            "type": "number",
            "format": "double"
          },
          "ElevationGain": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "ElevationLoss": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "StartLatitude": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "StartLongitude": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "HitsACount": {
            "type": "integer",
            "format": "int32"
          },
          "HitsAPowerAvg": {
            "type": "number",
            "format": "double"
          },
          "HitsASpeedAvg": {
            "type": "number",
            "format": "double"
          },
          "HitsATimeAvg": {
            "type": "integer",
            "format": "int32"
          },
          "HitsPoints": {
            "type": "integer",
            "format": "int32"
          },
          "MaxPower": {
            "type": "integer",
            "format": "int32"
          },
          "AvgPower": {
            "type": "integer",
            "format": "int32"
          },
          "CyclingFTP": {
            "type": "integer",
            "format": "int32"
          },
          "PowerZone0Time": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "PowerZone1Time": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "PowerZone2Time": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "PowerZone3Time": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "PowerZone4Time": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "PowerZone5Time": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "Zone0Power": {
            "type": "integer",
            "format": "int32"
          },
          "Zone1Power": {
            "type": "integer",
            "format": "int32"
          },
          "Zone2Power": {
            "type": "integer",
            "format": "int32"
          },
          "Zone3Power": {
            "type": "integer",
            "format": "int32"
          },
          "Zone4Power": {
            "type": "integer",
            "format": "int32"
          },
          "Zone5Power": {
            "type": "integer",
            "format": "int32"
          },
          "AvgCadence": {
            "type": "integer",
            "format": "int32"
          },
          "Telemetry": {
            "$ref": "#/components/schemas/TrainingTelemetryDTO"
          },
          "User": {
            "$ref": "#/components/schemas/ClubAthleteDTO"
          }
        },
        "additionalProperties": false,
        "description": "Completed training data. Base properties are always serialized. Telemetry and User are independent optional enrichments, omitted unless requested. User is also omitted when the owner is no longer a club athlete."
      },
      "ClubTrainingDTOIClubQueryIdTSRangeResultDTO": {
        "type": "object",
        "properties": {
          "Results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClubTrainingDTO"
            },
            "description": "Results from the query",
            "nullable": true
          },
          "Continue": {
            "type": "boolean",
            "description": "If max number of results have been returned, a new query may be required to retrieve remaining data"
          },
          "NextId": {
            "type": "integer",
            "description": "If navigating in ascending order, this is the next Id value (fromId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "PrevId": {
            "type": "integer",
            "description": "If navigating in descending order, this is the previous Id value (toId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "NextDateTime": {
            "type": "string",
            "description": "If navigating in ascending order, this is the next date/time value (from) to use for fetch more data",
            "format": "date-time",
            "nullable": true
          },
          "PrevDateTime": {
            "type": "string",
            "description": "If navigating in descending order, this is the previous date/time value (to) to use for fetch more data",
            "format": "date-time",
            "nullable": true
          },
          "NextCursor": {
            "type": "string",
            "description": "Opaque cursor towards larger IDs or newer Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "PrevCursor": {
            "type": "string",
            "description": "Opaque cursor towards smaller IDs or older Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ClubTransactionOpDTO": {
        "type": "object",
        "properties": {
          "TimeStamp": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "Note": {
            "maxLength": 250,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "Amount": {
            "maximum": 1000000,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "Currency": {
            "type": "string",
            "nullable": true
          },
          "Export": {
            "type": "boolean"
          },
          "PaymentMethod": {
            "$ref": "#/components/schemas/PaymentMethod"
          }
        },
        "additionalProperties": false
      },
      "CreateUserClassSubscriptionDTO": {
        "required": [
          "ClassSubscriptionId",
          "From",
          "To",
          "UserId"
        ],
        "type": "object",
        "properties": {
          "ClassSubscriptionId": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "description": "The subscription product to assign.",
            "format": "int32"
          },
          "UserId": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "description": "The UserId of an athlete in the selected club.",
            "format": "int32"
          },
          "From": {
            "type": "string",
            "description": "Inclusive membership start, between 2020-01-01 and 2100-01-01.",
            "format": "date-time"
          },
          "To": {
            "type": "string",
            "description": "Inclusive membership end, at least one day after From and no later than 2100-01-01.",
            "format": "date-time"
          },
          "MaxActivities": {
            "maximum": 100,
            "minimum": 0,
            "type": "integer",
            "description": "Maximum usable activities, from 0 to 100. Zero means unlimited.",
            "format": "int32"
          },
          "ClassSubscriptionPlanId": {
            "type": "integer",
            "description": "Optional non-recurring plan belonging to ClassSubscriptionId.",
            "format": "int32",
            "nullable": true
          },
          "Transaction": {
            "$ref": "#/components/schemas/ClubTransactionOpDTO"
          }
        },
        "additionalProperties": false
      },
      "CreateUserClassSubscriptionFromPlanDTO": {
        "required": [
          "ClassSubscriptionPlanId",
          "From",
          "UserId"
        ],
        "type": "object",
        "properties": {
          "ClassSubscriptionPlanId": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "description": "The non-recurring subscription plan to assign.",
            "format": "int32"
          },
          "UserId": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "description": "The UserId of an athlete in the selected club.",
            "format": "int32"
          },
          "From": {
            "type": "string",
            "description": "Membership start, between 2020-01-01 and 2100-01-01.",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "DateFormat": {
        "enum": [
          "ddmmyyyy",
          "mmddyyyy",
          "yyyymmdd"
        ],
        "type": "string"
      },
      "DayOfWeek": {
        "enum": [
          "Sunday",
          "Monday",
          "Tuesday",
          "Wednesday",
          "Thursday",
          "Friday",
          "Saturday"
        ],
        "type": "string"
      },
      "Gender": {
        "enum": [
          "Unspecified",
          "Male",
          "Female"
        ],
        "type": "string"
      },
      "ImportSensorDTO": {
        "required": [
          "SensorSN"
        ],
        "type": "object",
        "properties": {
          "SensorBrand": {
            "$ref": "#/components/schemas/SensorBrand"
          },
          "SensorSN": {
            "maxLength": 32,
            "minLength": 1,
            "type": "string",
            "description": "The manufacturer serial number. Uptivo serials contain one of 0, M, D, L, or X followed by six digits.\r\nGarmin and MyZone serials are positive decimal numbers."
          }
        },
        "additionalProperties": false
      },
      "Language": {
        "enum": [
          "English",
          "Italian",
          "Polish",
          "Spanish",
          "French"
        ],
        "type": "string"
      },
      "PaymentAccountType": {
        "enum": [
          "Stripe",
          "PayPal"
        ],
        "type": "string"
      },
      "PaymentMethod": {
        "enum": [
          "Other",
          "Cash",
          "Debit",
          "Credit",
          "WireTransfer"
        ],
        "type": "string"
      },
      "PublishState": {
        "enum": [
          "Unpublished",
          "Published"
        ],
        "type": "string"
      },
      "RankingCriteria": {
        "enum": [
          "Points",
          "Trainings",
          "TrainingTime",
          "Distance",
          "Calories",
          "TargetZoneTime",
          "TargetZonePrc",
          "ValidZonesTime",
          "ValidZonesPrc",
          "ValidZonesPoints",
          "Steps",
          "FloorsClimbed"
        ],
        "type": "string"
      },
      "SensorBrand": {
        "enum": [
          "Uptivo",
          "MyZone",
          "Garmin"
        ],
        "type": "string"
      },
      "SubscriptionForListDTO": {
        "type": "object",
        "properties": {
          "ClassSubscriptionId": {
            "type": "integer",
            "format": "int32"
          },
          "Name": {
            "type": "string",
            "nullable": true
          },
          "ShortDescription": {
            "type": "string",
            "nullable": true
          },
          "MaxWeeklyBookings": {
            "type": "integer",
            "format": "int32"
          },
          "MaxMonthlyBookings": {
            "type": "integer",
            "format": "int32"
          },
          "AutoAssign": {
            "type": "boolean"
          },
          "LongDescription": {
            "type": "string",
            "nullable": true
          },
          "PublishState": {
            "$ref": "#/components/schemas/PublishState"
          },
          "Type": {
            "$ref": "#/components/schemas/ClassSubscriptionType"
          },
          "Plans": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClassSubscriptionPlanForListDTO"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SubscriptionForListDTOIClubQueryIdRangeResultDTO": {
        "type": "object",
        "properties": {
          "NextCursor": {
            "type": "string",
            "description": "Opaque cursor towards larger IDs or newer Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "PrevCursor": {
            "type": "string",
            "description": "Opaque cursor towards smaller IDs or older Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "NextId": {
            "type": "integer",
            "description": "If navigating in ascending order, this is the next Id value (fromId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "PrevId": {
            "type": "integer",
            "description": "If navigating in descending order, this is the previous Id value (toId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "Results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SubscriptionForListDTO"
            },
            "description": "Results from the query",
            "nullable": true
          },
          "Continue": {
            "type": "boolean",
            "description": "If max number of results have been returned, a new query may be required to retrieve remaining data"
          }
        },
        "additionalProperties": false
      },
      "SubscriptionSuspensionDTO": {
        "type": "object",
        "properties": {
          "SuspensionStartDate": {
            "type": "string",
            "description": "First local calendar day of the suspension. When omitted, the suspension starts immediately.",
            "format": "date",
            "nullable": true
          },
          "SuspensionEndDate": {
            "type": "string",
            "description": "Last local calendar day included in the suspension. The subscription is reactivated at the\r\nbeginning of the following day in the club time zone.",
            "format": "date",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SubscriptionSuspensionState": {
        "enum": [
          "None",
          "Scheduled",
          "Active"
        ],
        "type": "string",
        "x-enumDescriptions": [
          "No suspension is currently scheduled or active.",
          "The suspension will begin at SuspensionStartUTC.",
          "The membership is suspended at the current instant."
        ],
        "x-enumDeprecated": [
          false,
          false,
          false
        ]
      },
      "TimeFormat": {
        "enum": [
          "h24",
          "h12"
        ],
        "type": "string"
      },
      "TrainingChallengeRankingDTO": {
        "type": "object",
        "properties": {
          "UserId": {
            "type": "integer",
            "format": "int32"
          },
          "Score": {
            "type": "integer",
            "format": "int32"
          },
          "RankPrc": {
            "type": "integer",
            "format": "int32"
          },
          "Trainings": {
            "type": "integer",
            "format": "int32"
          },
          "BadgeImgNum": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "TrainingTime": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "Distance": {
            "type": "integer",
            "format": "int32"
          },
          "Calories": {
            "type": "integer",
            "format": "int32"
          },
          "Points": {
            "type": "integer",
            "format": "int32"
          },
          "TargetZoneTime": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "TargetZonePrc": {
            "type": "integer",
            "format": "int32"
          },
          "ValidZonesTime": {
            "type": "string",
            "example": "0.00:00:00.000"
          },
          "ValidZonesPrc": {
            "type": "integer",
            "format": "int32"
          },
          "ValidZonesPoints": {
            "type": "integer",
            "format": "int32"
          },
          "Nickname": {
            "type": "string",
            "nullable": true
          },
          "PictureUri": {
            "type": "string",
            "nullable": true
          },
          "ClubName": {
            "type": "string",
            "nullable": true
          },
          "Rank": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "TrainingOrigin": {
        "enum": [
          "Any",
          "Personal",
          "Club"
        ],
        "type": "string",
        "description": "Classifies or filters trainings by execution context. The meaning is relative to the endpoint scope:\r\nuser-scoped endpoints distinguish trainings with and without a \u0060ClubId\u0060; club- and brand-scoped endpoints\r\ncompare the execution context with the club or brand requested by the endpoint.",
        "x-enumDescriptions": [
          "Do not restrict results by execution context.",
          "In user scope, a training without a ClubId. In club or brand scope, a current athlete\u0027s training performed without a club or outside the requested club or brand.",
          "In user scope, a training with a ClubId. In club or brand scope, a training performed in the requested club or in one of the requested brand\u0027s clubs."
        ],
        "x-enumDeprecated": [
          false,
          false,
          false
        ]
      },
      "TrainingTelemetryDTO": {
        "required": [
          "HeartBeats",
          "GeoPositions",
          "Powers",
          "Cadences",
          "Hits"
        ],
        "type": "object",
        "properties": {
          "HeartBeats": {
            "type": "array",
            "items": {
              "maxItems": 2,
              "minItems": 2,
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int64"
              },
              "example": [
                1603317955000,
                92
              ]
            },
            "description": "Tuples [timestamp, bpm]."
          },
          "GeoPositions": {
            "type": "array",
            "items": {
              "maxItems": 5,
              "minItems": 5,
              "type": "array",
              "items": {
                "type": "number",
                "format": "double"
              },
              "example": [
                1602916604000,
                1750.97509765625,
                45.7227933,
                9.1307737,
                401.0517578125
              ]
            },
            "description": "Tuples [timestamp, distance from track start, latitude, longitude, altitude]."
          },
          "Powers": {
            "type": "array",
            "items": {
              "maxItems": 2,
              "minItems": 2,
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int64"
              },
              "example": [
                1603350935000,
                203
              ]
            },
            "description": "Tuples [timestamp, power]."
          },
          "Cadences": {
            "type": "array",
            "items": {
              "maxItems": 2,
              "minItems": 2,
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int64"
              },
              "example": [
                1596470835000,
                82
              ]
            },
            "description": "Tuples [timestamp, cadence]."
          },
          "Hits": {
            "type": "array",
            "items": {
              "maxItems": 19,
              "minItems": 19,
              "type": "array",
              "items": {
                "type": "number",
                "format": "double"
              },
              "description": "HIT sample tuple: [timestamp in Unix milliseconds, right count, right average force in g, right maximum force in g, right average speed in km/h, right maximum speed in km/h, right out time in seconds, right minimum out time in seconds, right in time in seconds, right minimum in time in seconds, left count, left average force in g, left maximum force in g, left average speed in km/h, left maximum speed in km/h, left out time in seconds, left minimum out time in seconds, left in time in seconds, left minimum in time in seconds].",
              "example": [
                1603350935000,
                1,
                215.25,
                320.5,
                8.2,
                9.7,
                0.3,
                0.2,
                0.4,
                0.25,
                1,
                210.75,
                315,
                8.1,
                9.6,
                0.31,
                0.21,
                0.41,
                0.26
              ]
            },
            "description": "19-element tuples: timestamp followed by right-side then left-side count, average/max force (g), average/max speed (km/h), out/min-out/in/min-in time (seconds)."
          }
        },
        "additionalProperties": false,
        "description": "Available telemetry series for the training. All five arrays are present and can be empty."
      },
      "TrainingType": {
        "enum": [
          "Unspecified",
          "Running",
          "Cycling",
          "Walking",
          "MountainBiking",
          "CrossCountrySkiing",
          "DownhillSkiing",
          "FunctionalTraining",
          "Rowing",
          "NordicWalking",
          "Skating",
          "Hiking",
          "Tennis",
          "Squash",
          "WeightTraining",
          "OtherWithGPS",
          "OtherWithoutGPS",
          "TreadmillRunning",
          "IndoorCycling",
          "IndoorWalking",
          "HIIT",
          "IndoorRowing",
          "AquaCycling",
          "WaterAerobics",
          "Yoga",
          "Zumba",
          "Basketball",
          "Volleyball",
          "Kayak",
          "Bootcamp",
          "Calisthenics",
          "ClimbingOutdoor",
          "ClimbingIndoor",
          "Crossfit",
          "Dancing",
          "EMS",
          "Fitboxing",
          "CombatFitness",
          "Padel",
          "PersonalTraining",
          "Pilates",
          "Swimming",
          "Trampoline",
          "PoleDance",
          "GAG",
          "Fencing",
          "Soccer",
          "ZRFit",
          "ZRStrong",
          "ZRBooster",
          "ZRBilanInBody",
          "ZRHypericeExperience",
          "Switching",
          "Golf",
          "Elliptical",
          "Strafit",
          "HorseRiding",
          "Dressage",
          "ShowJumping",
          "Postural",
          "BlastJump",
          "Boxing",
          "HybridTraining",
          "ATHX",
          "Motorcycling"
        ],
        "type": "string"
      },
      "UnitsSystem": {
        "enum": [
          "Metric",
          "Imperial"
        ],
        "type": "string"
      },
      "UpdateUserSubscriptionDTO": {
        "required": [
          "From",
          "To"
        ],
        "type": "object",
        "properties": {
          "From": {
            "type": "string",
            "description": "Inclusive membership start, between 2020-01-01 and 2100-01-01.",
            "format": "date-time"
          },
          "To": {
            "type": "string",
            "description": "Inclusive membership end, at least one day after From and no later than 2100-01-01.",
            "format": "date-time"
          },
          "ReactivationDate": {
            "type": "string",
            "description": "Automatic reactivation timestamp supported for existing integrations. Prefer the dedicated suspension endpoint.",
            "format": "date-time",
            "nullable": true
          },
          "IsSuspended": {
            "type": "boolean",
            "description": "Suspension control supported for existing integrations. Omit it to preserve the current suspension; prefer the dedicated suspension endpoint.",
            "nullable": true
          },
          "MaxActivities": {
            "maximum": 100,
            "minimum": 0,
            "type": "integer",
            "description": "Maximum usable activities, from 0 to 100. Zero means unlimited.",
            "format": "int32"
          },
          "AvailableActivities": {
            "maximum": 100,
            "minimum": 0,
            "type": "integer",
            "description": "Remaining activities, from 0 to MaxActivities.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Writable state for a UserSubscription managed through the Club API."
      },
      "UptivoWebHookSubscriptionCreateDTO": {
        "required": [
          "EventTypes",
          "Url"
        ],
        "type": "object",
        "properties": {
          "Url": {
            "minLength": 1,
            "type": "string",
            "description": "Fully qualified HTTP or HTTPS destination URL.",
            "format": "uri"
          },
          "EventTypes": {
            "minItems": 1,
            "uniqueItems": true,
            "type": "array",
            "items": {
              "enum": [
                "Athlete.Created",
                "Athlete.Deleted",
                "Athlete.LevelChanged",
                "Athlete.Updated",
                "Badge.Awarded",
                "Class.Deleted",
                "Class.Published",
                "Class.Unpublished",
                "Class.Updated",
                "ClassParticipant.Created",
                "ClassParticipant.Deleted",
                "ClassParticipant.Updated",
                "Contact.Created",
                "Contact.Deleted",
                "Contact.Updated",
                "Subscription.Created",
                "Subscription.Deleted",
                "Subscription.Plans.Updated",
                "Subscription.Published",
                "Subscription.Unpublished",
                "Subscription.Updated",
                "Training.Created",
                "UserSubscription.Created",
                "UserSubscription.Deleted",
                "UserSubscription.Updated"
              ],
              "type": "string"
            },
            "description": "Non-empty set of supported, case-sensitive Uptivo event names."
          }
        },
        "additionalProperties": false
      },
      "UptivoWebHookSubscriptionDTO": {
        "type": "object",
        "properties": {
          "Url": {
            "type": "string",
            "description": "Configured webhook destination URL.",
            "nullable": true
          },
          "EventTypes": {
            "uniqueItems": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Set of Uptivo event names delivered to this subscription.",
            "nullable": true
          },
          "SubscriptionId": {
            "type": "string",
            "description": "Opaque identifier used to read, update, or delete this subscription.",
            "nullable": true
          },
          "ProvisioningState": {
            "enum": [
              "Creating",
              "Updating",
              "Deleting",
              "Succeeded",
              "Canceled",
              "Failed",
              "AwaitingManualAction"
            ],
            "type": "string",
            "description": "Lifecycle state of the event subscription. \u0060Succeeded\u0060 is the normal active state.\r\nPossible values include: \u0060Creating\u0060, \u0060Updating\u0060, \u0060Deleting\u0060, \u0060Succeeded\u0060,\r\n\u0060Canceled\u0060, \u0060Failed\u0060, and \u0060AwaitingManualAction\u0060.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UptivoWebHookSubscriptionUpdateDTO": {
        "type": "object",
        "properties": {
          "Url": {
            "type": "string",
            "description": "Optional fully qualified HTTP or HTTPS destination URL.",
            "format": "uri",
            "nullable": true
          },
          "EventTypes": {
            "minItems": 1,
            "uniqueItems": true,
            "type": "array",
            "items": {
              "enum": [
                "Athlete.Created",
                "Athlete.Deleted",
                "Athlete.LevelChanged",
                "Athlete.Updated",
                "Badge.Awarded",
                "Class.Deleted",
                "Class.Published",
                "Class.Unpublished",
                "Class.Updated",
                "ClassParticipant.Created",
                "ClassParticipant.Deleted",
                "ClassParticipant.Updated",
                "Contact.Created",
                "Contact.Deleted",
                "Contact.Updated",
                "Subscription.Created",
                "Subscription.Deleted",
                "Subscription.Plans.Updated",
                "Subscription.Published",
                "Subscription.Unpublished",
                "Subscription.Updated",
                "Training.Created",
                "UserSubscription.Created",
                "UserSubscription.Deleted",
                "UserSubscription.Updated"
              ],
              "type": "string"
            },
            "description": "Optional non-empty replacement set of supported, case-sensitive Uptivo event names. Omit it to retain the current set.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UserClassSubscriptionDTO": {
        "required": [
          "From",
          "To"
        ],
        "type": "object",
        "properties": {
          "UserClassSubscriptionId": {
            "type": "integer",
            "format": "int32"
          },
          "ClassSubscriptionId": {
            "type": "integer",
            "format": "int32"
          },
          "UserId": {
            "type": "integer",
            "format": "int32"
          },
          "From": {
            "type": "string",
            "format": "date-time"
          },
          "To": {
            "type": "string",
            "format": "date-time"
          },
          "DurationDays": {
            "type": "integer",
            "format": "int32"
          },
          "MaxActivities": {
            "maximum": 100,
            "minimum": 0,
            "type": "integer",
            "description": "Use 0 for unlimited activities",
            "format": "int32"
          },
          "AvailableActivities": {
            "maximum": 100,
            "minimum": 0,
            "type": "integer",
            "description": "Remaining activities",
            "format": "int32"
          },
          "ClassSubscriptionPlanId": {
            "type": "integer",
            "description": "Plan used to create the user subscription",
            "format": "int32",
            "nullable": true
          },
          "SuspendedAtUTC": {
            "type": "string",
            "description": "Compatibility alias for SuspensionStartUTC. It can be in the future when SuspensionState is Scheduled.",
            "format": "date-time",
            "nullable": true
          },
          "SuspensionStartUTC": {
            "type": "string",
            "description": "Suspension start instant. It can be in the future for a scheduled suspension.",
            "format": "date-time",
            "nullable": true,
            "readOnly": true
          },
          "ReactivationDate": {
            "type": "string",
            "description": "Absolute instant when the suspension will end automatically; null means no automatic reactivation.",
            "format": "date-time",
            "nullable": true
          },
          "Interval": {
            "$ref": "#/components/schemas/BillingInterval"
          },
          "IntervalCount": {
            "maximum": 400,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "PaymentAccount": {
            "$ref": "#/components/schemas/PaymentAccountType"
          },
          "ExtSubscriptionId": {
            "type": "string",
            "nullable": true
          },
          "ExtStatus": {
            "type": "string",
            "nullable": true
          },
          "Disabled": {
            "type": "boolean"
          },
          "ExtInvoiceId": {
            "type": "string",
            "nullable": true
          },
          "DueDateUTC": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "SuspensionState": {
            "$ref": "#/components/schemas/SubscriptionSuspensionState"
          },
          "IsSuspended": {
            "type": "boolean",
            "description": "Whether the subscription is suspended at the current instant. It is false for a scheduled suspension.",
            "readOnly": true
          },
          "SuspendedDays": {
            "type": "integer",
            "format": "int32",
            "readOnly": true
          }
        },
        "additionalProperties": false
      },
      "UserClassSubscriptionDTOIClubQueryIdRangeResultDTO": {
        "type": "object",
        "properties": {
          "NextCursor": {
            "type": "string",
            "description": "Opaque cursor towards larger IDs or newer Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "PrevCursor": {
            "type": "string",
            "description": "Opaque cursor towards smaller IDs or older Begin instants, independent of page order. Pass unchanged as cursor.",
            "nullable": true
          },
          "NextId": {
            "type": "integer",
            "description": "If navigating in ascending order, this is the next Id value (fromId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "PrevId": {
            "type": "integer",
            "description": "If navigating in descending order, this is the previous Id value (toId) to use for fetch more data",
            "format": "int32",
            "nullable": true
          },
          "Results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UserClassSubscriptionDTO"
            },
            "description": "Results from the query",
            "nullable": true
          },
          "Continue": {
            "type": "boolean",
            "description": "If max number of results have been returned, a new query may be required to retrieve remaining data"
          }
        },
        "additionalProperties": false
      },
      "UserImportResultState": {
        "enum": [
          "Created",
          "Invited",
          "AlreadyInClub",
          "PendingInvitation",
          "Added"
        ],
        "type": "string",
        "description": "Successful outcome of POST /Athletes. Failed outcomes are returned as non-2xx responses containing ApiErrorDTO."
      }
    },
    "securitySchemes": {
      "ClubApiKey": {
        "type": "http",
        "description": "Club API Key supplied by Uptivo. It selects the club and grants Read or ReadWrite access.",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      },
      "SubscriptionKey": {
        "type": "apiKey",
        "description": "Subscription Key supplied by Uptivo. It identifies the authorized integration.",
        "name": "X-Sub-Key",
        "in": "header"
      }
    }
  },
  "tags": [
    {
      "name": "Athletes",
      "description": "Create, retrieve, update, and remove athletes in the club selected by the Club API Key. Creating an athlete may create a new Uptivo account, add an existing account to the club, or send an invitation. See the [Athletes guide](/guides/athletes/) for onboarding outcomes and synchronization guidance."
    },
    {
      "name": "BadgeAwards",
      "description": "Read challenge badge awards for current athletes of the selected club. Includes awards from club challenges and challenges of the club\u0027s brand, regardless of who owns the badge design. Requires Read or ReadWrite access. See the [Badge awards guide](/guides/badge-awards/) for history, pagination, and webhook reconciliation."
    },
    {
      "name": "Bookings",
      "description": "Read bounded pages of saved bookings by club, class or user. Requires Read or ReadWrite access. Only published Club, PT and Services classes and non-demo users are returned. NoShow is a recorded flag, not physical check-in evidence. See the [Bulk summaries and bookings guide](/guides/bulk-summaries-and-bookings/#read-saved-bookings)."
    },
    {
      "name": "Calendars",
      "description": "Browse class schedules for the selected club. Club, personal-training, and service calendars are supported, with optional class descriptions, accepted subscriptions, and participant IDs. See the [Classes and calendars guide](/guides/classes/) for windowing and reconciliation."
    },
    {
      "name": "Challenges",
      "description": "Read club challenges and enabled challenges of its gamification brand. Results expose only current non-demo athletes of the connected club, preserving challenge-wide ranks. Requires Read or ReadWrite access. Scheduled templates and personal challenges are excluded. See the [Challenges and results guide](/guides/challenges/)."
    },
    {
      "name": "Classes",
      "description": "Read published classes and manage athlete participation in the selected club. Booking operations enforce class availability, eligibility, payment, and queue rules unless an explicit override is supplied. See the [Classes guide](/guides/classes/) and [Class participants guide](/guides/class-participants/) for calendar, attendance, payment, queue, and conflict handling."
    },
    {
      "name": "Club",
      "description": "Verify Club API access and retrieve the profile of the club selected by the Club API Key. The key determines the club scope for every operation in this reference. See the [Club guide](/guides/club/) for credential-to-club mapping and profile usage."
    },
    {
      "name": "Contacts",
      "description": "Retrieve non-demo contacts and set their club-specific commercial stage in the club selected by the Club API Key. A Contact is a club relationship, not an Athlete membership, and does not expose training or engagement data. See the [Contacts guide](/guides/contacts/) for synchronization and lifecycle guidance."
    },
    {
      "name": "MembershipSummaries",
      "description": "Read effective membership states and assignment details for current non-demo athletes of the selected club. Each summary combines all of the athlete\u0027s club UserSubscriptions, including overlapping assignments and suspensions. See the [Bulk summaries and bookings guide](/guides/bulk-summaries-and-bookings/#read-effective-membership-states) for state rules and reconciliation."
    },
    {
      "name": "Subscriptions",
      "description": "Browse the subscription products and plans configured by the selected club. These catalog entries define what can later be assigned to individual athletes. See the [Subscriptions guide](/guides/subscriptions/) for publication state, plans, and commercial amounts."
    },
    {
      "name": "Telemetry",
      "description": "Retrieve raw heart-rate, geoposition, power, cadence, and HIT samples for athletes of the selected club. Telemetry uses compact numeric tuples and requests are limited to five-hour intervals. See the [Telemetry guide](/guides/telemetry/) for tuple layouts, units, and performance guidance."
    },
    {
      "name": "Trainings",
      "description": "Retrieve workouts performed in the selected club or owned by its current athletes. Add withTelemetry or withUser to enrich the same public training DTO. See the [Trainings guide](/guides/trainings/) for origin filtering and synchronization guidance."
    },
    {
      "name": "UserSubscriptions",
      "description": "Manage UserSubscriptions: subscription products assigned to individual athletes. Use these operations to list, create, update, suspend, reactivate, or delete club memberships. See the [User subscriptions guide](/guides/user-subscriptions/) for lifecycle workflows and the [Suspensions guide](/guides/user-subscription-suspensions/) for scheduled or immediate suspension."
    },
    {
      "name": "Webhooks",
      "description": "Manage webhook subscriptions scoped to the selected club. Webhooks deliver supported Uptivo events to a validated HTTP or HTTPS endpoint. See [Webhook subscriptions](/webhooks/subscriptions/) for provisioning and [Receiving events](/webhooks/receiving-events/) for handler behavior."
    }
  ]
}
