openapi: 3.1.0 info: title: Ready2Race Application API description: REST-like API for CSR application Ready2Race version: 0.0.1 paths: /login: post: operationId: userLogin requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/LoginRequest' responses: 200: description: Successfully logged in, returns relevant user data content: application/json: schema: $ref: '#/components/schemas/LoginDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 422: $ref: '#/components/responses/422' 429: $ref: '#/components/responses/429' 500: $ref: '#/components/responses/500' get: operationId: checkUserLogin responses: 200: description: Already logged in, returns relevant user data content: application/json: schema: $ref: '#/components/schemas/LoginDto' 204: $ref: '#/components/responses/204' 500: $ref: '#/components/responses/500' delete: operationId: userLogout responses: 204: $ref: '#/components/responses/204' 500: $ref: '#/components/responses/500' /privileges: get: operationId: getPrivileges responses: 200: description: All system privileges content: application/json: schema: type: array items: $ref: '#/components/schemas/PrivilegeDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /user: get: operationId: getUsers parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' - name: noClub in: query schema: type: boolean description: Optional parameter that filters users that have a club assigned to them required: false responses: 200: description: User page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/AppUserDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /user/{userId}: parameters: - name: userId in: path required: true schema: type: string format: uuid get: operationId: getUser responses: 200: description: User successfully retrieved content: application/json: schema: $ref: '#/components/schemas/AppUserDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: updateUser requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateAppUserRequest' responses: 204: description: User successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /user/registration: post: operationId: registerUser parameters: - $ref: '#/components/parameters/challenge' - $ref: '#/components/parameters/input' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AppUserRegisterRequest' responses: 204: description: Registration initiated 400: $ref: '#/components/responses/400' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getRegistrations parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Registration page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/AppUserRegistrationDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /user/registration/verify: post: operationId: verifyUserRegistration requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VerifyRegistrationRequest' responses: 201: description: Registration completed, user added 400: $ref: '#/components/responses/400' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /user/registration/singleCompetitionSelfRegistrationsAvailable: get: operationId: getSingleCompetitionSelfRegistrationsAvailable responses: 200: description: SingleCompetitionRegistrationsAvailable successfully retrieved content: application/json: schema: type: boolean 400: $ref: '#/components/responses/400' 500: $ref: '#/components/responses/500' /user/invitation: post: operationId: inviteUser requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InviteRequest' responses: 204: description: Invitation initiated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getInvitations parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Invitation page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/AppUserInvitationDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /user/invitation/accept: post: operationId: acceptUserInvitation requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AcceptInvitationRequest' responses: 201: description: Invitation accepted, user added 400: $ref: '#/components/responses/400' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /user/invitation/{invitationId}: parameters: - name: invitationId in: path required: true schema: type: string format: uuid delete: operationId: deleteInvitation responses: 204: $ref: '#/components/responses/204' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /user/invitation/{invitationId}/resend: parameters: - name: invitationId in: path required: true schema: type: string format: uuid put: operationId: resendInvitation requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ResendInvitationRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /user/resetPassword: post: operationId: initPasswordReset parameters: - $ref: '#/components/parameters/challenge' - $ref: '#/components/parameters/input' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PasswordResetInitRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 429: $ref: '#/components/responses/429' 500: $ref: '#/components/responses/500' /user/resetPassword/{passwordResetToken}: parameters: - name: passwordResetToken in: path required: true schema: type: string put: operationId: resetPassword requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PasswordResetRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /user/event/{eventId}: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getUsersForEvent parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: User page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/AppUserForEventDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /role: post: operationId: addRole requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RoleRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getRoles parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Role page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/RoleDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /role/{roleId}: parameters: - name: roleId in: path required: true schema: type: string format: uuid put: operationId: updateRole requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RoleRequest' responses: 204: description: Event successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteRole responses: 204: description: Role successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event: post: operationId: addEvent requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateEventRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getEvents parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Event page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/EventDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/public: get: operationId: getPublicEvents parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Event page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/EventPublicDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/registration: get: operationId: getEventRegistrations parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Event Registration page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/EventRegistrationViewDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getEvent responses: 200: description: Event successfully retrieved content: application/json: schema: $ref: '#/components/schemas/EventDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: updateEvent requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateEventRequest' responses: 204: description: Event successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteEvent responses: 204: description: Event successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/invoices: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getEventInvoices parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Invoices page for event successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/InvoiceDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/invoicingInfo: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getEventInvoicingInfo responses: 200: description: Invoices info for this event retrieved content: application/json: schema: $ref: '#/components/schemas/EventInvoicesInfoDto' /event/{eventId}/matches: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getEventMatches parameters: - name: activated in: query schema: type: boolean description: "Filter matches by whether they have been called to the start (activated_at is set)" - name: withoutPlaces in: query schema: type: boolean description: Filter matches where teams have no places set responses: 200: description: Matches for event successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/MatchForRunningStatusDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/caterer-transactions: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getEventCatererTransactions parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Caterer transactions page for event successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/CatererTransactionViewDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/eventDay: parameters: - $ref: '#/components/parameters/eventId' post: operationId: addEventDay requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EventDayRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getEventDays parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' - name: competitionId in: query schema: type: string format: uuid description: Optional parameter that filters by competitionId required: false responses: 200: description: EventDay page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/EventDayDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/eventDay/{eventDayId}: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/eventDayId' get: operationId: getEventDay responses: 200: description: EventDay successfully retrieved content: application/json: schema: $ref: '#/components/schemas/EventDayDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: updateEventDay requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EventDayRequest' responses: 204: description: EventDay successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteEventDay responses: 204: description: EventDay successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/eventDay/{eventDayId}/competitions: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/eventDayId' put: operationId: assignCompetitionsToEventDay requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AssignCompetitionsToDayRequest' responses: 204: description: Competitions successfully assigned to day 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/competition: parameters: - $ref: '#/components/parameters/eventId' post: operationId: addCompetition requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompetitionPropertiesRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getCompetitions parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' - name: eventDayId in: query schema: type: string format: uuid description: Optional parameter that filters by eventDayId required: false responses: 200: description: Competition page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/CompetitionDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' get: operationId: getCompetition responses: 200: description: Competition successfully retrieved content: application/json: schema: $ref: '#/components/schemas/CompetitionDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: updateCompetition requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompetitionPropertiesRequest' responses: 204: description: Competition successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteCompetition responses: 204: description: Competition successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/days: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' put: operationId: assignDaysToCompetition requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AssignDaysToCompetitionRequest' responses: 204: description: Days successfully assigned to competition 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionRegistration: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' get: operationId: getCompetitionRegistrations parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: CompetitionRegistration page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/CompetitionRegistrationDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' post: operationId: addCompetitionRegistration parameters: - in: query name: registrationType required: false schema: $ref: '#/components/schemas/RegistrationInvoiceType' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompetitionRegistrationTeamUpsertDto' responses: 200: content: application/json: schema: $ref: '#/components/schemas/CompetitionRegistrationDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionRegistration/{competitionRegistrationId}: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - $ref: '#/components/parameters/competitionRegistrationId' put: operationId: updateCompetitionRegistration parameters: - in: query name: registrationType required: false description: required as managing with global permission schema: $ref: '#/components/schemas/RegistrationInvoiceType' - in: query name: ratingCategory required: false schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompetitionRegistrationTeamUpsertDto' responses: 204: description: Competition registration successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteCompetitionRegistration responses: 204: description: CompetitionRegistration successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionRegistration/{competitionRegistrationId}/deregistration: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - $ref: '#/components/parameters/competitionRegistrationId' post: operationId: deregisterCompetitionRegistration requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompetitionDeregistrationRequest' responses: 204: description: Competition registration successfully deregistered 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' delete: operationId: revertCompetitionDeregistration responses: 204: description: Competition deregistration successfully reverted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionRegistration/teams: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' get: operationId: getCompetitionRegistrationTeams parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' - in: query name: onlyUnverified required: false schema: type: boolean responses: 200: description: CompetitionRegistrationTeam page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/CompetitionRegistrationTeamDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionSetup: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' put: operationId: updateCompetitionSetup requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompetitionSetupDto' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getCompetitionSetup responses: 200: description: CompetitionSetup successfully retrieved content: application/json: schema: $ref: '#/components/schemas/CompetitionSetupDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' get: operationId: getCompetitionExecutionProgress description: "Polled by the execution page in the interval configured on the event. Send the ETag of the previous answer as If-None-Match to get a 304 without a body while nothing changed." responses: 200: description: Competition execution progress successfully retrieved headers: ETag: schema: type: string content: application/json: schema: $ref: '#/components/schemas/CompetitionExecutionProgressDto' 304: description: Unchanged since the ETag sent as If-None-Match 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' delete: operationId: deleteCurrentCompetitionExecutionRound responses: 204: description: Current competition execution round successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/createNextRound: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' post: operationId: createNextCompetitionRound responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/{competitionMatchId}/data: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: competitionMatchId in: path required: true schema: type: string format: uuid put: operationId: updateMatchData requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateCompetitionMatchRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/{competitionMatchId}/activation: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: competitionMatchId in: path required: true schema: type: string format: uuid put: operationId: updateMatchActivation requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateCompetitionMatchActivationRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/round/{setupRoundId}/startList: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: setupRoundId in: path required: true schema: type: string format: uuid get: operationId: downloadRoundStartList description: "The start list of a whole round as one CSV (single header, waves told apart by the wave-name column) - one import into the timing tooling instead of one per match" responses: 200: description: The start list file content: text/csv: schema: type: string format: binary 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/{competitionMatchId}/bye-must-race: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: competitionMatchId in: path required: true schema: type: string format: uuid put: operationId: updateMatchByeMustRace description: >- Toggles 'must race' on a bye match (competition_match.bye_must_race). The match then operationally counts as a real race (start list exports, RaceClocker polling, the chain waits for it to be finished), while progression keeps bye semantics - the racing team moves on regardless of the measured time, which is displayed as out of competition. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateMatchByeMustRaceRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/{competitionMatchId}/mark-started: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: competitionMatchId in: path required: true schema: type: string format: uuid put: operationId: markMatchStartedFromExecution description: "Records the real start of the match (idempotent) and activates it if it was not - the office-side counterpart of the referee dashboard's 'running' button" responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/{competitionMatchId}/finish: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: competitionMatchId in: path required: true schema: type: string format: uuid put: operationId: finishMatchFromExecution description: "Finishes the match from the execution page (regatta office side). Works in every chainProgressionMode, like finishScheduleSlot - unlike finishLiveDashboardMatch, which is gated in REGATTABUERO mode." parameters: - name: openResults in: query required: false description: "Marks every team without a result as failed with this reason. Deregistered teams are left alone." schema: type: string enum: [DNS, DNF, DSQ] responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/{competitionMatchId}/reopen: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: competitionMatchId in: path required: true schema: type: string format: uuid put: operationId: reopenMatch description: "Takes back the finish stamp of a finished match in the latest round - activation, real start and results stay untouched" responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/{competitionMatchId}/reset: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: competitionMatchId in: path required: true schema: type: string format: uuid put: operationId: resetMatch description: "Resets a single match to 'never raced': clears activation, real start, finish stamp, places, times, penalties and laps while keeping the line-up, lanes and all row UUIDs (external timing references stay valid). Only allowed while the following round has no created matches yet." responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/{competitionMatchId}/results: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: competitionMatchId in: path required: true schema: type: string format: uuid put: operationId: updateMatchResults requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateCompetitionMatchResultRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/raceclocker-race: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getRaceClockerRaces description: The named RaceClocker races of this event - one per race in the timing system. responses: 200: description: RaceClocker races successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/RaceClockerRaceDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' post: operationId: addRaceClockerRace requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RaceClockerRaceRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/raceclocker-race/competition-assignments: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getRaceClockerCompetitionAssignments description: "The reverse view: every competition of the event with its explicit RaceClocker race choice (null = inherits the event default), for assigning competitions from the race side." responses: 200: description: Competition assignments content: application/json: schema: type: array items: $ref: '#/components/schemas/CompetitionRaceAssignmentDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/raceclocker-race/{raceId}/assignments: parameters: - $ref: '#/components/parameters/eventId' - name: raceId in: path required: true schema: type: string format: uuid put: operationId: setRaceClockerRaceAssignments description: "Set which competitions use this race (reverse assignment). Checking a competition here moves it away from another race - the last click wins; unchecking a competition that pointed here falls back to inheriting the event default." requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RaceClockerRaceAssignmentsRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/raceclocker-race/{raceId}: parameters: - $ref: '#/components/parameters/eventId' - name: raceId in: path required: true schema: type: string format: uuid put: operationId: updateRaceClockerRace requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RaceClockerRaceRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteRaceClockerRace responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/timing-config: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getEventTimingConfig description: The event-wide timing defaults - inherited by every competition without its own values. responses: 200: description: Event timing configuration successfully retrieved content: application/json: schema: $ref: '#/components/schemas/EventTimingConfigDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: updateEventTimingConfig requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EventTimingConfigRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/notice: parameters: - $ref: '#/components/parameters/eventId' put: operationId: updateEventNotice description: >- Sets or clears the event-wide notice banner (e.g. a weather warning) - both fields set means set, both null means clear. Deliberately a small dedicated endpoint instead of a field on the big event update, so the race-day action stays lightweight. The notice is read through EventDto and embedded in the polled public responses (my-event, board view, live dashboard, live-matches); caches and poll intervals mean a change takes a few seconds to show up on devices. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateEventNoticeRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/timing-config: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' get: operationId: getTimingConfig description: The timing configuration of this competition - timing system, RaceClocker results URLs and the column presets used for export and import. responses: 200: description: Timing configuration successfully retrieved content: application/json: schema: $ref: '#/components/schemas/TimingConfigDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: updateTimingConfig requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TimingConfigRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/roundProgression: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' get: operationId: getRoundProgressionConfig description: Whether this competition creates the pairings of following rounds automatically - its own setting, the event default it inherits from, and what actually applies. responses: 200: description: Round progression configuration successfully retrieved content: application/json: schema: $ref: '#/components/schemas/RoundProgressionConfigDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: updateRoundProgressionConfig requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RoundProgressionConfigRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/{competitionMatchId}/results/from-raceclocker: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: competitionMatchId in: path required: true schema: type: string format: uuid post: operationId: pullMatchResultsFromRaceClocker description: >- Loads this match's results from the public RaceClocker results feed and writes them onto the match. Teams are matched by the registration id that was exported into RaceClocker's "Extra info" column; places are derived from the times, since the feed carries no rank. Nothing is written unless all checks pass. responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' 502: description: The RaceClocker feed could not be loaded or read content: application/json: schema: $ref: '#/components/schemas/ApiError' /event/{eventId}/competition/{competitionId}/competitionExecution/{competitionMatchId}/results/raceclocker/resume: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: competitionMatchId in: path required: true schema: type: string format: uuid post: operationId: resumeRaceClockerAutoPull description: >- Releases a match back to the automatic RaceClocker pull. Entering results by hand or uploading a file pauses the pull for that match, so the office keeps the last word; this undoes that and clears the last poll error. responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/{competitionMatchId}/startList: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: competitionMatchId in: path required: true schema: type: string format: uuid get: parameters: - name: fileType in: query required: true schema: $ref: '#/components/schemas/StartListFileType' operationId: downloadStartList responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/places: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' get: operationId: getCompetitionPlaces responses: 200: description: Competition places successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/CompetitionTeamPlaceDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/places/csv: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' get: operationId: downloadCompetitionPlacesCSV responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/substitution: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' post: operationId: addSubstitution requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SubstitutionRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/substitution/{substitutionId}: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: substitutionId in: path required: true schema: type: string format: uuid delete: operationId: deleteSubstitution responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/substitution/possibleSubOuts: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' get: operationId: getPossibleSubOuts responses: 200: description: Participants that can be subbed out successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/ParticipantForExecutionDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/substitution/possibleSubIns/{participantId}: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: participantId in: path required: true schema: type: string format: uuid get: operationId: getPossibleSubIns responses: 200: description: Participants that can be subbed in for a specific participant successfully retrieved content: application/json: schema: $ref: '#/components/schemas/PossibleSubstitutionsForParticipantDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/registrationDocuments: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getRegistrationDocuments responses: 200: description: Retrieved event registration documents content: application/json: schema: type: array items: $ref: '#/components/schemas/EventRegistrationDocumentTypeDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/eventDocument: parameters: - $ref: '#/components/parameters/eventId' post: operationId: addDocuments requestBody: required: true content: multipart/form-data: schema: type: object properties: documentType: type: string files: type: array items: type: string format: binary responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getDocuments parameters: - name: documentType in: query required: false schema: type: string format: uuid - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Retrieved event documents content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/EventDocumentDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/eventDocument/{eventDocumentId}: parameters: - $ref: '#/components/parameters/eventId' - name: eventDocumentId in: path required: true schema: type: string format: uuid get: operationId: downloadDocument responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: updateDocument requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EventDocumentRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteDocument responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/exportBundle: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getExportBundle description: >- The event's export bundle in order: uploaded event documents plus exactly one placeholder for the generated start lists. The placeholder is created lazily on first access (default position: last), so every event has one. The PDF bulk start list export concatenates the entries in this order. responses: 200: description: The bundle items in bundle order content: application/json: schema: type: array items: $ref: '#/components/schemas/EventExportBundleItemDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' post: operationId: addExportBundleDocument description: >- Adds an event document to the end of the export bundle. Fails with 409 (EXPORT_BUNDLE_DUPLICATE_DOCUMENT) if the document is already part of the bundle, and with 404 if the document does not belong to this event. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AddEventExportBundleItemRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/exportBundle/order: parameters: - $ref: '#/components/parameters/eventId' put: operationId: reorderExportBundle description: >- Writes the complete new order of the bundle. The submitted ids must contain exactly the current bundle items (each exactly once) - otherwise the request fails with 409 (EXPORT_BUNDLE_ORDER_MISMATCH), typically a second browser tab with a stale state. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EventExportBundleOrderRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/exportBundle/{itemId}: parameters: - $ref: '#/components/parameters/eventId' - name: itemId in: path required: true schema: type: string format: uuid delete: operationId: removeExportBundleItem description: >- Removes a document entry from the bundle. The generated-startlists placeholder cannot be removed (400, EXPORT_BUNDLE_PLACEHOLDER_NOT_REMOVABLE) - it can only be reordered, and deselected per export in the export dialog. responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/participantTracking: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getParticipantTrackings parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' - in: query name: onlyLatest required: false description: "Reduces the log to the most recent event per participant. Defaults to false. The scanType filter is applied AFTER this reduction, so onlyLatest=true with scanType=EXIT answers \"who has checked out onto the water and is not back yet\"." schema: type: boolean - in: query name: scanType required: false description: "Only events with this status. Applied after the onlyLatest reduction." schema: type: string enum: [ENTRY, EXIT] responses: 200: description: ParticipantTracking page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/ParticipantTrackingDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /competitionTemplate: post: operationId: addCompetitionTemplate requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompetitionPropertiesRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getCompetitionTemplates parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: CompetitionTemplate page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/CompetitionTemplateDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /competitionTemplate/{competitionTemplateId}: parameters: - name: competitionTemplateId in: path required: true schema: type: string format: uuid get: operationId: getCompetitionTemplate responses: 200: description: CompetitionTemplate successfully retrieved content: application/json: schema: $ref: '#/components/schemas/CompetitionTemplateDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: updateCompetitionTemplate requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompetitionPropertiesRequest' responses: 204: description: CompetitionTemplate successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteCompetitionTemplate responses: 204: description: CompetitionTemplate successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /competitionCategory: post: operationId: addCompetitionCategory requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompetitionCategoryRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getCompetitionCategories responses: 200: description: CompetitionCategory list successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/CompetitionCategoryDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /competitionCategory/{competitionCategoryId}: parameters: - name: competitionCategoryId in: path required: true schema: type: string format: uuid put: operationId: updateCompetitionCategory requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompetitionCategoryRequest' responses: 204: description: CompetitionCategory successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteCompetitionCategory responses: 204: description: CompetitionCategory successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /challenge/{accessToken}: parameters: - name: accessToken in: path required: true schema: type: string get: operationId: getChallengeInfo responses: 200: description: Challenge information successfully retrieved content: application/json: schema: $ref: '#/components/schemas/ChallengeInfoDto' 400: $ref: '#/components/responses/400' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /namedParticipant: post: operationId: addNamedParticipant requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/NamedParticipantRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getNamedParticipants responses: 200: description: NamedParticipant list successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/NamedParticipantDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /namedParticipant/{namedParticipantId}: parameters: - name: namedParticipantId in: path required: true schema: type: string format: uuid put: operationId: updateNamedParticipant requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/NamedParticipantRequest' responses: 204: description: NamedParticipant successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteNamedParticipant responses: 204: description: NamedParticipant successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /namedParticipant/event/{eventId}: parameters: - name: eventId in: path required: true schema: type: string format: uuid get: operationId: getNamedParticipantsForEvent responses: 200: description: Named participants for event successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/NamedParticipantWithRequirementsDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /captcha: post: operationId: newCaptcha responses: 200: description: New Captcha successfully created content: application/json: schema: $ref: '#/components/schemas/CaptchaDto' 500: $ref: '#/components/responses/500' /club: post: operationId: addClub requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ClubUpsertDto' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getClubs parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Club page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/ClubDto' pagination: $ref: '#/components/schemas/Pagination' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /club/{clubId}: parameters: - in: path name: clubId required: true schema: type: string get: operationId: getClub responses: 200: description: Club successfully retrieved content: application/json: schema: $ref: '#/components/schemas/ClubDto' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: updateClub requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ClubUpsertDto' responses: 204: description: Club successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteClub responses: 204: description: Club successfully deleted 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /club/{clubId}/user: parameters: - in: path name: clubId required: true schema: type: string get: operationId: getClubUsers responses: 200: description: User list successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/AppUserDto' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /club/{clubId}/participant: parameters: - in: path name: clubId required: true schema: type: string get: operationId: getClubParticipants parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Participant page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/ParticipantDto' pagination: $ref: '#/components/schemas/Pagination' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' post: operationId: addClubParticipant requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ParticipantUpsertDto' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /club/import: post: operationId: importClubs requestBody: required: true content: multipart/form-data: schema: type: object required: - request - files properties: request: $ref: '#/components/schemas/ClubImportRequest' files: type: array items: type: string format: binary responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /club/{clubId}/participant/import: parameters: - in: path name: clubId required: true schema: type: string post: operationId: importClubParticipants requestBody: required: true content: multipart/form-data: schema: type: object required: - request - files properties: request: $ref: '#/components/schemas/ParticipantImportRequest' files: type: array items: type: string format: binary responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /club/{clubId}/participant/event: parameters: - in: path name: clubId required: true schema: type: string get: operationId: getClubParticipantsForEvent parameters: - in: query name: eventId required: true schema: type: string format: uuid - in: query name: ratingCategoryId required: false schema: type: string format: uuid responses: 200: description: Participants filtered by event and rating category content: application/json: schema: type: array items: $ref: '#/components/schemas/ParticipantDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /club/{clubId}/participant/search: parameters: - in: path name: clubId required: true schema: type: string get: operationId: searchParticipantsAcrossClubs description: >- Vereinsuebergreifende Suche fuer die Meldemaske. Liefert nur etwas, wenn die Veranstaltung es erlaubt (allowCrossClubRegistration) und mindestens zwei Zeichen eingegeben wurden; die Trefferzahl ist gedeckelt und der eigene Vereinsbestand faellt heraus. parameters: - in: query name: eventId required: true schema: type: string format: uuid - in: query name: search required: false schema: type: string responses: 200: description: Matching participants of other clubs content: application/json: schema: type: array items: $ref: '#/components/schemas/ParticipantSearchResultDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /club/{clubId}/participant/{participantId}/club/{additionalClubId}: parameters: - in: path name: clubId required: true schema: type: string - in: path name: participantId required: true schema: type: string - in: path name: additionalClubId required: true schema: type: string post: operationId: addParticipantAdditionalClub description: >- Ordnet die Person einem weiteren Verein zu. Nur der Stammverein (clubId) und globales Recht duerfen das. responses: 204: description: Additional club added 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' delete: operationId: removeParticipantAdditionalClub description: Loest die Zuordnung wieder. Bestehende Meldungen bleiben unberuehrt. responses: 204: description: Additional club removed 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /club/{clubId}/participant/{participantId}: parameters: - in: path name: clubId required: true schema: type: string - in: path name: participantId required: true schema: type: string get: operationId: getClubParticipant responses: 200: description: Participant successfully retrieved content: application/json: schema: $ref: '#/components/schemas/ParticipantDto' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: updateClubParticipant requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ParticipantUpsertDto' responses: 204: description: Participant successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteClubParticipant responses: 204: description: Participant successfully deleted 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /club/search: get: operationId: getClubNames parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' - in: query name: eventId description: Filter for clubs, which registered for this event required: false schema: type: string responses: 200: description: Club page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/ClubSearchDto' pagination: $ref: '#/components/schemas/Pagination' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /club/{clubId}/clubRepresentative: parameters: - in: path name: clubId required: true schema: type: string format: uuid get: operationId: getPendingClubRepresentativeApprovals responses: 200: description: Pending club representative approvals successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/PendingClubRepresentativeApprovalDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /clubShortName: get: operationId: getClubShortNames parameters: - in: query name: eventId required: false schema: type: string format: uuid responses: 200: description: Club short names successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/ClubShortNameDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /clubShortName/forName: get: operationId: getClubShortNameForName parameters: - in: query name: name required: true schema: type: string responses: 200: description: Club short name successfully resolved content: application/json: schema: $ref: '#/components/schemas/ClubShortNameDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /clubShortName/{nameKey}: parameters: - in: path name: nameKey required: true schema: type: string put: operationId: updateClubShortName requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ClubShortNameRequest' responses: 204: description: Club short name successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteClubShortName responses: 204: description: Club short name successfully deleted 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /clubNameRule: get: operationId: getClubNameRules responses: 200: description: Club name rules successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/ClubNameRuleDto' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' post: operationId: addClubNameRule requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ClubNameRuleRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /clubNameRule/order: put: operationId: reorderClubNameRules requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ClubNameRuleOrderRequest' responses: 204: description: Club name rule order successfully written 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /clubNameRule/{ruleId}: parameters: - in: path name: ruleId required: true schema: type: string format: uuid put: operationId: updateClubNameRule requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ClubNameRuleRequest' responses: 204: description: Club name rule successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteClubNameRule responses: 204: description: Club name rule successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /event/{eventId}/eventRegistration: parameters: - in: path name: eventId required: true schema: type: string format: uuid get: operationId: getRegistrationsForEvent parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Registration page for event retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/EventRegistrationViewDto' pagination: $ref: '#/components/schemas/Pagination' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /event/{eventId}/eventRegistration/{eventRegistrationId}: parameters: - in: path name: eventId required: true schema: type: string format: uuid - in: path name: eventRegistrationId required: true schema: type: string format: uuid get: operationId: getEventRegistration responses: 200: description: Event registration successfully retrieved content: application/json: schema: $ref: '#/components/schemas/EventRegistrationViewDto' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' delete: operationId: deleteEventRegistration responses: 204: description: Event registration successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/eventRegistration/{eventRegistrationId}/invoices: parameters: - in: path name: eventId required: true schema: type: string format: uuid - in: path name: eventRegistrationId required: true schema: type: string format: uuid get: operationId: getRegistrationInvoices parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Invoice list successfully retrieved for registration content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/InvoiceDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/eventRegistration/eventDocumentsAccepted: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getEventRegistrationDocumentsAccepted responses: 200: description: Checks if the event documents have been officially been accepted by a user of the club content: application/json: schema: type: boolean 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/eventRegistration/acceptDocuments: parameters: - $ref: '#/components/parameters/eventId' post: operationId: acceptEventRegistrationDocuments responses: 204: description: Accepts the event documents for an existing event registration 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/eventRegistration/mailRecipients: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getRegistrationMailRecipients responses: 200: description: The registrants of the event, as offered for selection in the bulk mail dialog content: application/json: schema: type: array items: $ref: '#/components/schemas/RegistrationMailRecipientDto' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /event/{eventId}/eventRegistration/mail: parameters: - $ref: '#/components/parameters/eventId' post: operationId: sendRegistrationMail requestBody: required: true content: multipart/form-data: schema: type: object required: - request properties: request: $ref: '#/components/schemas/RegistrationMailRequest' files: type: array items: type: string format: binary responses: 200: description: The mails have been enqueued content: application/json: schema: $ref: '#/components/schemas/RegistrationMailResultDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/registrationTemplate: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getEventRegistrationTemplate responses: 200: description: EventRegistrationTemplate successfully retrieved content: application/json: schema: $ref: '#/components/schemas/EventRegistrationTemplateDto' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/register: parameters: - $ref: '#/components/parameters/eventId' post: operationId: addEventRegistration requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EventRegistrationUpsertDto' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/registrationResult: parameters: - in: path name: eventId required: true schema: type: string get: operationId: getRegistrationResult parameters: - in: query name: remake required: false schema: type: boolean responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/finalizeRegistrations: parameters: - $ref: '#/components/parameters/eventId' - in: query name: keepNumbers description: Whether already set team numbers should be kept required: false schema: type: boolean post: operationId: finalizeRegistrations responses: 204: description: Registrations successfully finalized 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/missingTeamNumbers: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getRegistrationsWithoutTeamNumber responses: 200: description: List of registrations with missing team numbers successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/CompetitionRegistrationsWithoutTeamNumberDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/selfRegister: parameters: - $ref: '#/components/parameters/challenge' - $ref: '#/components/parameters/input' - $ref: '#/components/parameters/eventId' post: operationId: participantSelfRegister requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ParticipantRegisterRequest' responses: 200: description: Participant successfully self-registered 400: $ref: '#/components/responses/400' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /fee: post: operationId: addFee requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/FeeRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getFees parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Fee list successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/FeeDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /fee/{feeId}: parameters: - name: feeId in: path required: true schema: type: string format: uuid put: operationId: updateFee requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/FeeRequest' responses: 204: description: Fee successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteFee responses: 204: description: Fee successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /eventDocumentType: post: operationId: addDocumentType requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EventDocumentTypeRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getDocumentTypes parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: document type list retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/EventDocumentTypeDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /eventDocumentType/{eventDocumentTypeId}: parameters: - name: eventDocumentTypeId in: path required: true schema: type: string format: uuid put: operationId: updateDocumentType requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EventDocumentTypeRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteDocumentType responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/participantRequirement: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getParticipantRequirementsForEvent responses: 200: description: ParticipantRequirementForEvent list successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/ParticipantRequirementForEventDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' post: operationId: checkParticipantRequirementsForEvent requestBody: required: true content: multipart/form-data: schema: type: object properties: config: type: object $ref: '#/components/schemas/ParticipantRequirementCheckForEventConfigDto' files: type: array items: type: string format: binary responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participantRequirement/approve: parameters: - $ref: '#/components/parameters/eventId' post: operationId: approveParticipantRequirementsForEvent description: >- Replaces the COMPLETE approval state of one requirement - participants missing from the payload lose their approval. Meant for the bulk maintenance dialog that sends the full state; single approvals (QR scan app) must use /approve/participant instead. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ParticipantRequirementCheckForEventUpsertDto' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participantRequirement/approve/participant: parameters: - $ref: '#/components/parameters/eventId' post: operationId: approveParticipantRequirementForParticipant description: >- Approves or revokes one requirement for exactly ONE participant - strictly additive and idempotent on record level, other participants, competitions and event days stay untouched. Used by the QR scan app. Dimensions follow the requirement's switches: with perEventDay the current event day is recorded, with perCompetition the optional competitionId decides which competition the approval is for. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ParticipantRequirementApproveForParticipantDto' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participantRequirement/active: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getActiveParticipantRequirementsForEvent responses: 200: description: ParticipantRequirementForEvent list successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/ParticipantRequirementForEventDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participantRequirement/open/export: parameters: - $ref: '#/components/parameters/eventId' get: operationId: exportOpenParticipantRequirements description: >- Downloads an xlsx of the registered participants who are still missing requirements - the basis for notifying their clubs. Without requirementId every requirement active at the event counts. Requirements bound to a named participant only apply to that role, and participants with nothing open are left out. parameters: - name: requirementId in: query required: false description: Limits the export to a single requirement. schema: type: string format: uuid responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/participantRequirement/{participantRequirementId}: parameters: - $ref: '#/components/parameters/eventId' - name: participantRequirementId in: path required: true schema: type: string format: uuid get: operationId: activateParticipantRequirementForEvent responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: removeParticipantRequirementForEvent responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participantRequirement/namedParticipant/{namedParticipantId}: parameters: - $ref: '#/components/parameters/eventId' - name: namedParticipantId in: path required: true schema: type: string format: uuid post: operationId: assignRequirementToNamedParticipant requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AssignRequirementToNamedParticipantDto' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: removeRequirementFromNamedParticipant requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AssignRequirementToNamedParticipantDto' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participantRequirement/qrCode: parameters: - $ref: '#/components/parameters/eventId' put: operationId: updateQrCodeRequirement requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateQrCodeRequirementDto' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participantRequirement/participant/{participantId}: parameters: - $ref: '#/components/parameters/eventId' - name: participantId in: path required: true schema: type: string format: uuid - name: onlyForApp in: query required: true schema: type: boolean get: operationId: getParticipantRequirementsForParticipant responses: 200: description: ParticipantRequirements for participant successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/ParticipantRequirementForEventDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participantRequirement/log: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getParticipantRequirementLog parameters: - name: requirementId in: query required: false schema: type: string format: uuid - name: participantId in: query required: false schema: type: string format: uuid - name: limit in: query required: false schema: type: integer responses: 200: description: Requirement log successfully retrieved content: application/json: schema: type: object required: - data properties: data: type: array items: $ref: '#/components/schemas/ParticipantRequirementLogEntryDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participantRequirement/scanScope: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getEventScanScope responses: 200: description: Scan scope of the event successfully retrieved content: application/json: schema: $ref: '#/components/schemas/ParticipantScanScopeDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participantRequirement/participant/{participantId}/scanScope: parameters: - $ref: '#/components/parameters/eventId' - name: participantId in: path required: true schema: type: string format: uuid get: operationId: getParticipantScanScope responses: 200: description: Scan scope successfully retrieved content: application/json: schema: $ref: '#/components/schemas/ParticipantScanScopeDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participant: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getParticipantsForEvent parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Participant page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/ParticipantForEventDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participant-app: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getParticipantsForEventInApp parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Participant page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/ParticipantForEventDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participant/{qrCode}/teams: parameters: - $ref: '#/components/parameters/eventId' - name: qrCode in: path required: true schema: type: string get: operationId: getTeamsByParticipantQrCode responses: 200: description: Teams associated with participant content: application/json: schema: type: array items: $ref: '#/components/schemas/TeamForScanOverviewDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/participant/{participantId}/checkInOut: parameters: - $ref: '#/components/parameters/eventId' - in: path name: participantId required: true schema: type: string - in: query name: checkIn required: true schema: type: boolean post: operationId: checkInOutParticipant responses: 200: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/participant/{participantId}/tracking: parameters: - $ref: '#/components/parameters/eventId' - in: path name: participantId required: true schema: type: string format: uuid get: operationId: getParticipantTrackingHistory responses: 200: description: Tracking entries and their change trail content: application/json: schema: $ref: '#/components/schemas/ParticipantTrackingHistoryDto' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' post: operationId: addManualParticipantTracking requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ManualTrackingRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/participant/{participantId}/tracking/{trackingId}: parameters: - $ref: '#/components/parameters/eventId' - in: path name: participantId required: true schema: type: string format: uuid - in: path name: trackingId required: true schema: type: string format: uuid put: operationId: correctParticipantTracking requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ManualTrackingRequest' responses: 200: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /participantRequirement/{participantRequirementId}: parameters: - name: participantRequirementId in: path required: true schema: type: string format: uuid put: operationId: updateParticipantRequirement requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ParticipantRequirementUpsertDto' responses: 204: description: ParticipantRequirement successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteParticipantRequirement responses: 204: description: ParticipantRequirement successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /participantRequirement: post: operationId: addParticipantRequirement requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ParticipantRequirementUpsertDto' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getParticipantRequirements responses: 200: description: ParticipantRequirement list successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/ParticipantRequirementDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /competitionSetupTemplate: post: operationId: addCompetitionSetupTemplate requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompetitionSetupTemplateRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getCompetitionSetupTemplates parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: CompetitionSetupTemplate page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/CompetitionSetupTemplateDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /competitionSetupTemplate/{competitionSetupTemplateId}: parameters: - name: competitionSetupTemplateId in: path required: true schema: type: string format: uuid get: operationId: getCompetitionSetupTemplate responses: 200: description: CompetitionSetupTemplate successfully retrieved content: application/json: schema: $ref: '#/components/schemas/CompetitionSetupTemplateDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: updateCompetitionSetupTemplate requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CompetitionSetupTemplateRequest' responses: 204: description: CompetitionSetupTemplate successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteCompetitionSetupTemplate responses: 204: description: CompetitionSetupTemplate successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /competitionSetupTemplate/overview: get: operationId: getCompetitionSetupTemplateOverview responses: 200: description: CompetitionSetupTemplateOverview successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/CompetitionSetupTemplateOverviewDto' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /gapDocumentTemplate: get: operationId: getGapDocumentTemplates parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Gap Document templates page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/GapDocumentTemplateDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' post: operationId: addGapDocumentTemplate requestBody: required: true content: multipart/form-data: schema: type: object required: - request - files properties: request: $ref: '#/components/schemas/GapDocumentTemplateRequest' files: type: array items: type: string format: binary font: description: Optionale Schriftdatei (TTF/OTF), die in die erzeugten PDFs eingebettet wird. type: string format: binary responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /gapDocumentTemplate/import: post: operationId: importGapDocumentTemplate parameters: - name: documentType in: query required: false schema: $ref: '#/components/schemas/GapDocumentType' description: "Overrides the document type claimed by the package manifest. After the import, the template is auto-assigned as the active template of its type if none is assigned yet." requestBody: required: true content: multipart/form-data: schema: type: object required: - file properties: file: description: Austauschpaket (.r2rtpl.zip) einer Urkundenvorlage. type: string format: binary responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /gapDocumentTemplate/{gapDocumentTemplateId}: parameters: - in: path name: gapDocumentTemplateId required: true schema: type: string format: uuid put: operationId: updateGapDocumentTemplate requestBody: required: true content: multipart/form-data: schema: type: object required: - request properties: request: $ref: '#/components/schemas/GapDocumentTemplateRequest' font: description: >- Optionale Schriftdatei (TTF/OTF). Ein leerer Teil löscht eine zuvor gesetzte Schrift, ein fehlender Teil lässt sie unverändert. type: string format: binary responses: 204: description: Successfully updates template 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteGapDocumentTemplate responses: 204: description: Template successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' get: operationId: downloadGapDocumentTemplateOriginal responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /gapDocumentTemplate/{gapDocumentTemplateId}/preview: parameters: - in: path name: gapDocumentTemplateId required: true schema: type: string format: uuid get: operationId: downloadGapDocumentTemplateSample responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /gapDocumentTemplate/{gapDocumentTemplateId}/export: parameters: - in: path name: gapDocumentTemplateId required: true schema: type: string format: uuid get: operationId: exportGapDocumentTemplate responses: 200: description: Template package successfully created content: application/zip: schema: type: string format: binary 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /gapDocumentTemplate/{gapDocumentTemplateId}/font: parameters: - in: path name: gapDocumentTemplateId required: true schema: type: string format: uuid get: operationId: getGapDocumentTemplateFont responses: 200: description: Font successfully retrieved content: application/octet-stream: schema: type: string format: binary 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /gapDocumentTemplateType: get: operationId: getGapDocumentTemplateTypes responses: 200: description: Gap document types successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/GapDocumentTypeDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /gapDocumentTemplateType/{gapDocumentType}/assignTemplate: parameters: - in: path name: gapDocumentType required: true schema: $ref: '#/components/schemas/GapDocumentType' put: operationId: assignGapDocumentTemplate requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AssignGapDocumentTemplateRequest' responses: 204: description: Successfully assigned template to document type 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /documentTemplate: get: operationId: getDocumentTemplates parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' responses: 200: description: Document templates page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/DocumentTemplateDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' post: operationId: addDocumentTemplate requestBody: required: true content: multipart/form-data: schema: type: object required: - request - files properties: request: $ref: '#/components/schemas/DocumentTemplateRequest' files: type: array items: type: string format: binary responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /documentTemplate/{documentTemplateId}: parameters: - in: path name: documentTemplateId required: true schema: type: string format: uuid put: operationId: updateDocumentTemplate requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DocumentTemplateRequest' responses: 204: description: Successfully updates template 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteDocumentTemplate responses: 204: description: Template successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /documentTemplate/{documentTemplateId}/preview: parameters: - in: path name: documentTemplateId required: true schema: type: string format: uuid - in: query name: documentType required: true schema: $ref: '#/components/schemas/DocumentType' get: operationId: downloadDocumentTemplateSample responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /documentTemplateType: get: operationId: getDocumentTemplateTypes responses: 200: description: Document types successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/DocumentTypeDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /documentTemplateType/{documentType}/assignTemplate: parameters: - in: path name: documentType required: true schema: $ref: '#/components/schemas/DocumentType' put: operationId: assignDocumentTemplate requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AssignDocumentTemplateRequest' responses: 204: description: Successfully assigned template to document type 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/task: parameters: - $ref: '#/components/parameters/eventId' post: operationId: addTask requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TaskUpsertDto' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getTasks responses: 200: description: Task list successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/TaskDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/task/{taskId}: parameters: - name: taskId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/eventId' put: operationId: updateTask requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TaskUpsertDto' responses: 204: description: Task successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteTask responses: 204: description: Task successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /user/{userId}/task: parameters: - in: path name: userId required: true schema: type: string get: parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' operationId: getOpenTasksForUser responses: 200: description: Task list successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/TaskDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /bankAccount: get: parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' operationId: getBankAccounts responses: 200: description: Bank accounts page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/BankAccountDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' post: operationId: addBankAccount requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BankAccountRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /bankAccount/{bankAccountId}: parameters: - in: path name: bankAccountId required: true schema: type: string format: uuid put: operationId: updateBankAccount requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BankAccountRequest' responses: 204: description: Bank account successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteBankAccount responses: 204: description: Bank account successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /assignedBankAccount: get: operationId: getAssignedBankAccount parameters: - in: query required: false name: event schema: type: string format: uuid responses: 200: description: Assigned bank account retrieved content: application/json: schema: $ref: '#/components/schemas/AssignedBankAccountDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' put: operationId: assignBankAccount requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AssignBankAccountRequest' responses: 204: description: Bank account successfully assigned 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/appUserWithQrCode: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' get: operationId: getAppUsersWithQrCodeForEvent responses: 200: description: App users with QR codes successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/AppUserWithQrCodeDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/appUserWithQrCode/qrCode/{qrCodeId}: parameters: - $ref: '#/components/parameters/eventId' - name: qrCodeId in: path required: true schema: type: string delete: operationId: deleteQrCodeForEvent responses: 204: description: QR code successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/ratingCategories: parameters: - $ref: '#/components/parameters/eventId' post: operationId: assignRatingCategoriesToEvent requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RatingCategoriesToEventRequest' responses: 204: description: Rating categories successfully assigned to event 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getRatingCategoriesForEvent responses: 200: description: Rating categories for event successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/RatingCategoryToEventDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/ratingCategories/order: parameters: - $ref: '#/components/parameters/eventId' put: operationId: updateRatingCategoryOrderForEvent requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RatingCategoryOrderRequest' responses: 204: description: Order successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/ratingCategories/{ratingCategoryId}: parameters: - $ref: '#/components/parameters/eventId' - name: ratingCategoryId in: path required: true schema: type: string format: uuid delete: operationId: removeRatingCategoryFromEvent responses: 204: description: Rating category successfully removed from event 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/produceInvoices: parameters: - $ref: '#/components/parameters/eventId' post: operationId: produceInvoicesForEventRegistrations requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProduceInvoicesRequest' responses: 204: description: invoice produce jobs successfully created 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /contact: get: parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' operationId: getContacts responses: 200: description: contacts page retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/ContactInformationDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' post: operationId: addContact requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ContactInformationRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /contact/{contactId}: parameters: - in: path name: contactId required: true schema: type: string format: uuid put: operationId: updateContact requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ContactInformationRequest' responses: 204: description: contact information successfully changed 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteContact responses: 204: description: contact information successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /assignedContact: get: operationId: getAssignedContact parameters: - in: query required: false name: event schema: type: string format: uuid responses: 200: description: Assigned contact info retrieved content: application/json: schema: $ref: '#/components/schemas/AssignedContactInformationDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' put: operationId: assignContact requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AssignContactInformationRequest' responses: 204: description: contact successfully assigned 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /worktype: post: operationId: addWorkType requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WorkTypeUpsertDto' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getWorkTypes responses: 200: description: WorkType list successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/WorkTypeDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /worktype/{workTypeId}: parameters: - name: workTypeId in: path required: true schema: type: string format: uuid put: operationId: updateWorkType requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WorkTypeUpsertDto' responses: 204: description: WorkType successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteWorkType responses: 204: description: WorkType successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/workshift: parameters: - $ref: '#/components/parameters/eventId' post: operationId: addWorkShift requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WorkShiftUpsertDto' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: operationId: getWorkShifts parameters: - name: timeFrom in: query required: false schema: type: string format: datetime - name: timeTo in: query required: false schema: type: string format: datetime responses: 200: description: WorkShift list successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/WorkShiftWithAssignedUsersDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/workshift/{workShiftId}: parameters: - name: workShiftId in: path required: true schema: type: string format: uuid - $ref: '#/components/parameters/eventId' put: operationId: updateWorkShift requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WorkShiftUpsertDto' responses: 204: description: WorkShift successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteWorkShift responses: 204: description: WorkShift successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /user/{userId}/workshift: parameters: - name: userId in: path required: true schema: type: string - name: timeFrom in: query required: false schema: type: string format: datetime - name: timeTo in: query required: false schema: type: string format: datetime get: operationId: getWorkShiftsForUser responses: 200: description: Shifts list successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/WorkShiftWithAssignedUsersDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /user/clubRepresentative/approval: get: operationId: getOwnPendingClubRepresentativeApproval description: Returns the logged-in user's pending club representative request, if any. responses: 200: description: Pending club representative request successfully retrieved content: application/json: schema: $ref: '#/components/schemas/OwnPendingClubRepresentativeApprovalDto' 204: description: No pending club representative request 401: $ref: '#/components/responses/401' 500: $ref: '#/components/responses/500' /user/{userId}/clubRepresentative/approval: parameters: - name: userId in: path required: true schema: type: string format: uuid - name: approve in: query required: true schema: type: boolean put: operationId: updateClubRepresentativeApproval responses: 204: description: Club representative successfully approved or denied 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /invoice: get: parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' operationId: getInvoices responses: 200: description: Invoices page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/InvoiceDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /invoice/{invoiceId}: get: operationId: downloadInvoice responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: setInvoicePaid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InvoiceUpdateRequestDto' responses: 204: description: Payment status set to paid 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /startListConfig: post: operationId: addStartListConfig requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/StartListConfigRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' operationId: getStartListConfigs responses: 200: description: Start-list config page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/StartListConfigDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /startListConfig/{startListConfigId}: parameters: - in: path name: startListConfigId required: true schema: type: string format: uuid put: operationId: updateStartListConfig requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/StartListConfigRequest' responses: 204: description: configuration updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' delete: operationId: deleteStartListConfig responses: 204: description: Configuration successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/info/upcoming-matches: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getUpcomingMatches parameters: - name: limit in: query required: true schema: type: integer default: 10 minimum: 1 maximum: 100 responses: 200: description: Upcoming competition matches retrieved successfully content: application/json: schema: type: array items: $ref: '#/components/schemas/UpcomingCompetitionMatchInfo' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/info/latest-match-results: parameters: - $ref: '#/components/parameters/eventId' - in: query name: competitionId required: false schema: type: string format: uuid - in: query name: matchId required: false description: "Restricts the response to the field of one single match (used by My Event) - the visibility rule stays the same, an unreleased match answers with an empty list" schema: type: string format: uuid get: operationId: getLatestMatchResults parameters: - name: limit in: query required: true schema: type: integer default: 10 minimum: 1 maximum: 100 responses: 200: description: Latest match results retrieved successfully content: application/json: schema: type: array items: $ref: '#/components/schemas/LatestMatchResultInfo' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/info/running-matches: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getRunningMatches parameters: - name: limit in: query required: true schema: type: integer default: 10 minimum: 1 maximum: 100 responses: 200: description: Currently running matches retrieved successfully content: application/json: schema: type: array items: $ref: '#/components/schemas/RunningMatchInfo' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/info/live-matches: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getLiveMatches description: >- The "live" tab of the public results page: activated matches (PREPARING, RUNNING) together with the upcoming ones, each carrying its derived state. Finished matches and matches whose boats are all scored are deliberately absent - those are results and are governed by Event.publicResultsVisibility through /latest-match-results. parameters: - name: limit in: query required: true schema: type: integer default: 10 minimum: 1 maximum: 100 responses: 200: description: Live matches retrieved successfully content: application/json: schema: $ref: '#/components/schemas/LiveMatchesDto' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/info/program: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getPublicProgram description: >- The "schedule" tab of the public results page: the whole day program from the timeline, each slot with its derived state - the same entries the SCHEDULE boards render. Carries no lineups and no results; times and places remain behind /latest-match-results and thus behind Event.publicResultsVisibility. responses: 200: description: Program retrieved successfully content: application/json: schema: type: array items: $ref: '#/components/schemas/BoardProgramEntry' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/info/boards: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getPublicBoards description: "Public list of the event's boards (id and name only); carries the redirect of the legacy athlete board url" responses: 200: description: Boards retrieved successfully content: application/json: schema: type: array items: $ref: '#/components/schemas/BoardNameDto' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/info/board/{boardId}: parameters: - $ref: '#/components/parameters/eventId' - name: boardId in: path required: true schema: type: string format: uuid get: operationId: getBoardView description: "Everything one board needs in a single response: resolved configuration, timeline slots and lists" responses: 200: description: Board view retrieved successfully content: application/json: schema: $ref: '#/components/schemas/BoardViewDto' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/info/my-event/{qrCode}: parameters: - $ref: '#/components/parameters/eventId' - name: qrCode in: path required: true description: "Code from the wristband. Unknown codes, codes of another event and codes belonging to a helper account all answer 404 alike." schema: type: string get: operationId: getMyEvent description: "Personal dashboard of one participant, reachable without login through the QR code on the wristband" responses: 200: description: Personal dashboard retrieved successfully content: application/json: schema: $ref: '#/components/schemas/MyEventDto' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/liveDashboard/match/{matchId}/finish: parameters: - $ref: '#/components/parameters/eventId' - name: matchId in: path required: true schema: type: string format: uuid put: operationId: finishLiveDashboardMatch description: "Marks the match as finished and activates the matches of the next start time. Fails with 409 if the event's chainProgressionMode is REGATTABUERO - there, finishing goes exclusively through the schedule tab (see finishScheduleSlot)." parameters: - name: openResults in: query required: false description: "Marks every team without a result as failed with this reason. Deregistered teams are left alone." schema: type: string enum: [DNS, DNF, DSQ] responses: 204: description: Match finished 401: $ref: '#/components/responses/401' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/liveDashboard/match/{matchId}/start: parameters: - $ref: '#/components/parameters/eventId' - name: matchId in: path required: true schema: type: string format: uuid put: operationId: startLiveDashboardMatch description: "Marks the real start of the match; the scheduled start time is left untouched" responses: 204: description: Match marked as started 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/liveDashboard/match/{matchId}/activation: parameters: - $ref: '#/components/parameters/eventId' - name: matchId in: path required: true schema: type: string format: uuid put: operationId: setLiveDashboardMatchActivated description: "Calls the match to the start (activated=true) or takes that back. Deactivating also clears the real start and pauses the automatic RaceClocker pull." parameters: - name: activated in: query required: true schema: type: boolean responses: 204: description: Activation updated 401: $ref: '#/components/responses/401' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/liveDashboard: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getLiveDashboard description: "Polled by the referee dashboard. Send the ETag of the previous answer as If-None-Match to get a 304 without a body while nothing changed." parameters: - name: scope in: query required: false description: "LIVE returns the running matches, or the next upcoming one if none is running. Defaults to ALL." schema: type: string enum: [LIVE, ALL] - name: crew in: query required: false description: "Fills crew per team - last name, short club form and role. Only set from a window wide enough to show it; the payload of a phone stays unchanged. Defaults to false." schema: type: boolean responses: 200: description: Live dashboard data retrieved successfully headers: ETag: schema: type: string content: application/json: schema: $ref: '#/components/schemas/LiveDashboardDto' 304: description: Unchanged since the ETag sent as If-None-Match 401: $ref: '#/components/responses/401' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/liveDashboard/match/{matchId}/team/{teamId}: parameters: - $ref: '#/components/parameters/eventId' - name: matchId in: path required: true schema: type: string format: uuid - name: teamId in: path required: true schema: type: string format: uuid get: operationId: getLiveDashboardTeamDetail description: "Crew and requirement details of one team; deliberately kept out of the polled list" responses: 200: description: Team detail retrieved successfully content: application/json: schema: $ref: '#/components/schemas/LiveDashboardTeamDetailDto' 401: $ref: '#/components/responses/401' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/liveDashboard/match/{matchId}/team/{teamId}/note: parameters: - $ref: '#/components/parameters/eventId' - name: matchId in: path required: true schema: type: string format: uuid - name: teamId in: path required: true schema: type: string format: uuid post: operationId: addLiveDashboardTeamNote description: "Adds a referee note to this boat ('touched a buoy'). Notes are communication between referees, not scoring; they are append-only - a correction is delete plus re-add, so no locking is needed and two concurrent authors simply produce two entries. Same privilege as the other referee actions (finish/start/activation)." requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/MatchTeamNoteRequest' responses: 201: $ref: '#/components/responses/201' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/liveDashboard/match/{matchId}/team/{teamId}/note/{noteId}: parameters: - $ref: '#/components/parameters/eventId' - name: matchId in: path required: true schema: type: string format: uuid - name: teamId in: path required: true schema: type: string format: uuid - name: noteId in: path required: true schema: type: string format: uuid delete: operationId: deleteLiveDashboardTeamNote description: "Deletes a referee note. Allowed for everyone with the referee write privilege, not only the author - the notes are a tool for internal exchange, and a wrong note must be removable while its author is out on the water." responses: 204: description: Note deleted 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/checkSeverity: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getCheckSeverityConfig description: "The competitions, the configurable checks with their defaults and the deviations set for this event - administration for the referee dashboard's severity configuration." responses: 200: description: Check severity configuration retrieved successfully content: application/json: schema: $ref: '#/components/schemas/CheckSeverityConfigDto' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' put: operationId: updateCheckSeverityConfig description: "Replaces the event's deviations. Entries matching the built-in default are dropped rather than stored, so a later change to the default keeps applying to existing data." requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateCheckSeverityRequest' responses: 204: description: Check severity configuration updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getEventSchedule description: "The event's timeline: planned slots plus setup rounds that have no slot yet" responses: 200: description: Schedule retrieved successfully content: application/json: schema: $ref: '#/components/schemas/EventScheduleDto' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule/startlists: parameters: - $ref: '#/components/parameters/eventId' - name: fileType in: query required: true schema: $ref: '#/components/schemas/EventStartlistFileType' - name: skipByes in: query required: false description: >- Skip bye matches (default true). Matches flagged as 'bye must race' (competition_match.bye_must_race) are ALWAYS exported, overriding this flag - they are raced and need their wave in the timing tooling. schema: type: boolean - name: onlyMissingInRaceClocker in: query required: false description: >- Delta export (default false): fetch each competition's configured RaceClocker race feed server-side and export only matches whose match team ids do not appear in the feed's 'Extra info'. Competitions without an assigned race are excluded. An unreachable race fails the whole export with a structured error instead of a silent partial export. schema: type: boolean - name: raceclockerRaceId in: query required: false description: >- Restrict the export to competitions whose assigned RaceClocker race (competition.raceclocker_race) is the given one - for importing race by race. Applies to both the full and the delta export; omitted means all competitions. schema: type: string format: uuid - name: matchIds in: query required: false style: form explode: true description: >- Restrict the export to these setup match ids (repeatable parameter) - the deselection made in the export preview. Safety rule: this only ever INTERSECTS the plan - ids the plan does not yield (foreign competitions, other events, matches excluded by the bye or race filter) are silently ignored, so the parameter can only narrow the export, never widen it. Omitted means everything the plan yields. schema: type: array items: type: string format: uuid - name: withBackground in: query required: false description: >- PDF only: print the assigned start list template's design as background (default true). false omits the design for printing on pre-printed 'official paper' - page format and padding of the template still apply. Bundle documents are never touched by this flag, they are always taken over unchanged. schema: type: boolean - name: includeBundleDocuments in: query required: false description: >- PDF only: assemble the event's export bundle (default false) - the bundle documents and the generated start lists in bundle order instead of the start lists alone. Non-PDF documents in the bundle are skipped tolerantly. schema: type: boolean - name: excludedBundleItems in: query required: false style: form explode: true description: >- Deselected bundle entries (event_export_bundle_item ids, repeatable parameter) - also the generated-startlists placeholder can be deselected. Foreign ids match nothing and are ignored. Only meaningful with includeBundleDocuments=true. schema: type: array items: type: string format: uuid get: operationId: downloadEventStartlists description: >- Bulk start list export for the whole event: the first created round of every competition (or, in delta mode, every created match missing in RaceClocker), as a ZIP with one CSV per competition (file names like the round export), as one big CSV sorted by start time across all competitions, or as one PDF concatenating the per-match start list PDFs in the same order. responses: 200: description: The start list file (ZIP, CSV or PDF, depending on fileType) content: application/octet-stream: schema: type: string format: binary 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule/startlists/preview: parameters: - $ref: '#/components/parameters/eventId' - name: skipByes in: query required: false description: Same semantics as on the export itself. schema: type: boolean - name: onlyMissingInRaceClocker in: query required: false description: Same semantics as on the export itself. schema: type: boolean - name: raceclockerRaceId in: query required: false description: Same semantics as on the export itself. schema: type: string format: uuid get: operationId: previewEventStartlists description: >- Preview of the bulk start list export: exactly the matches the export with the same parameters would export (same plan logic, no second truth), as JSON instead of a file. Matches with startTime null would block the export (STARTLIST_MATCHES_WITHOUT_START_TIME) - deselect them via the export's matchIds parameter. RaceClocker feeds are fetched (also without delta mode) whenever the plan contains competitions with an assigned race, so missingInRaceClocker carries information; an unreachable race fails the preview like it fails the export. responses: 200: description: The matches the export would contain, sorted by start time (nulls last) content: application/json: schema: type: array items: $ref: '#/components/schemas/EventStartlistPreviewMatchDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule/slot: parameters: - $ref: '#/components/parameters/eventId' post: operationId: createScheduleSlot description: "Creates either a free slot (name set) or a slot linked to a setup round (competitionSetupMatch set) - exactly one of the two" requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpsertScheduleSlotRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule/slot/{slotId}: parameters: - $ref: '#/components/parameters/eventId' - name: slotId in: path required: true schema: type: string format: uuid put: operationId: updateScheduleSlot requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpsertScheduleSlotRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteScheduleSlot description: "The match keeps its last start time (no rollback onto the setup round)" responses: 204: $ref: '#/components/responses/204' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule/slot/{slotId}/skip: parameters: - $ref: '#/components/parameters/eventId' - name: slotId in: path required: true schema: type: string format: uuid put: operationId: skipScheduleSlot responses: 204: $ref: '#/components/responses/204' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule/slot/{slotId}/advance: parameters: - $ref: '#/components/parameters/eventId' - name: slotId in: path required: true schema: type: string format: uuid post: operationId: advanceAfterSkippedSlot description: >- Moves the schedule up into the time freed by a cancelled slot, up to and including targetSlotId. The delta comes from the cancelled slot itself (its planned duration, else the gap to the following slot on the same race day); the slot must be cancelled. dryRun=true only computes the preview. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AdvanceScheduleRequest' responses: 200: description: Advance computed (and applied unless dryRun) content: application/json: schema: $ref: '#/components/schemas/ShiftPreviewDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule/slot/{slotId}/unskip: parameters: - $ref: '#/components/parameters/eventId' - name: slotId in: path required: true schema: type: string format: uuid put: operationId: unskipScheduleSlot responses: 204: $ref: '#/components/responses/204' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule/slot/{slotId}/finish: parameters: - $ref: '#/components/parameters/eventId' - name: slotId in: path required: true schema: type: string format: uuid put: operationId: finishScheduleSlot description: "Finishes the match of a LINKED slot from the regatta office side. Works in every chainProgressionMode (the office can always intervene) - unlike finishLiveDashboardMatch, which is gated in REGATTABUERO mode." parameters: - name: openResults in: query required: false description: "Marks every team without a result as failed with this reason. Deregistered teams are left alone." schema: type: string enum: [DNS, DNF, DSQ] responses: 204: $ref: '#/components/responses/204' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule/slot/{slotId}/activate: parameters: - $ref: '#/components/parameters/eventId' - name: slotId in: path required: true schema: type: string format: uuid put: operationId: activateScheduleSlot description: "Marks the match of a LINKED slot as currently running from the regatta office side. Works in every chainProgressionMode." responses: 204: $ref: '#/components/responses/204' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule/round/{setupRoundId}/skip: parameters: - $ref: '#/components/parameters/eventId' - name: setupRoundId in: path required: true schema: type: string format: uuid put: operationId: skipScheduleRound description: "Skips every schedule slot of this setup round belonging to the event - same rules as skipping a single slot (already skipped slots are left as they are, a started match blocks the whole action). Only allowed when the round has nothing left to race: 409 if the round has no materialized matches yet (cancel its slots individually instead), and 409 if any match of the round still has 2 or more racing (non-deregistered, non-out) teams - those must be executed so the next round can be seeded." responses: 204: $ref: '#/components/responses/204' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule/shift: parameters: - $ref: '#/components/parameters/eventId' post: operationId: shiftEventSchedule description: "Shifts the timeline of the same race day, starting at fromSlotId. dryRun=true only computes the preview." requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ShiftScheduleRequest' responses: 200: description: Shift computed (and applied unless dryRun) content: application/json: schema: $ref: '#/components/schemas/ShiftPreviewDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule/import: parameters: - $ref: '#/components/parameters/eventId' post: operationId: importEventSchedule description: >- Imports a flat xlsx schedule export, matching rows to setup rounds by name. dryRun=true (the default if the field is missing or unparsable) only returns the match preview per row; dryRun=false replaces the event's whole timeline with the import on success. requestBody: required: true content: multipart/form-data: schema: type: object required: - file properties: file: type: string format: binary description: "Flat xlsx schedule export" dryRun: type: boolean description: "Defaults to true (preview only) if missing or unparsable" responses: 200: description: Import preview or result content: application/json: schema: $ref: '#/components/schemas/ScheduleImportResultDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/schedule/import/template: parameters: - $ref: '#/components/parameters/eventId' get: operationId: downloadEventScheduleImportTemplate description: >- Downloads an example xlsx for the schedule import, using the columns importEventSchedule reads. The example rows are dated to the event's first day. responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/boards: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getBoards responses: 200: description: Boards retrieved successfully content: application/json: schema: type: array items: $ref: '#/components/schemas/BoardDto' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' post: operationId: createBoard requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BoardRequest' responses: 200: description: Board created successfully content: application/json: schema: $ref: '#/components/schemas/BoardDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/boards/{boardId}: parameters: - $ref: '#/components/parameters/eventId' - name: boardId in: path required: true schema: type: string format: uuid put: operationId: updateBoard requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BoardRequest' responses: 204: description: Board updated successfully 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteBoard responses: 204: description: Board deleted successfully 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /ratingCategory: post: operationId: addRatingCategory requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RatingCategoryRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' operationId: getRatingCategories responses: 200: description: rating category page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/RatingCategoryDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /ratingCategory/{ratingCategoryId}: parameters: - in: path name: ratingCategoryId required: true schema: type: string format: uuid put: operationId: updateRatingCategory requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RatingCategoryRequest' responses: 204: description: rating category updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' delete: operationId: deleteRatingCategory responses: 204: description: Rating category successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /matchResultImportConfig: post: operationId: addMatchResultImportConfig requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/MatchResultImportConfigRequest' responses: 201: $ref: '#/components/responses/201' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' get: parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' operationId: getMatchResultImportConfigs responses: 200: description: match result import config page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/MatchResultImportConfigDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /matchResultImportConfig/{matchResultImportConfigId}: parameters: - in: path name: matchResultImportConfigId required: true schema: type: string format: uuid put: operationId: updateMatchResultImportConfig requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/MatchResultImportConfigRequest' responses: 204: description: configuration updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' delete: operationId: deleteMatchResultImportConfig responses: 204: description: Configuration successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/{competitionMatchId}/results-file: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: competitionMatchId in: path required: true schema: type: string format: uuid put: operationId: uploadResultFile requestBody: required: true content: multipart/form-data: schema: type: object required: - files properties: files: type: array items: type: string format: binary responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/{competitionMatchId}/results-file/raceclocker: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: competitionMatchId in: path required: true schema: type: string format: uuid put: operationId: uploadRaceClockerResultFile description: "Offline fallback to the live pull: import a RaceClocker results xlsx (Results sheet) onto a match - team resolved via the R2R id in 'Extra info', place computed from times. Pauses the automatic pull like the plain file upload." requestBody: required: true content: multipart/form-data: schema: type: object required: - files properties: files: type: array items: type: string format: binary responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /app/{qrCodeId}: parameters: - name: qrCodeId in: path required: true schema: type: string get: operationId: checkQrCode description: Public - anonymous callers receive a reduced QrCodePublicResponse without personal data responses: 200: description: OK content: application/json: schema: oneOf: - $ref: '#/components/schemas/QrCodeParticipantResponse' - $ref: '#/components/schemas/QrCodeAppuserResponse' - $ref: '#/components/schemas/QrCodePublicResponse' 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: deleteQrCode responses: 204: description: QR-Code successfully deleted 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /app/appuser: put: operationId: updateQrCodeAppuser requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/QrCodeAppuserUpdate' responses: 204: description: QR-Code successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /app/participant: put: operationId: updateQrCodeParticipant requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/QrCodeParticipantUpdate' responses: 204: description: QR-Code successfully updated 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' # Caterer endpoints /caterer/transactions: post: operationId: createCateringTransaction requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CatererTransactionRequest' responses: 204: description: Catering transaction successfully created 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /app/qr-assignment/participants: parameters: - name: eventId in: query required: true schema: type: string format: uuid - name: clubId in: query required: false schema: type: string format: uuid get: operationId: getQrAssignmentParticipants responses: 200: description: Grouped participants for QR assignment content: application/json: schema: type: array items: $ref: '#/components/schemas/GroupedParticipantQrAssignmentDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /results/event/{eventId}: parameters: - $ref: '#/components/parameters/eventId' get: operationId: downloadEventResults responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /results/event/{eventId}/competition: parameters: - $ref: '#/components/parameters/eventId' get: parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' operationId: getCompetitionsHavingResults responses: 200: description: competition page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/CompetitionChoiceDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /results/event/{eventId}/challenge/clubs: parameters: - $ref: '#/components/parameters/eventId' get: parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' - name: competition in: query required: false schema: type: string format: uuid description: Optional parameter to filter by competition - name: ratingCategory in: query required: false schema: type: string format: uuid description: Optional parameter to filter by rating category operationId: getChallengeClubResults responses: 200: description: Challenge club results page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/ResultChallengeClubDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /results/event/{eventId}/challenge/individual: parameters: - $ref: '#/components/parameters/eventId' get: parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/sort' - $ref: '#/components/parameters/search' - name: competition in: query required: false schema: type: string format: uuid description: Optional parameter to filter by competition - name: ratingCategory in: query required: false schema: type: string format: uuid description: Optional parameter to filter by rating category operationId: getChallengeParticipantResults responses: 200: description: Challenge participant results page successfully retrieved content: application/json: schema: type: object required: - data - pagination properties: data: type: array items: $ref: '#/components/schemas/ResultChallengeParticipantDto' pagination: $ref: '#/components/schemas/Pagination' 400: $ref: '#/components/responses/400' 404: $ref: '#/components/responses/404' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /event/export: get: operationId: getEventsForExport responses: 200: description: Events for export successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/EventForExportDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /webDAV/export: post: operationId: exportDataByWebDAV requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WebDAVExportRequest' responses: 204: description: Data successfully exported 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' 502: $ref: '#/components/responses/502' get: operationId: getWebDAVExportStatus responses: 200: description: WebDAV Status successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/WebDAVExportStatusDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /webDAV/import: post: operationId: importDataFromWebDAV requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WebDAVImportRequest' responses: 204: description: Data successfully exported 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' 502: $ref: '#/components/responses/502' get: operationId: getWebDAVImportStatus responses: 200: description: WebDAV Status successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/WebDAVImportStatusDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /webDAV/import/options: get: operationId: getWebDAVImportOptionFolders responses: 200: description: WebDAV import options successfully retrieved content: application/json: schema: type: array items: type: string 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' 502: $ref: '#/components/responses/502' /webDAV/import/options/{folderName}: parameters: - name: folderName in: path required: true schema: type: string get: operationId: getWebDAVImportOptionTypes responses: 200: description: WebDAV import types successfully retrieved content: application/json: schema: $ref: '#/components/schemas/WebDAVImportOptionsDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/challenge/team-results/{competitionRegistrationId}: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - $ref: '#/components/parameters/competitionRegistrationId' post: operationId: submitChallengeTeamResults requestBody: required: true content: multipart/form-data: schema: type: object required: - request - files properties: request: $ref: '#/components/schemas/CompetitionChallengeResultRequest' files: type: array items: type: string format: binary responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' delete: operationId: deleteChallengeTeamResult responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/challenge/team-results/{competitionRegistrationId}/verify: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - $ref: '#/components/parameters/competitionRegistrationId' put: operationId: verifyChallengeTeamResult responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/challenge/team-results/{competitionRegistrationId}/accessToken/{accessToken}: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - $ref: '#/components/parameters/competitionRegistrationId' - in: path name: accessToken required: true schema: type: string post: operationId: submitChallengeTeamResultsByToken requestBody: required: true content: multipart/form-data: schema: type: object required: - request - files properties: request: $ref: '#/components/schemas/CompetitionChallengeResultRequest' files: type: array items: type: string format: binary responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/result-document/{resultDocumentId}: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - in: path name: resultDocumentId required: true schema: type: string format: uuid get: operationId: downloadMatchTeamResultDocument responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/competitionExecution/result-document/{resultDocumentId}/accessToken/{accessToken}: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - in: path name: resultDocumentId required: true schema: type: string format: uuid - in: path name: accessToken required: true schema: type: string get: operationId: downloadMatchTeamResultDocumentByToken responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/registration: parameters: - $ref: '#/components/parameters/eventId' - in: query name: birthYear required: true schema: type: integer - in: query name: gender required: true schema: $ref: '#/components/schemas/Gender' get: operationId: getCompetitionsForRegistration responses: 200: description: Public list of filtered competitions content: application/json: schema: $ref: '#/components/schemas/CompetitionsForRegistrationDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /email/smtp-override: get: operationId: getSmtpConfig summary: Get SMTP configuration responses: 200: description: SMTP override configuration content: application/json: schema: $ref: '#/components/schemas/SmtpConfigOverrideDto' 401: description: Unauthorized $ref: '#/components/responses/401' 403: description: Forbidden $ref: '#/components/responses/403' 500: description: Internal server error $ref: '#/components/responses/500' put: operationId: setSmtpOverride summary: Set SMTP override configuration requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SmtpConfigOverrideDto' responses: 204: description: SMTP override updated 400: description: Bad request $ref: '#/components/responses/400' 401: description: Unauthorized $ref: '#/components/responses/401' 403: description: Forbidden $ref: '#/components/responses/403' 422: description: Validation error $ref: '#/components/responses/422' 500: description: Internal server error $ref: '#/components/responses/500' delete: operationId: deleteSmtpOverride responses: 204: description: EmailTemplate override deleted 401: description: Unauthorized $ref: '#/components/responses/401' 403: description: Forbidden $ref: '#/components/responses/403' 500: description: Internal server error $ref: '#/components/responses/500' /email/templates: get: parameters: - in: query name: language required: true schema: $ref: '#/components/schemas/EmailLanguage' operationId: getEmailTemplates responses: 200: description: EmailTemplate configuration content: application/json: schema: type: array items: $ref: '#/components/schemas/EmailTemplateDto' 401: description: Unauthorized $ref: '#/components/responses/401' 403: description: Forbidden $ref: '#/components/responses/403' 500: description: Internal server error $ref: '#/components/responses/500' put: parameters: - in: query name: key required: true schema: $ref: '#/components/schemas/EmailTemplateKey' - in: query name: language required: true schema: $ref: '#/components/schemas/EmailLanguage' operationId: setEmailTemplate requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EmailTemplateRequest' responses: 204: description: EmailTemplate override updated 400: description: Bad request $ref: '#/components/responses/400' 401: description: Unauthorized $ref: '#/components/responses/401' 403: description: Forbidden $ref: '#/components/responses/403' 422: description: Validation error $ref: '#/components/responses/422' 500: description: Internal server error $ref: '#/components/responses/500' delete: parameters: - in: query name: key required: true schema: $ref: '#/components/schemas/EmailTemplateKey' - in: query name: language required: true schema: $ref: '#/components/schemas/EmailLanguage' operationId: deleteEmailTemplate summary: Delete SMTP override configuration responses: 204: description: SMTP override deleted 401: description: Unauthorized $ref: '#/components/responses/401' 403: description: Forbidden $ref: '#/components/responses/403' 500: description: Internal server error $ref: '#/components/responses/500' /event/{eventId}/participant/{participantId}/resendAccessToken: parameters: - $ref: '#/components/parameters/eventId' - in: path name: participantId required: true schema: type: string put: operationId: resendAccessToken requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ResendAccessTokenRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' /globalConfigurations: put: operationId: updateGlobalConfigurations requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateGlobalConfigurationsRequest' responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /globalConfigurations/createClubOnRegistration: get: operationId: getCreateClubOnRegistrationAllowed responses: 200: description: Global configurations content: application/json: schema: type: boolean 500: $ref: '#/components/responses/500' /globalConfigurations/theme: put: operationId: updateThemeConfig requestBody: required: true content: multipart/form-data: schema: type: object required: - request properties: request: $ref: '#/components/schemas/UpdateThemeRequest' fontFile: type: string format: binary description: Optional font file (.woff or .woff2, max 5MB) logoFile: type: string format: binary description: Optional logo file (.pgn, .jpg, jpeg, .svg or .webp, max 2MB) responses: 200: description: Theme configuration updated successfully content: application/json: schema: $ref: '#/components/schemas/ThemeConfigDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 422: $ref: '#/components/responses/422' 500: $ref: '#/components/responses/500' delete: operationId: resetThemeConfig responses: 200: description: Theme configuration reset to defaults content: application/json: schema: $ref: '#/components/schemas/ThemeConfigDto' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 500: $ref: '#/components/responses/500' /event/{eventId}/certificatesOfParticipation/sendToParticipants: parameters: - $ref: '#/components/parameters/eventId' post: operationId: sendCertificatesToParticipants responses: 204: $ref: '#/components/responses/204' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/certificatesOfParticipation/{participantId}: parameters: - $ref: '#/components/parameters/eventId' - in: path name: participantId required: true schema: type: string get: operationId: downloadCertificateOfParticipation parameters: - name: format in: query required: false schema: type: string enum: [ pdf, docx ] responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/certificatesOfParticipation: parameters: - $ref: '#/components/parameters/eventId' get: operationId: downloadCertificatesOfParticipation parameters: - name: format in: query required: false schema: type: string enum: [ pdf, docx ] responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/awardCertificates: parameters: - $ref: '#/components/parameters/eventId' get: operationId: downloadAwardCertificatesForEvent parameters: - name: format in: query required: false schema: type: string enum: [ pdf, docx ] - name: maxPlace in: query required: false schema: type: integer - name: mode in: query required: false schema: type: string enum: [ PER_ATHLETE, PER_TEAM ] - name: background in: query required: false schema: type: boolean - name: ratingCategory in: query required: false description: >- Print the rating category on the certificate. Off by default; the template needs a RATING_CATEGORY placeholder for it to show. The printed place stays the competition-wide one either way. schema: type: boolean responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/awardCeremony: parameters: - $ref: '#/components/parameters/eventId' get: operationId: getAwardCeremonies description: >- Alle Ehrungen der Veranstaltung, je Wettkampf und Wertung eine. Wird bei jedem Aufruf aus der Platzberechnung abgeleitet und nicht gespeichert - bis zur Ehrung ändern sich Ergebnisse noch. parameters: - in: query name: competitionId description: >- Nur die Ehrungen dieses Wettkampfs. Jede Ehrung kostet eine Platzberechnung, deshalb ist die Einschränkung mehr als ein Anzeigefilter. required: false schema: type: string format: uuid responses: 200: description: Award ceremonies successfully retrieved content: application/json: schema: type: array items: $ref: '#/components/schemas/AwardCeremonyChoiceDto' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/awardCeremony/pdf: parameters: - $ref: '#/components/parameters/eventId' post: operationId: downloadAwardCeremonySheets description: >- Die ausgewählten Ehrungen als ein druckfertiges PDF, je Ehrung ein A4-Blatt. POST, obwohl es ein Download ist: die Auswahl umfasst bei einer Regatta leicht hundert Schlüssel und passt nicht mehr sinnvoll in einen Query-String. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AwardCeremonySelectionRequest' responses: 200: description: Award ceremony sheets successfully rendered headers: Content-Disposition: schema: type: string content: application/pdf: schema: type: string format: binary 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/resultList/pdf: parameters: - $ref: '#/components/parameters/eventId' get: operationId: downloadResultList description: >- Die Ergebnisliste als druckfertiges PDF, in der Regel zum Aushängen - dieselbe Datenbasis und dieselbe Ergebnisregel wie der Siegerehrungsbogen (nur bestätigte Platzierungen), aber mit wählbaren Bestandteilen. Jedes Blatt trägt eine Fußzeile mit Veranstaltung und Stand-Zeitstempel, damit veraltete Aushänge erkennbar sind. Fehlende Parameter fallen auf die Aushang-Vorgaben zurück. parameters: - in: query name: competitionId description: >- Nur dieser Wettkampf. Jeder Abschnitt kostet eine Platzberechnung, deshalb ist die Einschränkung mehr als ein Anzeigefilter. required: false schema: type: string format: uuid - in: query name: crew description: Mit Crew-Aufstellung (Namen je Boot). Vorgabe true. required: false schema: type: boolean - in: query name: times description: Mit Zeiten und Zeitstrafen. Vorgabe true. required: false schema: type: boolean - in: query name: podiumOnly description: Nur die Plätze 1 bis 3 statt aller platzierten Boote. Vorgabe false. required: false schema: type: boolean - in: query name: byRatingCategory description: Je Wertungskategorie ein eigener Abschnitt statt des Gesamtfelds. Vorgabe true. required: false schema: type: boolean - in: query name: size description: Schriftgrad - POSTING (Aushang, groß) oder CEREMONY (wie der Bogen). Vorgabe POSTING. required: false schema: type: string enum: [ POSTING, CEREMONY ] responses: 200: description: Result list successfully rendered headers: Content-Disposition: schema: type: string content: application/pdf: schema: type: string format: binary 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/awardCertificates: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' get: operationId: downloadAwardCertificatesForCompetition parameters: - name: format in: query required: false schema: type: string enum: [ pdf, docx ] - name: maxPlace in: query required: false schema: type: integer - name: mode in: query required: false schema: type: string enum: [ PER_ATHLETE, PER_TEAM ] - name: background in: query required: false schema: type: boolean - name: ratingCategory in: query required: false description: >- Print the rating category on the certificate. Off by default; the template needs a RATING_CATEGORY placeholder for it to show. The printed place stays the competition-wide one either way. schema: type: boolean responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' /event/{eventId}/competition/{competitionId}/awardCertificates/{registrationId}: parameters: - $ref: '#/components/parameters/eventId' - $ref: '#/components/parameters/competitionId' - name: registrationId in: path required: true schema: type: string format: uuid get: operationId: downloadAwardCertificate parameters: - name: format in: query required: false schema: type: string enum: [ pdf, docx ] - name: maxPlace in: query required: false schema: type: integer - name: mode in: query required: false schema: type: string enum: [ PER_ATHLETE, PER_TEAM ] - name: background in: query required: false schema: type: boolean - name: ratingCategory in: query required: false description: >- Print the rating category on the certificate. Off by default; the template needs a RATING_CATEGORY placeholder for it to show. The printed place stays the competition-wide one either way. schema: type: boolean responses: 200: $ref: '#/components/responses/file' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/401' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 500: $ref: '#/components/responses/500' components: parameters: # query limit: name: limit in: query description: Page size for pagination required: false schema: type: integer offset: name: offset in: query description: Result offset for pagination required: false schema: type: integer sort: name: sort in: query description: "Fields with direction (as JSON [{field: , direction: ASC | DESC}, ...]) sorting result for pagination" required: false schema: type: string search: name: search in: query description: Filter result with space-separated search terms for pagination required: false schema: type: string challenge: name: challenge in: query description: Captcha challenge id required: true schema: type: string format: uuid input: name: input in: query description: Captcha solution required: true schema: type: integer # path params eventId: name: eventId in: path required: true schema: type: string format: uuid eventDayId: name: eventDayId in: path required: true schema: type: string format: uuid competitionId: name: competitionId in: path required: true schema: type: string format: uuid competitionRegistrationId: name: competitionRegistrationId in: path required: true schema: type: string format: uuid responses: file: description: File retrieved headers: Content-Disposition: schema: type: string content: '*/*': schema: type: string format: binary 201: description: Entity successfully created, returns the id content: application/json: schema: type: string format: uuid 204: description: No Content 400: description: Bad Request content: application/json: schema: $ref: '#/components/schemas/BadRequestError' 401: description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ApiError' 403: description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ApiError' 404: description: Not Found content: application/json: schema: $ref: '#/components/schemas/ApiError' 409: description: Conflict content: application/json: schema: $ref: '#/components/schemas/ApiError' 422: description: Unprocessable content: application/json: schema: $ref: '#/components/schemas/UnprocessableEntityError' 429: description: Too many requests content: application/json: schema: $ref: '#/components/schemas/TooManyRequestsError' 500: description: Server Error content: application/json: schema: $ref: '#/components/schemas/ApiError' 502: description: Bad Gateway content: application/json: schema: $ref: '#/components/schemas/ApiError' 409EmailInUse: description: Conflict content: application/json: schema: $ref: '#/components/schemas/UnprocessableEntityError' schemas: # enums Action: type: string enum: - CREATE - READ - UPDATE - DELETE Resource: type: string enum: - USER - EVENT - CLUB - REGISTRATION - INVOICE - SUBSTITUTION - APP_EVENT_REQUIREMENT - APP_QR_MANAGEMENT - APP_COMPETITION_CHECK - APP_CATERER - ADMINISTRATION - WEB_DAV - RESULT - LIVE_DASHBOARD - BOARD Scope: type: string enum: - OWN - GLOBAL EmailLanguage: type: string enum: - DE - EN - DA ErrorCode: type: string enum: - INTERNAL_ERROR - CAPTCHA_WRONG - EMAIL_IN_USE - CANNOT_ASSIGN_ROLES - EVENT_REGISTRATION_ONGOING - EVENT_REGISTRATION_CLOSED - EVENT_REGISTRATION_UPSERT_PARTICIPANT_NOT_FOUND - EVENT_REGISTRATION_TEAM_PARTICIPANT_NOT_FOUND - EVENT_REGISTRATION_COMPETITION_NOT_FOUND - EVENT_REGISTRATION_NAMED_PARTICIPANT_NOT_FOUND - EVENT_REGISTRATION_FEE_NOT_FOUND - EVENT_REGISTRATION_RATING_CATEGORY_NOT_FOUND - EVENT_REGISTRATION_RATING_CATEGORY_MISSING - EVENT_REGISTRATION_AGE_REQUIREMENT_NOT_MET - EVENT_REGISTRATION_PARTICIPANT_DUPLICATE_IN_COMPETITION - INVOICES_ALREADY_PRODUCED - NO_ASSIGNED_PAYEE_INFORMATION - NO_ASSIGNED_CONTACT_INFORMATION - FILE_ERROR - SPREADSHEET_NO_HEADERS - SPREADSHEET_MALFORMED - SPREADSHEET_COLUMN_UNKNOWN - SPREADSHEET_CELL_BLANK - SPREADSHEET_WRONG_CELL_TYPE - SPREADSHEET_UNPARSABLE_STRING - WRONG_TEAM_COUNT - DUPLICATE_START_NUMBERS - DUPLICATE_TEAMS - DUPLICATE_PLACES - PLACES_UNCONTINUOUS - LIST_DATA_INCOMPLETE - RESULT_NOT_FAILED_AND_NO_DATA - PARTICIPANT_IMPORT_UNKNOWN_GENDER_VALUE - CLUB_NAME_ALREADY_EXISTS - RACECLOCKER_URL_MISSING - RACECLOCKER_URL_INVALID - RACECLOCKER_UNREACHABLE - RACECLOCKER_MALFORMED_FEED - RACECLOCKER_MATCH_NOT_IN_FEED - RACECLOCKER_DUPLICATE_TEAMS - RACECLOCKER_NO_RESULTS - RACECLOCKER_MATCH_IS_BYE - RACECLOCKER_RACE_NAME_TAKEN - RACECLOCKER_RACE_URL_TAKEN - RACECLOCKER_RACE_STILL_ASSIGNED - STARTLIST_CONFIG_NOT_CONFIGURED - STARTLIST_MATCHES_WITHOUT_START_TIME - RESULT_IMPORT_CONFIG_NOT_CONFIGURED - SCHEDULE_SHIFT_WITHOUT_CHANGE - SCHEDULE_SHIFT_TARGET_INVALID - SCHEDULE_SHIFT_LEAVES_RACE_DAY - SCHEDULE_SHIFT_OVERTAKES_PREDECESSOR - SCHEDULE_SHIFT_OVERTAKES_FOLLOWER - SCHEDULE_ADVANCE_NO_DELTA - SCHEDULE_SLOT_NOT_SKIPPED - SCHEDULE_IMPORT_DUPLICATE_ROWS - SCHEDULE_COMPRESSION_IMPOSSIBLE - SCHEDULE_SETUP_MATCH_ALREADY_PLANNED - SCHEDULE_SLOT_MATCH_ALREADY_STARTED - SCHEDULE_SLOT_MATCH_ALREADY_FINISHED - SCHEDULE_SLOT_NOT_SKIPPABLE - SCHEDULE_SLOT_NOT_LINKED - SCHEDULE_ROUND_NOT_MATERIALIZED - SCHEDULE_ROUND_HAS_RUNS_TO_RACE - CERTIFICATE_NO_RESULTS - CERTIFICATE_MISSING_TEMPLATE - CERTIFICATE_UNREADABLE_TEMPLATE - CERTIFICATE_NOT_A_CHALLENGE_EVENT - CERTIFICATE_CHALLENGE_STILL_IN_PROGRESS - AWARD_CERTIFICATE_NO_RESULTS - AWARD_CERTIFICATE_MISSING_TEMPLATE - AWARD_CERTIFICATE_UNREADABLE_TEMPLATE - AWARD_CERTIFICATE_COMPETITION_NOT_IN_EVENT - AWARD_CERTIFICATE_IS_CHALLENGE_EVENT - AWARD_CEREMONY_NO_RESULTS - AWARD_CEREMONY_COMPETITION_NOT_IN_EVENT - AWARD_CEREMONY_UNKNOWN_RATING_CATEGORY - AWARD_CEREMONY_IS_CHALLENGE_EVENT - DOCUMENT_TEMPLATE_INVALID_FONT - DOCUMENT_TEMPLATE_INVALID_PDF - DOCUMENT_TEMPLATE_TYPE_MISMATCH - DOCUMENT_TEMPLATE_PLACEHOLDER_PAGE_NOT_SUPPORTED - DOCUMENT_TEMPLATE_PLACEHOLDER_TYPE_NOT_SUPPORTED - DOCUMENT_TEMPLATE_INVALID_PACKAGE - DOCUMENT_TEMPLATE_UNSUPPORTED_PACKAGE_VERSION - SUBSTITUTION_NOT_FOUND - SUBSTITUTION_PARTICIPANT_OUT_NOT_FOUND - SUBSTITUTION_PARTICIPANT_IN_NOT_FOUND - SUBSTITUTION_PARTICIPANT_OUT_NOT_AVAILABLE - SUBSTITUTION_PARTICIPANT_IN_NOT_AVAILABLE - SUBSTITUTION_DEPENDENT_FOUND - SUBSTITUTION_CREATED_IN_PREVIOUS_ROUND - CHALLENGE_NOT_A_CHALLENGE_EVENT - CHALLENGE_ALREADY_STARTED - CHALLENGE_NOT_STARTED_YET - CHALLENGE_CORRUPTED_SETUP - CHALLENGE_RESULT_ALREADY_SUBMITTED - CHALLENGE_NO_RESULT_SUBMITTED - CHALLENGE_SELF_SUBMISSION_NOT_ALLOWED - EXECUTION_TEAMS_NOT_MATCHING - EXECUTION_MATCH_RESULTS_LOCKED - EXECUTION_MATCH_IS_BYE - EXECUTION_PLACES_NOT_CONTINUOUS - EXECUTION_START_TIME_MANAGED_BY_SCHEDULE - EXECUTION_RESET_BLOCKED_BY_NEXT_ROUND - LIVE_DASHBOARD_FINISH_RESERVED_FOR_OFFICE - QR_CODE_ALREADY_IN_USE - TRACKING_TEAM_ALREADY_CHECKED_IN - TRACKING_TEAM_NOT_CHECKED_IN - TRACKING_QR_CODE_NOT_FOUND - TRACKING_QR_CODE_NOT_ASSOCIATED_WITH_PARTICIPANT - TRACKING_ENTRY_NOT_FOUND - TRACKING_SEQUENCE_CONFLICT - TRACKING_TIMESTAMP_COLLISION - DEREGISTRATION_ALREADY_EXISTS - DEREGISTRATION_IS_LOCKED - DEREGISTRATION_RESULTS_ALREADY_EXIST - DEREGISTRATION_NOT_IN_CURRENT_ROUND - DEREGISTRATION_REGISTRATION_STILL_OPEN - EXPORT_BUNDLE_DUPLICATE_DOCUMENT - EXPORT_BUNDLE_PLACEHOLDER_NOT_REMOVABLE - EXPORT_BUNDLE_ORDER_MISMATCH Gender: type: string enum: - M - F - D RegistrationInvoiceType: type: string enum: - 'REGULAR' - 'LATE' OpenForRegistrationType: type: string enum: - 'REGULAR' - 'LATE' - 'CLOSED' WebDAVExportType: type: string enum: - 'INVOICES' - 'REGISTRATION_RESULTS' - 'DOCUMENTS' - 'RESULTS' - 'START_LISTS' - 'DB_USERS' - 'DB_PARTICIPANTS' - 'DB_BANK_ACCOUNTS' - 'DB_CONTACT_INFORMATION' - 'DB_EMAIL_INDIVIDUAL_TEMPLATES' - 'DB_EVENT_DOCUMENT_TYPES' - 'DB_MATCH_RESULT_IMPORT_CONFIGS' - 'DB_STARTLIST_EXPORT_CONFIGS' - 'DB_WORK_TYPES' - 'DB_PARTICIPANT_REQUIREMENTS' - 'DB_RATING_CATEGORIES' - 'DB_COMPETITION_CATEGORIES' - 'DB_FEES' - 'DB_NAMED_PARTICIPANTS' - 'DB_COMPETITION_SETUP_TEMPLATES' - 'DB_COMPETITION_TEMPLATES' - 'DB_EVENT' - 'DB_COMPETITION' MatchResultType: type: string enum: - 'DISTANCE' GapDocumentType: type: string enum: - 'CERTIFICATE_OF_PARTICIPATION' - 'AWARD_CERTIFICATE' GapDocumentPlaceholderType: type: string enum: - 'FIRST_NAME' - 'LAST_NAME' - 'FULL_NAME' - 'RESULT' - 'EVENT_NAME' - 'PLACE' - 'COMPETITION_NAME' - 'COMPETITION_SHORT_NAME' - 'CLUB_NAME' - 'TEAM_NAME' - 'RATING_CATEGORY' - 'EVENT_DATE' - 'EVENT_LOCATION' - 'FREE_TEXT' TextAlign: type: string enum: - 'LEFT' - 'CENTER' - 'RIGHT' # error ApiError: type: object required: - status - message properties: status: type: object required: - value - description properties: value: type: number description: type: string message: type: string errorCode: $ref: '#/components/schemas/ErrorCode' BadRequestError: allOf: - $ref: '#/components/schemas/ApiError' - type: object properties: details: type: object properties: validExample: { } UnprocessableEntityError: allOf: - $ref: '#/components/schemas/ApiError' - type: object required: - details properties: details: oneOf: - type: object required: - reason properties: reason: $ref: '#/components/schemas/Invalid' - type: object required: - result properties: result: $ref: '#/components/schemas/Invalid' - type: object required: - maxReductionMinutes properties: maxReductionMinutes: type: integer format: int64 - { } TooManyRequestsError: allOf: - $ref: '#/components/schemas/ApiError' - type: object required: - details properties: details: type: object required: - retryAfter properties: retryAfter: type: integer Invalid: oneOf: - type: string - type: object required: - field - error properties: field: type: string error: $ref: '#/components/schemas/Invalid' - type: object required: - errorPositions properties: errorPositions: { } - $ref: '#/components/schemas/Duplicate' - type: object required: - duplicates properties: duplicates: type: array items: $ref: '#/components/schemas/Duplicate' - type: object required: - value - pattern properties: value: type: string pattern: type: string - type: object required: - allOf properties: allOf: type: array items: $ref: '#/components/schemas/Invalid' - type: object required: - anyOf properties: anyOf: type: array items: $ref: '#/components/schemas/Invalid' - type: object required: - oneOf properties: oneOf: type: array items: oneOf: - $ref: '#/components/schemas/Invalid' - type: object Duplicate: type: object required: - value - count properties: value: { } count: type: integer # authentication / authorization LoginRequest: type: object required: - email - password properties: email: type: string password: type: string Privilege: type: object required: - action - resource - scope properties: action: $ref: '#/components/schemas/Action' resource: $ref: '#/components/schemas/Resource' scope: $ref: '#/components/schemas/Scope' PrivilegeDto: type: object required: - id - action - resource - scope properties: id: type: string format: uuid action: $ref: '#/components/schemas/Action' resource: $ref: '#/components/schemas/Resource' scope: $ref: '#/components/schemas/Scope' LoginDto: type: object required: - id - privileges properties: id: type: string format: uuid privileges: type: array items: $ref: '#/components/schemas/PrivilegeDto' clubId: type: string format: uuid # pagination Pagination: type: object required: - total - limit - offset - sort - search properties: total: type: integer limit: type: integer offset: type: integer sort: type: array items: $ref: '#/components/schemas/Order' search: type: string Order: type: object required: - field - direction properties: field: type: string direction: type: string enum: - ASC - DESC # email AssignedEmailDto: type: object required: - recipient properties: recipient: type: string sentAt: type: string format: date-time lastErrorAt: type: string format: date-time lastError: type: string # user AppUserNameDto: type: object required: - id - firstname - lastname properties: id: type: string format: uuid firstname: type: string lastname: type: string AppUserDto: type: object required: - id - email - firstname - lastname - roles properties: id: type: string format: uuid email: type: string firstname: type: string lastname: type: string roles: type: array items: $ref: '#/components/schemas/RoleDto' qrCodeId: type: string UpdateAppUserRequest: type: object required: - firstname - lastname - roles properties: firstname: type: string lastname: type: string roles: type: array items: type: string format: uuid AppUserWithQrCodeDto: type: object required: - id - firstname - lastname - email - roles - qrCodeId - eventId - createdAt properties: id: type: string format: uuid firstname: type: string lastname: type: string email: type: string club: type: string format: uuid roles: type: array items: $ref: '#/components/schemas/RoleDto' qrCodeId: type: string eventId: type: string format: uuid createdAt: type: string format: date-time createdBy: type: string format: uuid AppUserRegistrationDto: type: object required: - id - email - firstname - lastname - language - expiresAt - createdAt properties: id: type: string format: uuid email: type: string firstname: type: string lastname: type: string language: $ref: '#/components/schemas/EmailLanguage' expiresAt: type: string format: date-time createdAt: type: string format: date-time assignedEmail: $ref: '#/components/schemas/AssignedEmailDto' OwnPendingClubRepresentativeApprovalDto: type: object required: - clubId - clubName - createdAt properties: clubId: type: string format: uuid clubName: type: string createdAt: type: string format: date-time PendingClubRepresentativeApprovalDto: type: object required: - userId - firstName - lastName - email - createdAt properties: userId: type: string format: uuid firstName: type: string lastName: type: string email: type: string createdAt: type: string format: date-time AppUserRegisterRequest: type: object required: - email - password - firstname - lastname - language - callbackUrl - registerToSingleCompetitions properties: email: type: string password: type: string firstname: type: string lastname: type: string clubId: type: string format: uuid clubname: type: string language: $ref: '#/components/schemas/EmailLanguage' callbackUrl: type: string format: url registerToSingleCompetitions: type: array items: $ref: '#/components/schemas/ParticipantRegisterCompetitionRequest' birthYear: type: integer gender: $ref: '#/components/schemas/Gender' VerifyRegistrationRequest: type: object required: - token - callbackUrl properties: token: type: string callbackUrl: type: string AppUserInvitationDto: type: object required: - id - email - firstname - lastname - language - expiresAt - createdAt - roles properties: id: type: string format: uuid email: type: string firstname: type: string lastname: type: string language: $ref: '#/components/schemas/EmailLanguage' expiresAt: type: string format: date-time createdAt: type: string format: date-time assignedEmail: $ref: '#/components/schemas/AssignedEmailDto' roles: type: array items: $ref: '#/components/schemas/RoleDto' createdBy: $ref: '#/components/schemas/AppUserNameDto' InviteRequest: type: object required: - email - firstname - lastname - language - roles - callbackUrl properties: email: type: string firstname: type: string lastname: type: string language: $ref: '#/components/schemas/EmailLanguage' roles: type: array items: type: string format: uuid admin: type: boolean callbackUrl: type: string format: url ResendInvitationRequest: type: object required: - callbackUrl properties: callbackUrl: type: string format: url AcceptInvitationRequest: type: object required: - token - password properties: token: type: string password: type: string PasswordResetInitRequest: type: object required: - email - language - callbackUrl properties: email: type: string language: $ref: '#/components/schemas/EmailLanguage' callbackUrl: type: string format: url PasswordResetRequest: type: object required: - password properties: password: type: string # role RoleDto: type: object required: - id - name - privileges properties: id: type: string format: uuid name: type: string description: type: string privileges: type: array items: $ref: '#/components/schemas/PrivilegeDto' RoleRequest: type: object required: - name - privileges properties: name: type: string description: type: string privileges: type: array items: type: string format: uuid # event ChainProgressionMode: type: string description: >- Three modes for the finish/activate chain: SCHIEDSRICHTER keeps finish+chain on the referee dashboard (as before); REGATTABUERO moves both exclusively to the schedule tab (the finish button disappears from the referee dashboard); DEAKTIVIERT lets finish affect only the match itself, without activating the next start time's matches. enum: - 'SCHIEDSRICHTER' - 'REGATTABUERO' - 'DEAKTIVIERT' PublicResultsVisibility: type: string description: >- From which state on a match shows up as a result on the public views (athlete board, kiosk, public results page): FINISHED_ONLY only for finished matches (finished_at set), RESULTS_COMPLETE additionally for matches whose boats are all scored (AWAITING_FINISH). Defaults to FINISHED_ONLY, because until a match is finished a time penalty can still arrive and a published result that changes afterwards cannot be taken back. enum: - 'FINISHED_ONLY' - 'RESULTS_COMPLETE' EventDto: type: object required: - id - name - published - registrationsFinalized - challengeEvent - allowSelfSubmission - submissionNeedsVerification - allowParticipantSelfRegistration - executionAutoRefresh - executionAutoRefreshSeconds properties: id: type: string format: uuid name: type: string description: type: string location: type: string registrationAvailableFrom: type: string format: date-time registrationAvailableTo: type: string format: date-time lateRegistrationAvailableTo: type: string format: date-time hasLateRegistrations: type: boolean invoicePrefix: type: string published: type: boolean invoicesProduced: type: string format: date-time lateInvoicesProduced: type: string format: date-time paymentDueBy: type: string format: date latePaymentDueBy: type: string format: date registrationCount: type: number registrationsFinalized: type: boolean mixedTeamTerm: type: string challengeEvent: type: boolean challengeResultType: $ref: '#/components/schemas/MatchResultType' allowSelfSubmission: type: boolean submissionNeedsVerification: type: boolean allowParticipantSelfRegistration: type: boolean chainProgressionMode: $ref: '#/components/schemas/ChainProgressionMode' autoCreateFollowingRounds: type: boolean description: "Creates the pairings of the following round automatically once a round is fully finished" showBreaksOnPublicBoards: type: boolean description: "Shows breaks/schedule placeholders from the timeline on the kiosk and athlete board too" allowCrossClubRegistration: type: boolean description: "Lets registrants search and register participants of other clubs; master data stays with the home club" publicResultsVisibility: $ref: '#/components/schemas/PublicResultsVisibility' executionAutoRefresh: type: boolean description: "Whether the execution page keeps itself up to date in the background" executionAutoRefreshSeconds: type: integer minimum: 5 maximum: 60 description: "Interval of that background sync in seconds; only in effect while executionAutoRefresh is set" challengesFinished: type: boolean notice: $ref: '#/components/schemas/EventNoticeDto' EventNoticeSeverity: type: string enum: [ INFO, WARNING, CRITICAL ] description: "Severity of the event-wide notice banner; drives the banner color (CRITICAL=red, WARNING=yellow, INFO=green)" EventNoticeDto: type: object description: "The event-wide notice banner (e.g. a weather warning). Absent/null means: no banner." required: - text - severity properties: text: type: string severity: $ref: '#/components/schemas/EventNoticeSeverity' UpdateEventNoticeRequest: type: object description: "Sets (both fields) or clears (both null) the event-wide notice banner. A blank text or an unknown severity is rejected with 422." properties: text: type: string severity: $ref: '#/components/schemas/EventNoticeSeverity' EventPublicDto: type: object required: - id - name - competitionCount - createdAt - challengeEvent - allowSelfSubmission - submissionNeedsVerification - allowParticipantSelfRegistration properties: id: type: string format: uuid name: type: string description: type: string location: type: string registrationAvailableFrom: type: string format: date-time registrationAvailableTo: type: string format: date-time lateRegistrationAvailableTo: type: string format: date-time createdAt: type: string format: date-time competitionCount: type: number eventFrom: type: string format: date eventTo: type: string format: date challengeEvent: type: boolean challengeResultType: $ref: '#/components/schemas/MatchResultType' allowSelfSubmission: type: boolean submissionNeedsVerification: type: boolean allowParticipantSelfRegistration: type: boolean EventRegistrationViewDto: type: object required: - id - createdAt - updatedAt - eventId - eventName - clubId - clubName - competitionRegistrationCount - participantCount - eventDocumentsOfficiallyAccepted - regularFees - lateFees properties: id: type: string format: uuid createdAt: type: string format: date-time message: type: string updatedAt: type: string format: date-time eventId: type: string format: uuid eventName: type: string clubId: type: string format: uuid clubName: type: string competitionRegistrationCount: type: number participantCount: type: number eventDocumentsOfficiallyAccepted: type: boolean regularFees: type: string format: decimal lateFees: type: string format: decimal RegistrationMailRecipientDto: type: object required: - registrationId - clubId - clubName properties: registrationId: type: string format: uuid clubId: type: string format: uuid clubName: type: string # Fehlen name und email, ist der Nutzer geloescht, der die Meldung abgeschickt hat. # Die Zeile bleibt in der Liste, laesst sich aber nicht anwaehlen. name: type: string email: type: string RegistrationMailRequest: type: object required: - subject - body - registrationIds - additionalAddresses properties: # subject und body duerfen ##recipient##, ##club## und ##event## enthalten. subject: type: string body: type: string registrationIds: type: array items: type: string format: uuid additionalAddresses: type: array items: type: string RegistrationMailResultDto: type: object required: - enqueued properties: enqueued: type: number CreateEventRequest: type: object required: - name - published - challengeEvent - allowSelfSubmission - submissionNeedsVerification - allowParticipantSelfRegistration properties: name: type: string description: type: string location: type: string registrationAvailableFrom: type: string format: date-time registrationAvailableTo: type: string format: date-time lateRegistrationAvailableTo: type: string format: date-time invoicePrefix: type: string published: type: boolean paymentDueBy: type: string format: date latePaymentDueBy: type: string format: date mixedTeamTerm: type: string challengeEvent: type: boolean challengeResultType: $ref: '#/components/schemas/MatchResultType' allowSelfSubmission: type: boolean submissionNeedsVerification: type: boolean allowParticipantSelfRegistration: type: boolean showBreaksOnPublicBoards: type: boolean description: "Shows breaks/schedule placeholders from the timeline on the kiosk and athlete board too" allowCrossClubRegistration: type: boolean description: "Lets registrants search and register participants of other clubs; master data stays with the home club" publicResultsVisibility: $ref: '#/components/schemas/PublicResultsVisibility' UpdateEventRequest: type: object required: - name - published - challengeEvent - allowSelfSubmission - submissionNeedsVerification - allowParticipantSelfRegistration - executionAutoRefresh - executionAutoRefreshSeconds properties: name: type: string description: type: string location: type: string registrationAvailableFrom: type: string format: date-time registrationAvailableTo: type: string format: date-time lateRegistrationAvailableTo: type: string format: date-time invoicePrefix: type: string published: type: boolean paymentDueBy: type: string format: date latePaymentDueBy: type: string format: date mixedTeamTerm: type: string challengeResultType: $ref: '#/components/schemas/MatchResultType' allowSelfSubmission: type: boolean submissionNeedsVerification: type: boolean allowParticipantSelfRegistration: type: boolean chainProgressionMode: $ref: '#/components/schemas/ChainProgressionMode' autoCreateFollowingRounds: type: boolean description: "Creates the pairings of the following round automatically once a round is fully finished" showBreaksOnPublicBoards: type: boolean description: "Shows breaks/schedule placeholders from the timeline on the kiosk and athlete board too" allowCrossClubRegistration: type: boolean description: "Lets registrants search and register participants of other clubs; master data stays with the home club" publicResultsVisibility: $ref: '#/components/schemas/PublicResultsVisibility' executionAutoRefresh: type: boolean description: "Whether the execution page keeps itself up to date in the background" executionAutoRefreshSeconds: type: integer minimum: 5 maximum: 60 description: "Interval of that background sync in seconds; only in effect while executionAutoRefresh is set" # eventDay EventDayDto: type: object required: - id - event - date properties: id: type: string format: uuid event: type: string format: uuid date: type: string format: date name: type: string description: type: string EventDayRequest: type: object required: - date properties: date: type: string format: date name: type: string description: type: string AssignCompetitionsToDayRequest: type: object required: - competitions properties: competitions: type: array items: type: string format: uuid # competitionProperties CompetitionPropertiesDto: type: object required: - identifier - name - checkInOutRequired - namedParticipants - fees - lateRegistrationAllowed - resultConfirmationImageRequired - ratingCategoryRequired properties: identifier: type: string name: type: string shortName: type: string checkInOutRequired: type: boolean description: "Whether boats of this competition check in and out at the pontoon. Off for formats without it (e.g. beach sprint) - the referee dashboard then does not judge 'in the arena' at all." description: type: string competitionCategory: $ref: '#/components/schemas/CompetitionCategoryDto' namedParticipants: type: array items: $ref: '#/components/schemas/NamedParticipantForCompetitionDto' fees: type: array items: $ref: '#/components/schemas/FeeForCompetitionDto' lateRegistrationAllowed: type: boolean challengeConfig: $ref: '#/components/schemas/CompetitionChallengeConfigDto' ratingCategoryRequired: type: boolean NamedParticipantForCompetitionDto: type: object required: - id - name - countMales - countFemales - countNonBinary - countMixed properties: id: type: string format: uuid name: type: string description: type: string countMales: type: integer countFemales: type: integer countNonBinary: type: integer countMixed: type: integer FeeForCompetitionDto: type: object required: - id - assignmentId - name - required - amount properties: id: type: string format: uuid assignmentId: type: string format: uuid name: type: string description: type: string required: type: boolean amount: type: string format: decimal lateAmount: type: string format: decimal CompetitionChallengeConfigDto: type: object required: - resultConfirmationImageRequired - startAt - endAt properties: resultConfirmationImageRequired: type: boolean startAt: type: string format: date-time endAt: type: string format: date-time CompetitionPropertiesRequest: type: object required: - identifier - name - checkInOutRequired - namedParticipants - fees - lateRegistrationAllowed - ratingCategoryRequired properties: identifier: type: string name: type: string shortName: type: string checkInOutRequired: type: boolean description: "Whether boats of this competition check in and out at the pontoon. Off for formats without it (e.g. beach sprint) - the referee dashboard then does not judge 'in the arena' at all." description: type: string competitionCategory: type: string format: uuid namedParticipants: type: array items: $ref: '#/components/schemas/NamedParticipantForCompetitionRequestDto' fees: type: array items: $ref: '#/components/schemas/FeeForCompetitionRequestDto' lateRegistrationAllowed: type: boolean setupTemplate: type: string format: uuid challengeConfig: $ref: '#/components/schemas/CompetitionChallengeConfigRequest' ratingCategoryRequired: type: boolean NamedParticipantForCompetitionRequestDto: type: object required: - namedParticipant - countMales - countFemales - countNonBinary - countMixed properties: namedParticipant: type: string format: uuid countMales: type: integer countFemales: type: integer countNonBinary: type: integer countMixed: type: integer FeeForCompetitionRequestDto: type: object required: - fee - required - amount properties: fee: type: string format: uuid required: type: boolean amount: type: string format: decimal lateAmount: type: string format: decimal CompetitionChallengeConfigRequest: type: object required: - resultConfirmationImageRequired - startAt - endAt properties: resultConfirmationImageRequired: type: boolean startAt: type: string format: date-time endAt: type: string format: date-time # competition CompetitionDto: type: object required: - id - event - properties properties: id: type: string format: uuid event: type: string format: uuid properties: $ref: '#/components/schemas/CompetitionPropertiesDto' template: type: string format: uuid registrationCount: type: number AssignDaysToCompetitionRequest: type: object required: - days properties: days: type: array items: type: string format: uuid CompetitionRegistrationDto: type: object required: - id - clubName - clubId - optionalFees - namedParticipants - isLate - updatedAt - createdAt - eventDocumentsOfficiallyAccepted properties: id: type: string format: uuid name: type: string clubId: type: string format: uuid clubName: type: string optionalFees: type: array items: $ref: '#/components/schemas/CompetitionRegistrationFeeDto' namedParticipants: type: array items: $ref: '#/components/schemas/CompetitionRegistrationNamedParticipantDto' isLate: type: boolean ratingCategory: $ref: '#/components/schemas/RatingCategoryDto' updatedAt: type: string format: date-time createdAt: type: string format: date-time deregistration: $ref: '#/components/schemas/CompetitionDeregistrationDto' CompetitionRegistrationFeeDto: type: object required: - feeId - feeName properties: feeId: type: string format: uuid feeName: type: string CompetitionRegistrationNamedParticipantDto: type: object required: - namedParticipantId - namedParticipantName - participants properties: namedParticipantId: type: string format: uuid namedParticipantName: type: string participants: type: array items: $ref: '#/components/schemas/ParticipantForEventDto' CompetitionRegistrationsWithoutTeamNumberDto: type: object required: - competitionId - competitionIdentifier - competitionName - registrationId - registrationClub properties: competitionId: type: string format: uuid competitionIdentifier: type: string competitionName: type: string registrationId: type: string format: uuid registrationClub: type: string registrationName: type: string CompetitionDeregistrationDto: type: object properties: competitionSetupRoundId: type: string format: uuid reason: type: string CompetitionRegistrationTeamDto: type: object required: - id - clubId - clubName - namedParticipants - globalParticipantRequirements properties: id: type: string format: uuid name: type: string clubId: type: string format: uuid clubName: type: string namedParticipants: type: array items: $ref: '#/components/schemas/CompetitionRegistrationTeamNamedParticipantDto' deregistration: $ref: '#/components/schemas/CompetitionDeregistrationDto' globalParticipantRequirements: type: array items: $ref: '#/components/schemas/ParticipantRequirementDto' challengeResultValue: type: integer challengeResultVerifiedAt: type: string format: date-time challengeResultDocuments: type: object description: Map of documentId to documentName additionalProperties: type: string ratingCategory: $ref: '#/components/schemas/RatingCategoryDto' CompetitionRegistrationTeamNamedParticipantDto: type: object required: - namedParticipantId - namedParticipantName - participants - participantRequirements properties: namedParticipantId: type: string format: uuid namedParticipantName: type: string participants: type: array items: $ref: '#/components/schemas/ParticipantForCompetitionRegistrationTeam' participantRequirements: type: array items: $ref: '#/components/schemas/CompetitionRegistrationNamedParticipantRequirementDto' ParticipantForCompetitionRegistrationTeam: type: object required: - id - firstname - lastname - year - gender - external - participantRequirementsChecked properties: id: type: string format: uuid firstname: type: string lastname: type: string year: type: integer gender: $ref: '#/components/schemas/Gender' external: type: boolean externalClubName: type: string qrCodeId: type: string participantRequirementsChecked: type: array items: $ref: '#/components/schemas/CheckedParticipantRequirement' currentStatus: $ref: '#/components/schemas/ParticipantScanType' lastScanAt: type: string format: date-time lastScanBy: $ref: '#/components/schemas/AppUserNameDto' CompetitionRegistrationNamedParticipantRequirementDto: type: object required: - id - name - optional - checkInApp - qrCodeRequired properties: id: type: string format: uuid name: type: string description: type: string optional: type: boolean checkInApp: type: boolean qrCodeRequired: type: boolean # competitionSetup CompetitionSetupMatchDto: type: object required: - weighting - participants - executionOrder properties: weighting: type: integer teams: type: integer name: type: string participants: type: array items: type: integer executionOrder: type: integer startTimeOffset: type: integer description: Offset between the starts of consecutive teams, in seconds CompetitionSetupGroupDto: type: object required: - weighting - matches - participants - executionOrder properties: weighting: type: integer teams: type: integer name: type: string matches: type: array items: $ref: '#/components/schemas/CompetitionSetupMatchDto' participants: type: array items: type: integer CompetitionSetupGroupStatisticEvaluationDto: type: object required: - name - priority - rankByBiggest - ignoreBiggestValues - ignoreSmallestValues - asAverage properties: name: type: string priority: type: integer rankByBiggest: type: boolean ignoreBiggestValues: type: integer ignoreSmallestValues: type: integer asAverage: type: boolean CompetitionSetupPlaceDto: type: object required: - roundOutcome - place properties: roundOutcome: type: integer place: type: integer CompetitionSetupMatchNamingDto: type: object required: - participantCount - matchWeighting properties: participantCount: type: integer description: Fixed bracket size N (number of teams qualifying out of the qualification round(s)). matchWeighting: type: integer description: Identifies the match within the round (stable across edits). name: type: string nullable: true executionOrder: type: integer nullable: true CompetitionSetupRoundDto: type: object required: - name - required - useDefaultSeeding - placesOption - isQualification - updatable properties: id: type: string format: uuid nullable: true description: >- Stable identifier of an existing round. Null marks a newly added round. Sent back by the client so the update can be applied as a diff instead of recreating everything. name: type: string required: type: boolean updatable: type: boolean description: >- Read-only. False when the round has already been created during execution and therefore must not be changed. Ignored on incoming update requests. matches: type: array items: $ref: '#/components/schemas/CompetitionSetupMatchDto' groups: type: array items: $ref: '#/components/schemas/CompetitionSetupGroupDto' statisticEvaluations: type: array items: $ref: '#/components/schemas/CompetitionSetupGroupStatisticEvaluationDto' useDefaultSeeding: type: boolean placesOption: type: string enum: - EQUAL - ASCENDING - CUSTOM - PER_MATCH places: type: array items: $ref: '#/components/schemas/CompetitionSetupPlaceDto' isQualification: type: boolean description: >- Marks a preliminary / qualification round. The number of teams qualifying out of the qualification round(s) defines the fixed bracket size N used to resolve the match namings. matchNamings: type: array items: $ref: '#/components/schemas/CompetitionSetupMatchNamingDto' CompetitionSetupDto: type: object required: - rounds properties: rounds: type: array items: $ref: '#/components/schemas/CompetitionSetupRoundDto' CompetitionSetupTemplateRequest: type: object required: - name - rounds properties: name: type: string description: type: string rounds: type: array items: $ref: '#/components/schemas/CompetitionSetupRoundDto' CompetitionSetupTemplateDto: type: object required: - id - name - rounds properties: id: type: string format: uuid name: type: string description: type: string rounds: type: array items: $ref: '#/components/schemas/CompetitionSetupRoundDto' CompetitionSetupTemplateOverviewDto: type: object required: - id - name properties: id: type: string format: uuid name: type: string description: type: string # competitionTemplate CompetitionTemplateDto: type: object required: - id - properties properties: id: type: string format: uuid properties: $ref: '#/components/schemas/CompetitionPropertiesDto' setupTemplate: $ref: '#/components/schemas/CompetitionSetupTemplateOverviewDto' # competitionCategory CompetitionCategoryDto: type: object required: - id - name properties: id: type: string format: uuid name: type: string description: type: string CompetitionCategoryRequest: type: object required: - name properties: name: type: string description: type: string # namedParticipant NamedParticipantDto: type: object required: - id - name properties: id: type: string format: uuid name: type: string description: type: string NamedParticipantRequest: type: object required: - name properties: name: type: string description: type: string NamedParticipantWithRequirementsDto: type: object required: - id - name - requirements - qrCodeRequired properties: id: type: string format: uuid name: type: string description: type: string requirements: type: array items: $ref: '#/components/schemas/EventParticipantRequirementDto' qrCodeRequired: type: boolean EventParticipantRequirementDto: type: object required: - requirementId - requirementName - qrCodeRequired properties: requirementId: type: string format: uuid requirementName: type: string requirementDescription: type: string namedParticipantId: type: string format: uuid qrCodeRequired: type: boolean AssignRequirementToNamedParticipantDto: type: object required: - requirementId - qrCodeRequired properties: requirementId: type: string format: uuid qrCodeRequired: type: boolean UpdateQrCodeRequirementDto: type: object required: - requirementId - qrCodeRequired properties: requirementId: type: string format: uuid namedParticipantId: type: string format: uuid qrCodeRequired: type: boolean # fee FeeDto: type: object required: - id - name properties: id: type: string format: uuid name: type: string description: type: string FeeRequest: type: object required: - name properties: name: type: string description: type: string # participantRequirement ParticipantRequirementDto: type: object required: - publiclyVisible - id - name - optional - checkInApp - perEventDay - perCompetition properties: id: type: string format: uuid name: type: string description: type: string publicNote: type: string nullable: true description: "Public, athlete-facing text shown on My Event - separate from the internal description" optional: type: boolean checkInApp: type: boolean description: "Per App prüfbar" publiclyVisible: type: boolean description: "Im oeffentlichen Dashboard Mein Event sichtbar" perEventDay: type: boolean description: "Muss je Wettkampftag erfuellt werden" perCompetition: type: boolean description: "Muss je Wettkampf erfuellt werden" checkEarliestMinutesBefore: type: integer nullable: true description: "Check must be at most this many minutes before match start" checkLatestMinutesBefore: type: integer nullable: true description: "Check must exist at latest this many minutes before match start" CheckedParticipantRequirement: type: object required: - id properties: id: type: string format: uuid note: type: string eventDayId: type: string format: uuid nullable: true description: "Wettkampftag, den diese Bestaetigung abdeckt - null heisst ohne Tagesbezug" competitionId: type: string format: uuid nullable: true description: "Wettkampf, den diese Bestaetigung abdeckt - null heisst ohne Wettkampfbezug" ParticipantRequirementLogAction: type: string enum: [APPROVED, REVOKED] ParticipantRequirementLogSource: type: string enum: [SCAN, BULK, IMPORT] ParticipantRequirementLogEntryDto: type: object required: - id - participantId - participantName - requirementId - requirementName - action - source - createdAt properties: id: type: string format: uuid participantId: type: string format: uuid participantName: type: string clubName: type: string nullable: true requirementId: type: string format: uuid requirementName: type: string action: $ref: '#/components/schemas/ParticipantRequirementLogAction' source: $ref: '#/components/schemas/ParticipantRequirementLogSource' competitionId: type: string format: uuid nullable: true competitionName: type: string nullable: true eventDayId: type: string format: uuid nullable: true eventDayDate: type: string format: date nullable: true note: type: string nullable: true createdAt: type: string format: date-time createdBy: type: string nullable: true ParticipantScanCompetitionDto: type: object required: - id - name properties: id: type: string format: uuid identifier: type: string nullable: true name: type: string shortName: type: string nullable: true ParticipantScanScopeDto: type: object required: - competitions properties: todayEventDayId: type: string format: uuid nullable: true description: "Heutiger Wettkampftag - null, wenn heute keinem Wettkampftag zuzuordnen ist" competitions: type: array items: $ref: '#/components/schemas/ParticipantScanCompetitionDto' ParticipantRequirementForEventDto: type: object required: - publiclyVisible - id - name - optional - active - checkInApp - perEventDay - perCompetition properties: id: type: string format: uuid name: type: string description: type: string optional: type: boolean active: type: boolean checkInApp: type: boolean description: "Per App prüfbar" publiclyVisible: type: boolean description: "Im oeffentlichen Dashboard Mein Event sichtbar" perEventDay: type: boolean description: "Muss je Wettkampftag erfuellt werden" perCompetition: type: boolean description: "Muss je Wettkampf erfuellt werden" requirements: type: array items: $ref: '#/components/schemas/NamedParticipantRequirementForEventDto' NamedParticipantRequirementForEventDto: type: object required: - id - name - qrCodeRequired properties: id: type: string format: uuid name: type: string qrCodeRequired: type: boolean ParticipantRequirementUpsertDto: type: object required: - name properties: name: type: string description: type: string publicNote: type: string nullable: true description: "Public, athlete-facing text shown on My Event - separate from the internal description" optional: type: boolean checkInApp: type: boolean description: "Per App prüfbar" publiclyVisible: type: boolean description: "Im oeffentlichen Dashboard Mein Event sichtbar" perEventDay: type: boolean description: "Muss je Wettkampftag erfuellt werden" perCompetition: type: boolean description: "Muss je Wettkampf erfuellt werden" checkEarliestMinutesBefore: type: integer nullable: true description: "Check must be at most this many minutes before match start" checkLatestMinutesBefore: type: integer nullable: true description: "Check must exist at latest this many minutes before match start" ParticipantRequirementCheckForEventConfigDto: type: object required: - requirementId - firstnameColName - lastnameColName - noHeader properties: requirementId: type: string format: uuid separator: type: string charset: type: string firstnameColName: type: string lastnameColName: type: string yearsColName: type: string clubColName: type: string noHeader: type: boolean requirementColName: type: string requirementIsValidValues: type: array description: >- Values of the requirement column that count as fulfilled. Several are allowed - the DRV list carries both "ja" and "erweitert". Empty or absent means every row counts, which is also what an unmapped requirement column does. items: type: string ParticipantRequirementCheckForEventUpsertDto: type: object required: - requirementId - approvedParticipants properties: requirementId: type: string format: uuid approvedParticipants: type: array items: $ref: '#/components/schemas/CheckedParticipantRequirement' namedParticipantId: type: string format: uuid nullable: true competitionId: type: string format: uuid nullable: true description: >- Der Rahmen des Abgleichs. Pflicht, sobald die Bedingung je Wettkampf gilt - ohne ihn waere unklar, welchen Zustand die Liste ersetzt, und der Abgleich loeschte die Bestaetigungen aller anderen Wettkaempfe mit. Der Tag kommt nicht von hier: ihn bestimmt der Server aus dem Zeitpunkt des Abgleichs. ParticipantRequirementApproveForParticipantDto: type: object required: - requirementId - participantId - approved properties: requirementId: type: string format: uuid participantId: type: string format: uuid approved: type: boolean note: type: string nullable: true namedParticipantId: type: string format: uuid nullable: true competitionId: type: string format: uuid nullable: true description: >- For requirements with perCompetition - the competition this approval is for. Without it the fulfillment is stored without competition reference, which deliberately covers no match while the switch is on. # captcha CaptchaDto: type: object required: - id - imgSrc - solutionMin - solutionMax - handleToHeightRatio - start properties: id: type: string format: uuid imgSrc: type: string format: base64 solutionMin: type: integer solutionMax: type: integer handleToHeightRatio: type: number start: type: integer # eventDocuments EventDocumentTypeRequest: type: object required: - name - required - confirmationRequired properties: name: type: string description: type: string required: type: boolean confirmationRequired: type: boolean EventDocumentTypeDto: type: object required: - id - name - required - confirmationRequired properties: id: type: string format: uuid name: type: string description: type: string required: type: boolean confirmationRequired: type: boolean EventDocumentRequest: type: object properties: documentType: type: string format: uuid EventDocumentDto: type: object required: - id - name - createdAt - updatedAt properties: id: type: string format: uuid documentType: $ref: '#/components/schemas/EventDocumentTypeDto' name: type: string createdAt: type: string format: date-time createdBy: $ref: '#/components/schemas/AppUserNameDto' updatedAt: type: string format: date-time updatedBy: $ref: '#/components/schemas/AppUserNameDto' EventExportBundleItemKind: type: string enum: - DOCUMENT - GENERATED_STARTLISTS EventExportBundleItemDto: type: object required: - id - kind properties: id: type: string format: uuid kind: $ref: '#/components/schemas/EventExportBundleItemKind' document: type: string format: uuid nullable: true description: Only set for kind DOCUMENT - the event document's id. documentName: type: string nullable: true description: Only set for kind DOCUMENT - the document's file name, for display. AddEventExportBundleItemRequest: type: object required: - document properties: document: type: string format: uuid EventExportBundleOrderRequest: type: object required: - itemIds properties: itemIds: type: array items: type: string format: uuid # club ClubUpsertDto: type: object required: - name properties: name: type: string shortName: type: string nullable: true ClubDto: type: object required: - id - name - createdAt - updatedAt properties: id: type: string format: uuid name: type: string createdAt: type: string format: date-time updatedAt: type: string format: date-time ClubSearchDto: type: object required: - id - name properties: id: type: string format: uuid name: type: string ClubShortNameDto: type: object required: - nameKey - names - shortName - maintained properties: nameKey: type: string names: type: array items: type: string shortName: type: string maintained: type: boolean ClubShortNameRequest: type: object required: - shortName - sampleName properties: shortName: type: string sampleName: type: string ClubNameRuleKind: type: string enum: - ABBREVIATION - REMOVE_TERM - REMOVE_YEARS - REMOVE_BRACKETED ClubNameRuleDto: type: object required: - id - kind - sortOrder properties: id: type: string format: uuid kind: $ref: '#/components/schemas/ClubNameRuleKind' term: type: string nullable: true replacement: type: string nullable: true sortOrder: type: integer ClubNameRuleRequest: type: object required: - kind properties: kind: $ref: '#/components/schemas/ClubNameRuleKind' term: type: string nullable: true replacement: type: string nullable: true ClubNameRuleOrderRequest: type: object required: - ruleIds properties: ruleIds: type: array items: type: string format: uuid ParticipantDto: type: object required: - id - firstname - lastname - gender - usedInRegistration - createdAt - updatedAt - clubId - clubName - additionalClubs properties: id: type: string format: uuid firstname: type: string lastname: type: string year: type: integer nullable: true gender: $ref: '#/components/schemas/Gender' phone: type: string nullable: true external: type: boolean nullable: true externalClubName: type: string nullable: true usedInRegistration: type: boolean createdAt: type: string format: date-time updatedAt: type: string format: date-time email: type: string clubId: description: Stammverein - nur er darf die Stammdaten aendern type: string format: uuid clubName: type: string additionalClubs: description: Weitere Vereine, die diese Person melden duerfen (ohne den Stammverein) type: array items: $ref: '#/components/schemas/ParticipantClubDto' ParticipantClubDto: type: object required: - id - name properties: id: type: string format: uuid name: type: string ParticipantSearchResultDto: description: >- Treffer der vereinsuebergreifenden Suche. Bewusst schmal: nur was zum Melden noetig ist, keine Kontaktdaten. type: object required: - id - firstname - lastname - gender - clubName properties: id: type: string format: uuid firstname: type: string lastname: type: string year: type: integer nullable: true gender: $ref: '#/components/schemas/Gender' clubName: type: string ParticipantForEventDto: type: object required: - id - clubId - clubName - firstname - lastname - gender properties: id: type: string format: uuid clubId: type: string format: uuid clubName: type: string firstname: type: string lastname: type: string year: type: integer nullable: true gender: $ref: '#/components/schemas/Gender' external: type: boolean nullable: true externalClubName: type: string nullable: true participantRequirementsChecked: type: array items: $ref: '#/components/schemas/CheckedParticipantRequirement' qrCodeId: type: string namedParticipantIds: type: array items: type: string format: uuid email: type: string hasChallengeResults: type: boolean # participant ParticipantUpsertDto: type: object required: - firstname - lastname - gender properties: firstname: type: string lastname: type: string year: type: integer nullable: true gender: $ref: '#/components/schemas/Gender' phone: type: string nullable: true external: type: boolean nullable: true externalClubName: type: string nullable: true email: type: string ParticipantImportRequest: type: object required: - separator - charset - colFirstname - colLastname - colYear - colGender - noHeader - valueGenderMale - valueGenderFemale - valueGenderDiverse properties: separator: type: string format: character charset: type: string colFirstname: type: string colLastname: type: string colYear: type: string colGender: type: string colExternalClubname: type: string colEmail: type: string noHeader: type: boolean valueGenderMale: type: string valueGenderFemale: type: string valueGenderDiverse: type: string # event registration EventRegistrationTemplateDto: type: object properties: info: $ref: '#/components/schemas/EventRegistrationInfoDto' upsertableRegistration: $ref: '#/components/schemas/EventRegistrationUpsertDto' lockedRegistration: $ref: '#/components/schemas/EventRegistrationLockedDto' required: - info - upsertableRegistration - lockedRegistration EventRegistrationInfoDto: type: object properties: state: $ref: '#/components/schemas/OpenForRegistrationType' name: type: string description: type: string location: type: string days: type: array items: $ref: '#/components/schemas/EventRegistrationDayDto' documentTypes: type: array items: $ref: '#/components/schemas/EventRegistrationDocumentTypeDto' competitionsSingle: type: array items: $ref: '#/components/schemas/EventRegistrationCompetitionDto' competitionsTeam: type: array items: $ref: '#/components/schemas/EventRegistrationCompetitionDto' required: - state - name - days - competitionsSingle - competitionsTeam EventRegistrationDayDto: type: object properties: id: type: string format: uuid date: type: string format: date name: type: string nullable: true description: type: string nullable: true required: - id - date EventRegistrationDocumentTypeDto: type: object properties: id: type: string format: uuid name: type: string description: type: string confirmationRequired: type: boolean files: type: array items: $ref: '#/components/schemas/EventRegistrationDocumentFileDto' required: - id - name - type - files EventRegistrationDocumentFileDto: type: object properties: id: type: string format: uuid name: type: string required: - id - name EventRegistrationCompetitionDto: type: object properties: id: type: string format: uuid identifier: type: string name: type: string shortName: type: string description: type: string competitionCategory: type: string namedParticipant: type: array items: $ref: '#/components/schemas/EventRegistrationNamedParticipantDto' fees: type: array items: $ref: '#/components/schemas/EventRegistrationFeeDto' days: type: array items: type: string format: uuid lateRegistrationAllowed: type: boolean ratingCategoryRequired: type: boolean required: - id - name - identifier - days - lateRegistrationAllowed - ratingCategoryRequired EventRegistrationNamedParticipantDto: type: object properties: id: type: string format: uuid name: type: string description: type: string required: type: boolean countMales: type: integer countFemales: type: integer countNonBinary: type: integer countMixed: type: integer required: - id - name - countMales - countFemales - countMixed - countNonBinary EventRegistrationFeeDto: type: object required: - id - label - required - amount properties: id: type: string format: uuid label: type: string description: type: string nullable: true required: type: boolean amount: type: string format: decimal lateAmount: type: string format: decimal EventRegistrationUpsertDto: type: object properties: participants: type: array items: $ref: '#/components/schemas/EventRegistrationParticipantUpsertDto' competitionRegistrations: type: array items: $ref: '#/components/schemas/CompetitionRegistrationUpsertDto' message: type: string callbackUrl: type: string required: - participants - competitionRegistrations CompetitionRegistrationUpsertDto: type: object properties: competitionId: type: string format: uuid teams: type: array items: $ref: '#/components/schemas/CompetitionRegistrationTeamUpsertDto' required: - competitionId CompetitionRegistrationTeamUpsertDto: type: object properties: id: type: string format: uuid clubId: type: string format: uuid optionalFees: type: array items: type: string format: uuid namedParticipants: type: array items: $ref: '#/components/schemas/CompetitionRegistrationNamedParticipantUpsertDto' ratingCategory: type: string format: uuid callbackUrl: type: string required: - id CompetitionRegistrationNamedParticipantUpsertDto: type: object properties: namedParticipantId: type: string format: uuid participantIds: type: array items: type: string format: uuid required: - namedParticipantId - participantIds EventRegistrationParticipantUpsertDto: type: object required: - id - firstname - lastname - gender properties: id: type: string format: uuid isNew: type: boolean hasChanged: type: boolean firstname: type: string lastname: type: string year: type: integer nullable: true gender: $ref: '#/components/schemas/Gender' email: type: string external: type: boolean nullable: true externalClubName: type: string nullable: true competitionsSingle: type: array items: $ref: '#/components/schemas/CompetitionRegistrationSingleUpsertDto' CompetitionRegistrationSingleUpsertDto: type: object properties: competitionId: type: string format: uuid optionalFees: type: array items: type: string format: uuid ratingCategory: type: string format: uuid required: - competitionId EventRegistrationLockedDto: type: object properties: participants: type: array items: $ref: '#/components/schemas/EventRegistrationParticipantLockedDto' competitionRegistrations: type: array items: $ref: '#/components/schemas/CompetitionRegistrationLockedDto' required: - participants - competitionRegistrations CompetitionRegistrationLockedDto: type: object properties: competitionId: type: string format: uuid teams: type: array items: $ref: '#/components/schemas/CompetitionRegistrationTeamLockedDto' required: - id - teams CompetitionRegistrationTeamLockedDto: type: object properties: id: type: string format: uuid optionalFees: type: array items: type: string format: uuid namedParticipants: type: array items: $ref: '#/components/schemas/CompetitionRegistrationNamedParticipantLockedDto' isLate: type: boolean ratingCategory: type: string format: uuid required: - id - optionalFees - namedParticipants - isLate CompetitionRegistrationNamedParticipantLockedDto: type: object properties: namedParticipantId: type: string format: uuid participantIds: type: array items: type: string format: uuid required: - namedParticipantId - participantIds EventRegistrationParticipantLockedDto: type: object required: - id - competitionsSingle properties: id: type: string format: uuid competitionsSingle: type: array items: $ref: '#/components/schemas/CompetitionRegistrationSingleLockedDto' CompetitionRegistrationSingleLockedDto: type: object properties: competitionId: type: string format: uuid optionalFees: type: array items: type: string format: uuid isLate: type: boolean ratingCategory: type: string format: uuid required: - competitionId - optionalFees - isLate ParticipantRegisterRequest: type: object required: - firstname - lastname - gender - birthYear - clubId - language - callbackUrl - registerToSingleCompetitions properties: firstname: type: string lastname: type: string gender: $ref: '#/components/schemas/Gender' birthYear: type: integer email: type: string clubId: type: string format: uuid language: $ref: '#/components/schemas/EmailLanguage' callbackUrl: type: string registerToSingleCompetitions: type: array items: $ref: '#/components/schemas/ParticipantRegisterCompetitionRequest' ParticipantRegisterCompetitionRequest: type: object required: - competitionId properties: competitionId: type: string format: uuid optionalFees: type: array items: type: string format: uuid ratingCategory: type: string format: uuid DocumentType: type: string enum: - 'INVOICE' - 'REGISTRATION_REPORT' - 'START_LIST' DocumentTemplateDto: type: object required: - id - name properties: id: type: string format: uuid name: type: string pagePaddingTop: type: number format: double pagePaddingLeft: type: number format: double pagePaddingRight: type: number format: double pagePaddingBottom: type: number format: double DocumentTemplateRequest: type: object properties: pagePaddingTop: type: number format: double pagePaddingLeft: type: number format: double pagePaddingRight: type: number format: double pagePaddingBottom: type: number format: double AssignDocumentTemplateRequest: type: object properties: template: type: string format: uuid event: type: string format: uuid AssignGapDocumentTemplateRequest: type: object properties: template: type: string format: uuid AssignedTemplateId: type: object properties: value: type: string format: uuid TaskDto: type: object properties: id: type: string format: uuid event: type: string format: uuid eventName: type: string name: type: string dueDate: type: string format: date-time nullable: true description: type: string nullable: true remark: type: string nullable: true state: $ref: '#/components/schemas/TaskState' createdAt: type: string format: date-time updatedAt: type: string format: date-time responsibleUsers: type: array items: $ref: '#/components/schemas/AppUserNameDto' required: - id - event - eventName - name - state - createdAt - updatedAt - responsibleUsers TaskUpsertDto: type: object properties: name: type: string dueDate: type: string format: date-time nullable: true description: type: string nullable: true remark: type: string nullable: true state: $ref: '#/components/schemas/TaskState' responsibleUsers: type: array items: type: string format: uuid required: - name - state - responsibleUsers TaskState: type: string enum: - OPEN - IN_PROGRESS - DONE - CANCELED WorkTypeDto: type: object properties: id: type: string format: uuid name: type: string description: type: string nullable: true color: type: string minUser: type: integer maxUser: type: integer createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - name - minUser - createdAt - updatedAt WorkTypeUpsertDto: type: object properties: name: type: string description: type: string color: type: string minUser: type: integer maxUser: type: integer required: - name - minUser WorkShiftWithAssignedUsersDto: type: object properties: id: type: string format: uuid title: type: string event: type: string format: uuid timeFrom: type: string format: date-time timeTo: type: string format: date-time eventName: type: string workType: type: string format: uuid workTypeName: type: string remark: type: string minUser: type: integer format: int32 maxUser: type: integer format: int32 createdAt: type: string format: date-time updatedAt: type: string format: date-time assignedUsers: type: array items: $ref: '#/components/schemas/AppUserNameDto' required: - id - title - event - timeFrom - timeTo - eventName - workType - name - minUser - createdAt - updatedAt - assignedUsers WorkShiftUpsertDto: type: object properties: workType: type: string format: uuid timeFrom: type: string format: date-time timeTo: type: string format: date-time minUser: type: integer format: int32 maxUser: type: integer format: int32 remark: type: string assignedUsers: type: array items: type: string format: uuid required: - workType - timeFrom - timeTo - minUser - assignedUsers DocumentTypeDto: type: object required: - type properties: type: $ref: '#/components/schemas/DocumentType' assignedTemplate: $ref: '#/components/schemas/AssignedTemplateId' BankAccountDto: type: object required: - id - holder - iban - bic - bank properties: id: type: string format: uuid holder: type: string iban: type: string bic: type: string bank: type: string BankAccountRequest: type: object required: - holder - iban - bic - bank properties: holder: type: string iban: type: string bic: type: string bank: type: string AssignBankAccountRequest: type: object properties: bankAccount: type: string format: uuid event: type: string format: uuid AssignedBankAccountDto: type: object properties: assigned: $ref: '#/components/schemas/BankAccountDto' ContactInformationRequest: type: object required: - name - addressZip - addressCity - addressStreet - email properties: name: type: string addressZip: type: string addressCity: type: string addressStreet: type: string email: type: string ContactInformationDto: type: object required: - id - name - addressZip - addressCity - addressStreet - email properties: id: type: string format: uuid name: type: string addressZip: type: string addressCity: type: string addressStreet: type: string email: type: string AssignContactInformationRequest: type: object properties: contact: type: string format: uuid event: type: string format: uuid AssignedContactInformationDto: type: object properties: assigned: $ref: '#/components/schemas/ContactInformationDto' CompetitionExecutionProgressDto: type: object required: - rounds - canNotCreateRoundReasons - isChallengeEvent properties: rounds: type: array items: $ref: '#/components/schemas/CompetitionRoundDto' canNotCreateRoundReasons: type: array items: $ref: '#/components/schemas/CompetitionExecutionCanNotCreateRoundReason' isChallengeEvent: type: boolean CompetitionExecutionCanNotCreateRoundReason: type: string enum: - ALL_ROUNDS_CREATED - NO_ROUNDS_IN_SETUP - NO_SETUP_MATCHES - NO_REGISTRATIONS - REGISTRATIONS_NOT_FINALIZED - NOT_ENOUGH_TEAM_SPACE - NOT_ALL_PLACES_SET CompetitionRoundDto: type: object required: - setupRoundId - name - matches - required - substitutions properties: setupRoundId: type: string format: uuid name: type: string matches: type: array items: $ref: '#/components/schemas/CompetitionMatchDto' required: type: boolean substitutions: type: array items: $ref: '#/components/schemas/SubstitutionDto' MatchByeCause: type: string description: >- Why a match is a bye. DEREGISTRATION is only used when one of the non-racing rows of the match carries a deregistration record - competition_deregistration is unique per registration, so it also applies to a row carried over as OUT from an earlier round. NO_OPPONENT is the neutral fallback for everything else (only one boat seeded, or the opponent row was eliminated): without a record no withdrawal is claimed. enum: - DEREGISTRATION - NO_OPPONENT MatchByeDto: type: object description: >- The bye of a match. Display only - it changes nothing about the chain, the result lock or the automatic first place. Exception: mustRace makes the match operationally a real race. required: - cause - mustRace properties: cause: $ref: '#/components/schemas/MatchByeCause' teamName: type: string nullable: true description: The withdrawn teams, comma separated when there are several - null for NO_OPPONENT. reason: type: string nullable: true description: >- The stored withdrawal reason - only when exactly one row is deregistered, because with several the mapping name -> reason would be a guess. mustRace: type: boolean description: >- 'Must race' (competition_match.bye_must_race): the match stays a bye but is raced - exports, polling and the chain treat it like any match, the measured time runs out of competition. seed: type: integer nullable: true description: >- Seeding number of the racing team - 'Bye 1' is the bye of the boat that advanced first. It is the seed of the setup seat the team occupies in this match; null when no seat matches the start number (e.g. first-round byes created by a withdrawal), the label then stays a plain 'Bye'. MatchStatusDto: type: object description: >- The derived state of a match, read by every surface - one derivation, three callers (execution page, schedule, referee dashboard). "Overdue", "partially scored" and "n withdrawn" are deliberately NOT states of their own but readings of these fields: partially scored is state != RUNNING && 0 < teamsRaced < teamsTotal - teamsDeregistered, overdue is state == UPCOMING && startTime + 5 min < now, "n withdrawn" is teamsDeregistered > 0. Elapsed minutes and overdueness are computed in the frontend against the browser clock so the chip keeps counting between two polls. required: - state - teamsTotal - teamsScored - teamsRaced - teamsDeregistered properties: state: $ref: '#/components/schemas/LiveDashboardMatchState' startedAt: type: string format: date-time description: Actual start - null while nobody started the match. teamsTotal: type: integer teamsScored: type: integer description: >- Settled means: deregistered OR place set OR failed - the question "is anyone still waiting for a result here". Carries AWAITING_FINISH and the activation chain, NOT the "partially scored" reading. teamsRaced: type: integer description: >- Of those, actually raced: place set OR failed, withdrawals excluded. Only this number may trigger "partially scored". Before 2026-08-14 it did not exist and a match with one withdrawal and four open boats read as "partially scored 1/5" although nobody had raced. teamsDeregistered: type: integer description: >- Of those, withdrawn from this round. A plain statement shown as a second, quiet chip next to the state chip - it never decides a state. teamsInArena: type: integer description: null = not collected in this view (schedule, public boards). bye: allOf: - $ref: '#/components/schemas/MatchByeDto' nullable: true description: >- Set when this match is a bye. Like "overdue" and "partially scored" this is a reading, not a state of its own. CompetitionMatchDto: type: object required: - id - teams - weighting - executionOrder - skipped - status properties: id: type: string format: uuid name: type: string teams: type: array items: $ref: '#/components/schemas/CompetitionMatchTeamDto' weighting: type: integer executionOrder: type: integer startTime: type: string format: date-time description: Planned start from the schedule. startTimeOffset: type: integer description: Offset between the starts of consecutive teams, in seconds activatedAt: type: string format: date-time nullable: true description: When the match was called to the start - null while nobody activated it. startedAt: type: string format: date-time description: Actual start - null while nobody started the match. finishedAt: type: string format: date-time description: >- Persisted end. Set means exclusively that somebody finished the match. skipped: type: boolean description: The schedule slot of this match was cancelled. status: $ref: '#/components/schemas/MatchStatusDto' raceClockerPolledAt: type: string format: date-time nullable: true description: When the automatic pull last tried this match - not when it last wrote something. raceClockerPollError: type: string nullable: true description: Error code of the last failed automatic pull, null when it is fine. raceClockerAutoPausedAt: type: string format: date-time nullable: true description: Set while the automatic pull leaves this match alone because results were entered by hand. pairingsRecalculatedAt: type: string format: date-time nullable: true description: "Set while this match's pairing comes from a recalculation and the match has not been called to the start yet" CompetitionMatchTeamDto: type: object required: - registrationId - teamNumber - clubId - clubName - namedParticipants - startNumber - deregistered - failed properties: registrationId: type: string format: uuid teamNumber: type: integer clubId: type: string format: uuid clubName: type: string actualClubName: type: string namedParticipants: type: array items: $ref: '#/components/schemas/CompetitionTeamNamedParticipantDto' name: type: string startNumber: type: integer place: type: integer timeString: type: string deregistered: type: boolean deregistrationLocked: type: boolean deregistrationReason: type: string failed: type: boolean failedReason: type: string penaltySeconds: type: integer description: "Time penalty in seconds; the result time already includes it" penaltyNote: type: string laps: type: array description: "Intermediate marks from RaceClocker, in on-course order; empty for races without split columns" items: $ref: '#/components/schemas/MatchTeamLapDto' MatchTeamLapDto: type: object required: - name - timeString properties: name: type: string description: "The split column's name as the timekeeper labelled it in RaceClocker (e.g. 'Runde 1')" timeString: type: string description: "Cumulative race time at this mark, formatted for display (e.g. '1:05.5')" recordedAt: type: string format: date-time nullable: true description: "when the lap time arrived; carries the ordering of the stream lap band" lapMillis: type: integer format: int64 nullable: true description: >- Elapsed time at this mark in milliseconds - a sorting aid for the lap band only, the display uses timeString. Marks arriving in the same poll share recordedAt; the higher time is then the more recent news. UpdateCompetitionMatchRequest: type: object required: - teams properties: startTime: type: string format: date-time teams: type: array items: $ref: '#/components/schemas/UpdateCompetitionMatchTeamRequest' EventStartlistFileType: type: string description: >- Format of the bulk start list export: ZIP packs one CSV per competition (what Webscorer needs, one race per competition), CSV writes one big file sorted by start time (what RaceClocker needs, one race carrying all waves), PDF concatenates the per-match start list PDFs sorted by start time (notice board / registration report style; rendered with the event's assigned START_LIST template, or the built-in layout when none is assigned). enum: - ZIP - CSV - PDF EventStartlistPreviewMatchDto: type: object description: >- One row of the bulk start list export preview: a match the export with the same parameters would export. startTime null means the match would block the export until it is deselected via matchIds. required: - matchId - competitionId - competitionIdentifier - roundName properties: matchId: type: string format: uuid competitionId: type: string format: uuid competitionIdentifier: type: string competitionShortName: type: string competitionName: type: string roundName: type: string matchName: type: string startTime: type: string format: date-time missingInRaceClocker: type: boolean description: >- Whether the match is missing in the feed of the competition's assigned RaceClocker race. Trivially true everywhere in delta mode (the others are already filtered out); without delta the flag carries the information. Absent/null = no race assigned, there is nothing to compare against. UpdateMatchByeMustRaceRequest: type: object description: >- Toggles 'must race' on a bye match. Fairness rule of some rule books: even a boat without an opponent races the course. Progression keeps bye semantics, the time is taken and shown as out of competition. required: - mustRace properties: mustRace: type: boolean UpdateCompetitionMatchActivationRequest: type: object description: >- Calls a match to the start (activated = true) or takes that back. The click states that the match is up next, not that it is racing - that is decided by the real start (started_at). required: - activated properties: activated: type: boolean MatchForRunningStatusDto: type: object required: - id - competitionId - competitionName - roundNumber - roundName - matchNumber - hasPlacesSet properties: id: type: string format: uuid competitionId: type: string format: uuid competitionName: type: string roundNumber: type: integer roundName: type: string matchNumber: type: integer matchName: type: string nullable: true hasPlacesSet: type: boolean activatedAt: type: string format: date-time nullable: true description: When the match was called to the start - null while nobody activated it. startTime: type: string format: date-time UpdateCompetitionMatchTeamRequest: type: object required: - registrationId - startNumber properties: registrationId: type: string format: uuid startNumber: type: integer UpdateCompetitionMatchResultRequest: type: object required: - teamResults properties: teamResults: type: array items: $ref: '#/components/schemas/UpdateCompetitionMatchTeamResultRequest' UpdateCompetitionMatchTeamResultRequest: type: object required: - registrationId - deregistered properties: registrationId: type: string format: uuid place: type: integer timeString: type: string failed: type: boolean failedReason: type: string penaltySeconds: type: integer description: "Time penalty in seconds; the reported result time already includes it" penaltyNote: type: string CompetitionTeamPlaceDto: type: object required: - competitionRegistrationId - teamNumber - clubId - clubName - namedParticipants - place - deregistered - excluded properties: competitionRegistrationId: type: string format: uuid teamNumber: type: integer teamName: type: string clubId: type: string format: uuid clubName: type: string actualClubName: type: string namedParticipants: type: array items: $ref: '#/components/schemas/CompetitionTeamNamedParticipantDto' place: type: integer description: "the competition-wide place from the round logic; still the one printed on the certificate" ratingCategory: allOf: - $ref: '#/components/schemas/RatingCategoryRefDto' nullable: true description: "the rating category of this team; null when it has none" categoryPlace: type: integer nullable: true description: "the place within the rating category, counted from 1; null for excluded teams" matchName: type: string nullable: true description: >- Name of the match the place was scored in. Only set when the round scores places separately per match (each match has its own first place). deregistered: type: boolean deregistrationReason: type: string excluded: type: boolean CompetitionTeamNamedParticipantDto: type: object required: - namedParticipantId - namedParticipantName - participants properties: namedParticipantId: type: string format: uuid namedParticipantName: type: string participants: type: array items: $ref: '#/components/schemas/CompetitionTeamParticipantDto' CompetitionTeamParticipantDto: type: object required: - participantId - namedParticipantName - firstName - lastName - year - gender - external properties: participantId: type: string format: uuid namedParticipantName: type: string firstName: type: string lastName: type: string year: type: integer gender: $ref: '#/components/schemas/Gender' external: type: boolean externalClubName: type: string SubstitutionDto: type: object required: - id - orderForRound - setupRoundId - setupRoundName - competitionRegistrationId - clubId - clubName - namedParticipantId - namedParticipantName - participantOut - participantIn properties: id: type: string format: uuid reason: type: string orderForRound: type: integer format: int64 setupRoundId: type: string format: uuid setupRoundName: type: string competitionRegistrationId: type: string format: uuid competitionRegistrationName: type: string clubId: type: string format: uuid clubName: type: string namedParticipantId: type: string format: uuid namedParticipantName: type: string participantOut: $ref: '#/components/schemas/SubstitutionParticipantDto' participantIn: $ref: '#/components/schemas/SubstitutionParticipantDto' swapSubstitution: type: string format: uuid inheritedFrom: type: string format: uuid SubstitutionParticipantDto: type: object required: - id - firstName - lastName - year - gender properties: id: type: string format: uuid firstName: type: string lastName: type: string year: type: integer gender: $ref: '#/components/schemas/Gender' external: type: boolean externalClubName: type: string ParticipantForExecutionDto: type: object required: - id - namedParticipantId - namedParticipantName - firstName - lastName - year - gender - clubId - clubName - competitionRegistrationId properties: id: type: string format: uuid namedParticipantId: type: string format: uuid namedParticipantName: type: string firstName: type: string lastName: type: string year: type: integer gender: $ref: '#/components/schemas/Gender' clubId: type: string format: uuid clubName: type: string competitionRegistrationId: type: string format: uuid competitionRegistrationName: type: string external: type: boolean externalClubName: type: string PossibleSubstitutionParticipantDto: type: object required: - id - firstName - lastName - year - gender properties: id: type: string format: uuid firstName: type: string lastName: type: string year: type: integer gender: $ref: '#/components/schemas/Gender' external: type: boolean externalClubName: type: string registrationId: type: string format: uuid registrationName: type: string namedParticipantId: type: string format: uuid namedParticipantName: type: string PossibleSubstitutionsForParticipantDto: type: object required: - currentlyParticipating - notCurrentlyParticipating properties: currentlyParticipating: type: array items: $ref: '#/components/schemas/PossibleSubstitutionParticipantDto' notCurrentlyParticipating: type: array items: $ref: '#/components/schemas/PossibleSubstitutionParticipantDto' SubstitutionRequest: type: object required: - participantOut - participantIn properties: participantOut: type: string format: uuid participantIn: type: string format: uuid reason: type: string InvoiceContactDto: type: object required: - name - email properties: name: type: string email: type: string InvoiceDto: type: object required: - id - invoiceNumber - billedToContacts - totalAmount - createdAt properties: id: type: string format: uuid invoiceNumber: type: string billedToOrganization: type: string billedToName: type: string billedToContacts: type: array items: $ref: '#/components/schemas/InvoiceContactDto' totalAmount: type: string format: decimal createdAt: type: string format: date-time paidAt: type: string format: date-time InvoiceUpdateRequestDto: type: object required: - paid properties: paid: type: boolean StartListFileType: type: string enum: - PDF - CSV CompetitionDeregistrationRequest: type: object properties: reason: type: string TimingConfigDto: type: object properties: timingSystem: $ref: '#/components/schemas/TimingSystem' nullable: true race: type: string format: uuid nullable: true description: The one selected RaceClocker race of this competition - qualification and all other rounds alike. startlistConfig: type: string format: uuid nullable: true resultImportConfig: type: string format: uuid nullable: true eventTimingSystem: $ref: '#/components/schemas/TimingSystem' nullable: true description: Event-wide default timing system; the competition inherits it while its own field is null. eventStartlistConfig: type: string format: uuid nullable: true description: Event-wide default start list export; inherited while the competition's own field is null. eventResultImportConfig: type: string format: uuid nullable: true description: Event-wide default race results import; inherited while the competition's own field is null. RoundProgressionConfigDto: type: object required: - eventAutoCreateFollowingRounds - effective properties: autoCreateFollowingRounds: type: boolean nullable: true description: "The competition's own choice. null means it follows the event setting." eventAutoCreateFollowingRounds: type: boolean effective: type: boolean description: "What actually applies - computed by the backend so the inheritance rule lives in one place." RoundProgressionConfigRequest: type: object properties: autoCreateFollowingRounds: type: boolean nullable: true EventTimingConfigDto: type: object description: > Event-wide timing defaults. Timing system and the file-format presets live here once and every competition without its own values inherits them. The race selection is NOT here - it is assigned per race on each competition (RaceClockerRaceAssignments), no event-wide default. properties: timingSystem: $ref: '#/components/schemas/TimingSystem' nullable: true startlistConfig: type: string format: uuid nullable: true resultImportConfig: type: string format: uuid nullable: true autoPull: type: boolean description: Whether the background job pulls results for this event on its own. intervalActiveSeconds: type: integer description: Poll interval while at least one match of this event is running. Never goes below 2 seconds. intervalUpcomingSeconds: type: integer description: Poll interval while only upcoming matches are watched. Never goes below 2 seconds. watchBeforeMinutes: type: integer description: How long before its planned start an upcoming match is watched. watchAfterMinutes: type: integer description: How long after its planned start a match that is not active yet is still watched. deviatingCompetitions: type: array description: The competitions that do not follow these defaults but set at least one of the three fields themselves. items: $ref: '#/components/schemas/CompetitionTimingDeviationDto' required: - autoPull - intervalActiveSeconds - intervalUpcomingSeconds - watchBeforeMinutes - watchAfterMinutes CompetitionTimingDeviationDto: type: object description: > A competition that overrides the event-wide timing defaults. Only the inheritable fields are listed - system, start list export and result import. The race selection is no deviation: it is always assigned per competition, there is no event default to deviate from. properties: competitionId: type: string format: uuid identifier: type: string name: type: string timingSystem: $ref: '#/components/schemas/TimingSystem' nullable: true startlistConfig: type: string format: uuid nullable: true resultImportConfig: type: string format: uuid nullable: true required: - competitionId - identifier - name RaceClockerRaceDto: type: object required: [id, name, resultsUrl, capturesLaps, position] properties: id: type: string format: uuid name: type: string resultsUrl: type: string capturesLaps: type: boolean position: type: integer RaceClockerRaceRequest: type: object required: [name, resultsUrl, capturesLaps] properties: name: type: string resultsUrl: type: string capturesLaps: type: boolean CompetitionRaceAssignmentDto: type: object required: [competitionId, identifier, name] properties: competitionId: type: string format: uuid identifier: type: string name: type: string race: type: string format: uuid nullable: true description: "The one selected race; null means no race is assigned" RaceClockerRaceAssignmentsRequest: type: object required: [competitions] properties: competitions: type: array description: "Competitions that use this race for all of their rounds" items: type: string format: uuid EventTimingConfigRequest: type: object description: > The RaceClocker fields are optional, like the per-competition config. The five auto-pull fields are not optional - the database always has a value for them, and null here would ambiguously mean "leave unchanged". The race selection is not here - it is assigned per race on each competition, no event-wide default. properties: timingSystem: $ref: '#/components/schemas/TimingSystem' nullable: true startlistConfig: type: string format: uuid nullable: true resultImportConfig: type: string format: uuid nullable: true autoPull: type: boolean description: Whether the background job pulls results for this event on its own. intervalActiveSeconds: type: integer description: Poll interval while at least one match of this event is running. Never goes below 2 seconds. intervalUpcomingSeconds: type: integer description: Poll interval while only upcoming matches are watched. Never goes below 2 seconds. watchBeforeMinutes: type: integer description: How long before its planned start an upcoming match is watched. watchAfterMinutes: type: integer description: How long after its planned start a match that is not active yet is still watched. required: - autoPull - intervalActiveSeconds - intervalUpcomingSeconds - watchBeforeMinutes - watchAfterMinutes TimingSystem: type: string enum: - RACECLOCKER - WEBSCORER TimingConfigRequest: type: object description: > Every field is optional - the RaceClocker races only exist shortly before the regatta, so an incomplete configuration must be storable. The race id must belong to this competition's event; the service rejects a race from another event. properties: timingSystem: $ref: '#/components/schemas/TimingSystem' nullable: true race: type: string format: uuid nullable: true description: The one selected RaceClocker race - qualification and all other rounds alike. startlistConfig: type: string format: uuid nullable: true resultImportConfig: type: string format: uuid nullable: true StartListConfigRequest: type: object description: At least one column must be specified, and at least one of colTeamRegistrationId / colTeamMatchId. required: - name properties: name: type: string colParticipantFirstname: type: string colParticipantLastname: type: string colParticipantFullname: type: string colParticipantGender: type: string colParticipantRole: type: string colParticipantYear: type: string colParticipantClub: type: string colClubName: type: string colTeamName: type: string colTeamStartNumber: type: string colTeamRegistrationId: type: string description: Header of the column carrying the team identifier that is stable across rounds (competition registration id). Must map to a pass-through field of the timing tooling (e.g. Webscorer "Info 1"). colTeamMatchId: type: string description: Header of the column carrying the identifier that is unique per team and round (competition match team id). Needed by tooling that holds every round of a competition in a single race (RaceClocker), where the registration id repeats. colTeamRatingCategory: type: string colTeamClub: type: string colTeamDeregistered: type: string valueTeamDeregistered: type: string colMatchName: type: string colMatchStartTime: type: string colRoundName: type: string colCompetitionIdentifier: type: string colCompetitionName: type: string colCompetitionShortName: type: string colCompetitionCategory: type: string noHeader: type: boolean description: Export without a header row. Some tooling imports the header as a data row unless told otherwise (RaceClocker); columns are then mapped by position there. appendRatingToShortName: type: boolean description: Append the rating category to the competition short name column, for tooling that can only group by a single field. StartListConfigDto: type: object required: - id - name - noHeader - appendRatingToShortName properties: id: type: string format: uuid name: type: string colParticipantFirstname: type: string colParticipantLastname: type: string colParticipantFullname: type: string colParticipantGender: type: string colParticipantRole: type: string colParticipantYear: type: string colParticipantClub: type: string colClubName: type: string colTeamName: type: string colTeamStartNumber: type: string colTeamRegistrationId: type: string colTeamMatchId: type: string colTeamRatingCategory: type: string colTeamClub: type: string colTeamDeregistered: type: string valueTeamDeregistered: type: string colMatchName: type: string colMatchStartTime: type: string colRoundName: type: string colCompetitionIdentifier: type: string colCompetitionName: type: string colCompetitionShortName: type: string colCompetitionCategory: type: string noHeader: type: boolean appendRatingToShortName: type: boolean BoardElementType: type: string description: "MATCH_DETAIL is the announcer tile: one match in full detail, only valid as the board's single tile" enum: - MATCH - MATCH_DETAIL - MATCH_LIST - CLOCK - TEXT - AWARD_CEREMONY - DELAY - STREAM BoardListMode: type: string enum: - UPCOMING - RESULTS - RUNNING - SCHEDULE BoardScheduleMode: type: string description: "SCHEDULE only: FOLLOW = moving window around now (default), FULL = the whole day, the tile scrolls instead" enum: - FOLLOW - FULL BoardElement: type: object description: "One element of a tile. Deliberately flat: which fields are required per type is enforced by the backend validation" required: - type properties: type: $ref: '#/components/schemas/BoardElementType' offset: type: integer minimum: -6 maximum: 6 nullable: true showCrew: type: boolean nullable: true showCountdown: type: boolean nullable: true showTimes: type: boolean nullable: true contrastColors: type: boolean nullable: true autoFit: type: boolean nullable: true showCrewDetails: type: boolean nullable: true showBirthYears: type: boolean nullable: true showAdvancement: type: boolean nullable: true showRegisteringClub: type: boolean nullable: true listMode: $ref: '#/components/schemas/BoardListMode' scheduleMode: $ref: '#/components/schemas/BoardScheduleMode' streamMode: type: string nullable: true description: "STREAM only: what the livestream overlay shows; missing means AUTO (running match, falling back to the latest result); LAPS = lap band; UPCOMING_LIST = next five races" enum: - AUTO - RUNNING - RESULTS - UPCOMING - LAPS - UPCOMING_LIST - CLOCK streamCrew: type: string nullable: true description: "STREAM only: crew emphasis - clubs first (default when missing), participants first, or clubs only" enum: - CLUBS_FIRST - PARTICIPANTS_FIRST - CLUBS_ONLY limit: type: integer minimum: 1 maximum: 20 nullable: true useShortNames: type: boolean nullable: true description: "competition short name (identifier) instead of the full name" useShortClubNames: type: boolean nullable: true description: "STREAM only: club short form instead of the full club chain; missing follows useShortNames, so existing boards keep their look" competitionId: type: string format: uuid nullable: true ratingCategoryId: type: string format: uuid nullable: true showEventName: type: boolean nullable: true text: type: string nullable: true backgroundColor: type: string description: "Tile background as hex color (#RGB or #RRGGBB), allowed on every element type; absent = default look" pattern: '^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$' nullable: true borderColor: type: string description: "Tile border as hex color (#RGB or #RRGGBB), independent of backgroundColor; absent = default look" pattern: '^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$' nullable: true BoardTile: type: object required: - elements properties: rotationIntervalSeconds: type: integer minimum: 3 colSpan: type: integer minimum: 1 maximum: 4 rowSpan: type: integer minimum: 1 maximum: 3 elements: type: array items: $ref: '#/components/schemas/BoardElement' BoardConfig: type: object required: - columns - tiles properties: columns: type: integer minimum: 1 maximum: 4 showHeader: type: boolean nullable: true refreshIntervalSeconds: type: integer minimum: 3 tiles: type: array items: $ref: '#/components/schemas/BoardTile' BoardDto: type: object required: - id - eventId - name - config - createdAt - updatedAt properties: id: type: string format: uuid eventId: type: string format: uuid name: type: string config: $ref: '#/components/schemas/BoardConfig' createdAt: type: string format: date-time updatedAt: type: string format: date-time BoardNameDto: type: object required: - id - name properties: id: type: string format: uuid name: type: string BoardRequest: type: object required: - name - config properties: name: type: string config: $ref: '#/components/schemas/BoardConfig' ParticipantInfo: type: object required: - participantId - firstName - lastName properties: participantId: type: string format: uuid firstName: type: string lastName: type: string year: type: integer nullable: true description: "Year of birth, shown behind the name in result displays" namedRole: type: string nullable: true externalClubName: type: string MatchStatus: type: string enum: - PENDING - IN_PROGRESS - COMPLETED MatchTeamInfo: type: object required: - teamId properties: teamId: type: string format: uuid teamName: type: string nullable: true teamNumber: type: integer nullable: true clubName: type: string nullable: true result: type: string nullable: true rank: type: integer nullable: true UpcomingCompetitionMatchInfo: type: object required: - matchId - competitionName - executionOrder - teams - pendingRound - cancelled properties: matchId: type: string format: uuid matchNumber: type: integer nullable: true competitionId: type: string format: uuid nullable: true description: "null for a FREE placeholder (break/schedule item, see name) - there is no competition then" competitionName: type: string competitionShortName: type: string nullable: true categoryName: type: string nullable: true scheduledStartTime: type: string format: date-time nullable: true placeName: type: string nullable: true roundNumber: type: integer nullable: true roundName: type: string nullable: true matchName: type: string nullable: true executionOrder: type: integer teams: type: array items: $ref: '#/components/schemas/UpcomingMatchTeamInfo' pendingRound: type: boolean description: "true for a placeholder from a waiting timeline slot (round not yet materialized) - matchId then points at the setup round, not a real match, and teams is always empty" name: type: string nullable: true description: "name of a FREE placeholder (break/schedule item like a lunch break) - null for real matches and for waiting-round placeholders (pendingRound); only set when the event shows breaks on public boards" cancelled: type: boolean description: "the schedule slot of this match was cancelled. The match stays in the list anyway - a match that vanishes without a trace is indistinguishable from a display error for the crew waiting at the pontoon. teams is then always empty" UpcomingMatchTeamInfo: type: object required: - teamId - startNumber - participants properties: teamId: type: string format: uuid teamName: type: string nullable: true teamNumber: type: integer nullable: true startNumber: type: integer description: "starting position in the match, from competition_match_team.start_number (NOT NULL since migration V202507040930)" clubName: type: string nullable: true clubsShort: type: string nullable: true description: "the clubs the athletes of this boat wear, chained in boat order, in short form" clubsFull: type: string nullable: true description: "the same chain with the full club names" participants: type: array items: $ref: '#/components/schemas/UpcomingMatchParticipantInfo' UpcomingMatchParticipantInfo: type: object required: - participantId - firstName - lastName properties: participantId: type: string format: uuid firstName: type: string lastName: type: string namedRole: type: string nullable: true year: type: integer nullable: true gender: type: string nullable: true externalClubName: type: string nullable: true LatestMatchResultInfo: type: object required: - matchId - competitionId - competitionName - updatedAt - teams properties: matchId: type: string format: uuid competitionId: type: string format: uuid competitionName: type: string competitionShortName: type: string nullable: true categoryName: type: string nullable: true roundName: type: string nullable: true matchName: type: string nullable: true matchNumber: type: integer nullable: true updatedAt: type: string format: date-time startTime: type: string format: date-time startedAt: type: string format: date-time nullable: true description: "real start, if stamped" teams: type: array items: $ref: '#/components/schemas/MatchResultTeamInfo' MatchResultTeamInfo: type: object required: - teamId - participants - failed - deregistered properties: teamId: type: string format: uuid teamName: type: string nullable: true teamNumber: type: integer nullable: true clubName: type: string nullable: true clubsShort: type: string nullable: true description: "the clubs the athletes of this boat wear, chained in boat order, in short form" clubsFull: type: string nullable: true description: "the same chain with the full club names" place: type: integer ratingCategory: allOf: - $ref: '#/components/schemas/RatingCategoryRefDto' nullable: true description: "the rating category of this boat; null when it has none" categoryPlace: type: integer nullable: true description: "the place within the rating category, counted from 1 - this is the number the result list shows" timeString: type: string failed: type: boolean failedReason: type: string penaltySeconds: type: integer description: "Time penalty in seconds; the result time already includes it" penaltyNote: type: string deregistered: type: boolean deregisteredReason: type: string participants: type: array items: $ref: '#/components/schemas/ParticipantInfo' AthleteBoardStartState: type: string enum: - UNSCHEDULED - COUNTDOWN - SCHEDULED - OVERDUE AthleteBoardParticipant: type: object required: - name properties: name: type: string role: type: string nullable: true year: type: integer nullable: true clubName: type: string nullable: true requirements: type: array items: $ref: '#/components/schemas/AthleteBoardRequirement' description: "only filled for boards with a MATCH_DETAIL tile; server-side restricted to publicly visible requirements applicable to this person's role" AthleteBoardRequirement: type: object description: "a participant requirement on the public announcer tile - deliberately just name and fulfilled state, never internal notes" required: - name - fulfilled properties: name: type: string fulfilled: type: boolean AthleteBoardTeam: type: object required: - startNumber - participants - failed - deregistered properties: startNumber: type: integer description: "starting position in the match, from competition_match_team.start_number (NOT NULL since migration V202507040930)" teamNumber: type: integer nullable: true description: "the nth team of this club in the competition - only shown when teamName is missing" clubsShort: type: string nullable: true description: "the clubs the athletes of this boat wear, chained in boat order, in short form; falls back to the registering club when no crew is recorded" clubsFull: type: string nullable: true description: "the same chain with the full club names" teamName: type: string nullable: true participants: type: array items: $ref: '#/components/schemas/AthleteBoardParticipant' place: type: integer nullable: true description: "partial result of a running match; always null in the upcoming block" timeString: type: string nullable: true description: "partial result of a running match; null means no time yet" penaltySeconds: type: integer nullable: true description: "time penalty in seconds; only stated, never applied - timeString already includes it" penaltyNote: type: string nullable: true failed: type: boolean failedReason: type: string nullable: true deregistered: type: boolean description: "withdrawn from this round. Until 2026-08-14 only the results block carried this; in the upcoming and running blocks a withdrawn boat stood in the line-up like any other. The boat deliberately stays in the list (a crew at the pontoon cannot tell a vanished boat from a display error) and is marked as withdrawn instead" deregisteredReason: type: string nullable: true registeringClub: type: string nullable: true description: "registering club - only filled when a board element requests showRegisteringClub" laps: type: array items: $ref: '#/components/schemas/MatchTeamLapDto' description: "split times from RaceClocker, in mark order; empty when the race records none" startedAt: type: string format: date-time nullable: true description: "measured start of THIS boat (competition_match_team.started_at, individual starts in time trials) - only filled when the board has a MATCH_DETAIL element" AthleteBoardMatch: type: object required: - matchId - competitionName - state - startState - teams - pendingRound - cancelled properties: matchId: type: string format: uuid competitionName: type: string competitionShortName: type: string nullable: true categoryName: type: string nullable: true roundName: type: string nullable: true matchName: type: string nullable: true startTime: type: string format: date-time nullable: true description: "scheduled start" actualStartTime: type: string format: date-time nullable: true description: "real start; only filled in the running block - it carries the clock time for 'started 14:32', while whether the match is at the pontoon or racing is told by state" state: allOf: - $ref: '#/components/schemas/LiveDashboardMatchState' description: "the shared match state, derived by LiveDashboardLogic.deriveMatchState - the same derivation the referee dashboard, the schedule and the execution page read" startState: $ref: '#/components/schemas/AthleteBoardStartState' teams: type: array items: $ref: '#/components/schemas/AthleteBoardTeam' pendingRound: type: boolean description: "true for a placeholder from a waiting timeline slot; teams is then always empty" name: type: string nullable: true description: "name of a FREE placeholder (break/schedule item like a lunch break) - null for real matches and for waiting-round placeholders (pendingRound); only set when the event shows breaks on public boards" cancelled: type: boolean description: "the match is cancelled ('does not take place'). It stays at its planned position in the upcoming block anyway - a crew waiting at the pontoon cannot tell a match that vanished without a trace from a display error. teams is then always empty" nextRoundName: type: string nullable: true description: "name of the following round - only filled when a board element requests showAdvancement" advancingSeats: type: integer nullable: true description: "number of seats in the following round; null when the following round is an open field" bye: allOf: - $ref: '#/components/schemas/MatchByeDto' nullable: true description: "the bye of this match, same derivation as schedule and referee dashboard - public boards need it mainly for must-race byes, where a second line explains why the boat races alone and that its time runs out of competition" AthleteBoardResultTeam: type: object required: - startNumber - failed - deregistered properties: place: type: integer nullable: true ratingCategory: allOf: - $ref: '#/components/schemas/RatingCategoryRefDto' nullable: true description: "the rating category of this boat; null when it has none" categoryPlace: type: integer nullable: true description: "the place within the rating category, counted from 1" startNumber: type: integer description: "starting position in the match, from competition_match_team.start_number (NOT NULL since migration V202507040930)" teamNumber: type: integer nullable: true description: "the nth team of this club in the competition - only shown when teamName is missing" clubsShort: type: string nullable: true description: "the clubs the athletes of this boat wear, chained in boat order, in short form; falls back to the registering club when no crew is recorded" clubsFull: type: string nullable: true description: "the same chain with the full club names" teamName: type: string nullable: true timeString: type: string nullable: true penaltySeconds: type: integer nullable: true description: "time penalty in seconds; only stated, never applied - timeString already includes it" penaltyNote: type: string nullable: true failed: type: boolean failedReason: type: string nullable: true deregistered: type: boolean description: "withdrawn for this round - listed but marked, since such a team has neither place nor time" deregisteredReason: type: string nullable: true laps: type: array items: $ref: '#/components/schemas/MatchTeamLapDto' description: "split times from RaceClocker, in mark order; empty when the race records none" participants: type: array items: $ref: '#/components/schemas/AthleteBoardParticipant' description: "the crew of this boat - always present like on the running card; birth year and worn club stay detail-gated" registeringClub: type: string nullable: true description: "registering club - only filled when a board element requests showRegisteringClub" startedAt: type: string format: date-time nullable: true description: "measured start of THIS boat (competition_match_team.started_at, individual starts in time trials) - only filled when the board has a MATCH_DETAIL element" AthleteBoardResult: type: object required: - matchId - competitionName - teams properties: matchId: type: string format: uuid competitionName: type: string competitionShortName: type: string nullable: true categoryName: type: string nullable: true roundName: type: string nullable: true matchName: type: string nullable: true startTime: type: string format: date-time nullable: true description: "scheduled start" actualStartTime: type: string format: date-time nullable: true description: "real start, if stamped - explains a deviation from the schedule" teams: type: array items: $ref: '#/components/schemas/AthleteBoardResultTeam' BoardMatchSlotDto: type: object description: "One place on the day's timeline. At most one of match and result is set; both empty means the slot exists but is unoccupied" required: - offset properties: offset: type: integer match: allOf: - $ref: '#/components/schemas/AthleteBoardMatch' nullable: true result: allOf: - $ref: '#/components/schemas/AthleteBoardResult' nullable: true BoardListDto: type: object required: - mode - matches - results properties: mode: $ref: '#/components/schemas/BoardListMode' matches: type: array items: $ref: '#/components/schemas/AthleteBoardMatch' results: type: array items: $ref: '#/components/schemas/AthleteBoardResult' program: type: array description: "only filled for mode SCHEDULE: the whole day program from the timeline" items: $ref: '#/components/schemas/BoardProgramEntry' BoardProgramState: type: string enum: - FINISHED - RUNNING - UPCOMING BoardProgramEntry: type: object required: - state properties: startTime: type: string format: date-time nullable: true name: type: string nullable: true description: "schedule item (break) name; null for real matches" competitionName: type: string nullable: true competitionShortName: type: string nullable: true roundName: type: string nullable: true matchName: type: string nullable: true state: $ref: '#/components/schemas/BoardProgramState' AwardCeremonyAthlete: type: object required: - name - role properties: name: type: string role: type: string club: type: string nullable: true description: "home club - only set when it differs from the boat's title line" AwardCeremonyTeam: type: object required: - clubLine - boatLine - athletes properties: clubLine: type: string registeringClub: type: string nullable: true boatLine: type: string time: type: string nullable: true penalty: type: string nullable: true raceLine: type: string nullable: true athletes: type: array items: $ref: '#/components/schemas/AwardCeremonyAthlete' AwardCeremonyRank: type: object required: - rank - shared - first - team properties: rank: type: integer shared: type: boolean first: type: boolean team: $ref: '#/components/schemas/AwardCeremonyTeam' BoardCeremonyDto: type: object description: "the podium of one award ceremony - the same ranks the printed sheet carries" required: - competitionId - competitionIdentifier - competitionName - ranks properties: competitionId: type: string format: uuid ratingCategoryId: type: string format: uuid nullable: true competitionIdentifier: type: string competitionShortName: type: string nullable: true competitionName: type: string ratingCategoryName: type: string nullable: true ranks: type: array items: $ref: '#/components/schemas/AwardCeremonyRank' BoardViewDto: type: object required: - boardId - eventName - serverTime - refreshIntervalSeconds - config - slots - lists properties: boardId: type: string format: uuid eventName: type: string serverTime: type: string format: date-time refreshIntervalSeconds: type: integer config: $ref: '#/components/schemas/BoardConfig' slots: type: array items: $ref: '#/components/schemas/BoardMatchSlotDto' lists: type: array items: $ref: '#/components/schemas/BoardListDto' ceremonies: type: array items: $ref: '#/components/schemas/BoardCeremonyDto' notice: $ref: '#/components/schemas/EventNoticeDto' currentDelaySeconds: type: integer format: int64 nullable: true description: "current delay in seconds: started_at minus start_time of the latest started match; negative = ahead of schedule; null while nothing has started or the board has no DELAY element" MyEventTeamMemberDto: type: object required: - name - self properties: name: type: string role: type: string nullable: true self: type: boolean description: "true for the person this QR code belongs to" MyEventMatchDto: type: object required: - matchId - competitionName - startState - teamMembers - deregistered properties: matchId: type: string format: uuid competitionName: type: string categoryName: type: string nullable: true roundName: type: string nullable: true matchName: type: string nullable: true startTime: type: string format: date-time nullable: true description: "scheduled start" actualStartTime: type: string format: date-time nullable: true description: "real start, if stamped" startState: $ref: '#/components/schemas/AthleteBoardStartState' lane: type: integer nullable: true teamName: type: string nullable: true clubName: type: string nullable: true teamMembers: type: array items: $ref: '#/components/schemas/MyEventTeamMemberDto' deregistered: type: boolean description: "withdrawn - shown without countdown, even before the match becomes a public result" deregisteredReason: type: string nullable: true MyEventResultDto: type: object required: - matchId - competitionName - failed - deregistered properties: matchId: type: string format: uuid teamId: type: string format: uuid nullable: true description: "The own boat's registration - matches teamId of the teams in /latest-match-results, used to mark the own boat in the full field" competitionName: type: string categoryName: type: string nullable: true roundName: type: string nullable: true matchName: type: string nullable: true startTime: type: string format: date-time nullable: true actualStartTime: type: string format: date-time nullable: true place: type: integer nullable: true timeString: type: string nullable: true penaltySeconds: type: integer nullable: true penaltyNote: type: string nullable: true failed: type: boolean failedReason: type: string nullable: true deregistered: type: boolean deregisteredReason: type: string nullable: true MyEventRegistrationDto: type: object required: - competitionId - competitionIdentifier - competitionName properties: competitionId: type: string format: uuid competitionIdentifier: type: string competitionName: type: string categoryName: type: string nullable: true teamName: type: string nullable: true role: type: string nullable: true MyEventRequirementScopeDto: type: object required: - fulfilled properties: competitionName: type: string nullable: true eventDayDate: type: string format: date nullable: true fulfilled: type: boolean checkFrom: type: string format: date-time nullable: true checkUntil: type: string format: date-time nullable: true MyEventRequirementDto: type: object required: - id - name - optional - fulfilled properties: id: type: string format: uuid name: type: string publicNote: type: string nullable: true description: "Public, athlete-facing text. The internal description is deliberately never delivered here." optional: type: boolean fulfilled: type: boolean scopes: type: array description: >- Aufschluesselung, sobald die Bedingung je Tag oder je Wettkampf gilt - je Rahmen eine Zeile. Leer bei einer Bedingung ohne Schalter. items: $ref: '#/components/schemas/MyEventRequirementScopeDto' checkFrom: type: string format: date-time nullable: true description: "Earliest moment the requirement can be checked - first future start minus checkEarliestMinutesBefore; null without a window or a future start" checkUntil: type: string format: date-time nullable: true description: "Latest moment, analogous from checkLatestMinutesBefore" MyEventDto: type: object required: - displayName - eventName - serverTime - refreshIntervalSeconds - running - upcoming - results - unscheduled - requirements properties: displayName: type: string clubName: type: string nullable: true eventName: type: string serverTime: type: string format: date-time refreshIntervalSeconds: type: integer running: type: array items: $ref: '#/components/schemas/MyEventMatchDto' upcoming: type: array items: $ref: '#/components/schemas/MyEventMatchDto' results: type: array items: $ref: '#/components/schemas/MyEventResultDto' unscheduled: type: array items: $ref: '#/components/schemas/MyEventRegistrationDto' requirements: type: array items: $ref: '#/components/schemas/MyEventRequirementDto' notice: $ref: '#/components/schemas/EventNoticeDto' LiveMatchInfo: type: object description: >- A match in the "live" tab of the public results page - either activated or upcoming. The state is carried by `status` alone; there is deliberately no `activatedAt` or `finishedAt` next to it, so the display cannot derive a second truth of its own. required: - matchId - competitionName - status - executionOrder - teams properties: matchId: type: string format: uuid competitionId: type: string format: uuid nullable: true description: Null for a programme placeholder (FREE slot), which belongs to no competition. competitionName: type: string categoryName: type: string nullable: true roundName: type: string nullable: true matchName: type: string nullable: true startTime: type: string format: date-time nullable: true status: $ref: '#/components/schemas/MatchStatusDto' executionOrder: type: integer cancelled: type: boolean default: false description: >- The match does not take place. It stays in the list on purpose - a match that vanishes without a trace is indistinguishable from a display error. `teams` is empty then. pendingRound: type: boolean default: false description: Placeholder for a round that has not been created yet; `teams` is empty then. name: type: string nullable: true description: Name of a programme item (FREE slot such as "lunch break"), null for real matches. teams: type: array items: $ref: '#/components/schemas/RunningMatchTeamInfo' LiveMatchesDto: type: object description: >- Response of the public results page's "live" tab. Used to be a bare array of LiveMatchInfo; the envelope carries the event-wide notice banner - this tab is the only polled answer of the public results page. required: - matches properties: notice: $ref: '#/components/schemas/EventNoticeDto' matches: type: array items: $ref: '#/components/schemas/LiveMatchInfo' RunningMatchInfo: type: object required: - matchId - competitionId - competitionName - executionOrder - teams properties: matchId: type: string format: uuid matchNumber: type: integer nullable: true competitionId: type: string format: uuid competitionName: type: string competitionShortName: type: string nullable: true categoryName: type: string nullable: true startTime: type: string format: date-time nullable: true startedAt: type: string format: date-time nullable: true description: "real start; null means the match is marked as current but has not started yet" elapsedMinutes: type: integer format: int64 nullable: true placeName: type: string nullable: true roundNumber: type: integer nullable: true roundName: type: string nullable: true matchName: type: string nullable: true executionOrder: type: integer teams: type: array items: $ref: '#/components/schemas/RunningMatchTeamInfo' LiveDashboardMatchState: type: string description: >- SKIPPED: the schedule slot of this match was cancelled. Unlike the public boards the referee dashboard marks such a match instead of hiding it - the referee has to see the cancellation to be able to undo it in the schedule. AWAITING_FINISH: every boat is scored but nobody finished the match yet. FINISHED means exclusively that competition_match.finished_at is set - a match only ends by an explicit action, because until then a time penalty can still arrive. PREPARING: the match has been called to the start (activated_at is set) but has no real start yet - the boats are still at the pontoon. RUNNING means activated AND started. enum: - PREPARING - RUNNING - FINISHED - SKIPPED - AWAITING_FINISH - UPCOMING - UNSCHEDULED LiveDashboardInvoiceState: type: string enum: - PAID - OPEN - NONE TimeCheckStatus: type: string enum: - OK - TOO_EARLY - LATE - NOT_CHECKED CheckSeverity: type: string description: "What can be configured per competition for a failed check" enum: - OK - WARNING - CRITICAL EffectiveSeverity: type: string description: "What is delivered for display; NEUTRAL means there is nothing to say about this check - either it does not apply, or it failed but is explicitly configured as CheckSeverity.OK" enum: - NEUTRAL - OK - WARNING - CRITICAL TimeCheckDto: type: object required: - status properties: deltaMinutes: type: integer format: int64 nullable: true status: $ref: '#/components/schemas/TimeCheckStatus' referenceStartTime: type: string format: date-time nullable: true description: >- Der Start, gegen den gerechnet wurde. Bei einer Bedingung je Tag und/oder je Wettkampf ist das der ERSTE Lauf dieses Rahmens, nicht der gerade gezeigte Lauf. referenceIsFrameStart: type: boolean description: >- true, wenn referenceStartTime ein anderer Lauf ist als der gezeigte - dann muss die Ansicht dazusagen, worauf sich die Abweichung bezieht. LiveDashboardRequirementStatusDto: type: object required: - requirementId - name - optional - checked - severity properties: requirementId: type: string format: uuid name: type: string description: type: string nullable: true optional: type: boolean checked: type: boolean checkedAt: type: string format: date-time nullable: true note: type: string nullable: true timeCheck: nullable: true allOf: - $ref: '#/components/schemas/TimeCheckDto' severity: $ref: '#/components/schemas/EffectiveSeverity' LiveDashboardParticipantDto: type: object required: - participantId - firstName - lastName - requirements properties: participantId: type: string format: uuid firstName: type: string lastName: type: string namedRole: type: string nullable: true year: type: integer nullable: true gender: type: string nullable: true clubName: type: string nullable: true description: "The club this person wears - the free text of a guest rower, otherwise the name of their own club. Not the registering club, which is the same for the whole team" substitutedFor: type: string nullable: true description: "Name of the participant this one replaced when substituted into the round" substitutionReason: type: string nullable: true requirements: type: array items: $ref: '#/components/schemas/LiveDashboardRequirementStatusDto' trackingStatus: $ref: '#/components/schemas/ParticipantScanType' trackingAt: type: string format: date-time nullable: true LiveDashboardCrewMemberDto: type: object required: - lastName properties: lastName: type: string clubShort: type: string nullable: true description: "Short form of the club this person wears - the same rule as the chain in clubsShort" role: type: string nullable: true description: "Abbreviated role, e.g. Ste. for Steuerleute" LiveDashboardTeamDto: type: object required: - teamId - clubsShort - clubsFull - failed - deregistered - invoiceState - severity - invoiceSeverity - inArenaRequired - inArenaSeverity - substituted properties: teamId: type: string format: uuid teamName: type: string nullable: true clubName: type: string nullable: true description: "The registering club. Kept because it carries the invoice; no display uses it any more" clubsShort: type: string description: "The clubs of the crew in boat order, short forms, joined by ' / '" clubsFull: type: string description: "The same chain in full club names" crew: type: array nullable: true description: "The crew in short form; only filled when the request asked for it with crew=true" items: $ref: '#/components/schemas/LiveDashboardCrewMemberDto' startNumber: type: integer nullable: true place: type: integer nullable: true ratingCategory: allOf: - $ref: '#/components/schemas/RatingCategoryRefDto' nullable: true description: "the rating category of this team; null when it has none" categoryPlace: type: integer nullable: true description: "the place within the rating category, counted from 1" time: type: string nullable: true startedAt: type: string format: date-time nullable: true description: "The measured start of this boat from the timing tooling - answers 'who is already under way?' in individual-start time trials while no finish time exists yet" failed: type: boolean failedReason: type: string nullable: true penaltySeconds: type: integer nullable: true penaltyNote: type: string nullable: true deregistered: type: boolean deregisteredReason: type: string nullable: true invoiceState: $ref: '#/components/schemas/LiveDashboardInvoiceState' severity: $ref: '#/components/schemas/EffectiveSeverity' description: "Final severity for the row - the evaluation rules live in the backend" invoiceSeverity: $ref: '#/components/schemas/EffectiveSeverity' description: "The invoice evaluated separately: the detail dialog colors its invoice chip by this; it cannot be recovered from severity, which already combines everything else" inArenaRequired: type: boolean description: "Whether this competition requires check-in/check-out at all; controls the display of inArenaAt" inArenaSeverity: $ref: '#/components/schemas/EffectiveSeverity' description: "The in-arena check evaluated separately: the detail dialog colors its arena chip by this; it cannot be recovered from severity, which already combines everything else" substituted: type: boolean inArenaAt: type: string format: date-time nullable: true description: "When the boat entered the arena (latest check-in scan, only if the whole known crew is checked in); null while at least one crew member is not checked in or no crew is known" laps: type: array items: $ref: '#/components/schemas/MatchTeamLapDto' description: "split times from RaceClocker, in mark order; empty when the race records none" notes: type: array items: $ref: '#/components/schemas/MatchTeamNoteDto' description: "referee notes on this boat, oldest first - communication between referees, not scoring; only part of this internal poll, never of the public endpoints" MatchTeamNoteDto: type: object description: "A referee note on a boat in a match ('touched a buoy'). Append-only: entries are immutable, a correction is delete plus re-add." required: - id - note - createdAt properties: id: type: string format: uuid note: type: string createdAt: type: string format: date-time author: type: string nullable: true description: "display name of the author; null when the account was deleted" MatchTeamNoteRequest: type: object required: - note properties: note: type: string description: "must not be blank" LiveDashboardTeamDetailDto: type: object required: - teamId - participants properties: teamId: type: string format: uuid participants: type: array items: $ref: '#/components/schemas/LiveDashboardParticipantDto' LiveDashboardMatchDto: type: object required: - matchId - state - competitionId - competitionName - executionOrder - teams properties: matchId: type: string format: uuid state: allOf: - $ref: '#/components/schemas/LiveDashboardMatchState' description: >- The derived match state - the card's only statement about where the match stands. A separate running flag stood next to it until 2026-08-09; since "at the start" and "under way" are two states, a second field would only be a second truth. bye: allOf: - $ref: '#/components/schemas/MatchByeDto' nullable: true description: Set when this match is a bye - the referee dashboard shows the reason below the match. competitionId: type: string format: uuid competitionName: type: string competitionShortName: type: string nullable: true description: "The competition's short name (Kurzname, e.g. 'CM 4x+')" competitionIdentifier: type: string nullable: true description: "The competition's race number (Rennnummer) - shown together with the short name when the board is set to short labels" categoryName: type: string nullable: true roundName: type: string nullable: true matchName: type: string nullable: true executionOrder: type: integer startTime: type: string format: date-time nullable: true startedAt: type: string format: date-time nullable: true elapsedMinutes: type: integer format: int64 nullable: true teams: type: array items: $ref: '#/components/schemas/LiveDashboardTeamDto' raceClockerPollError: type: string nullable: true description: Error code of the last failed automatic pull, null when it is fine. raceClockerAutoPausedAt: type: string format: date-time nullable: true description: Set while the automatic pull leaves this match alone because results were entered by hand. pairingsRecalculatedAt: type: string format: date-time nullable: true description: "Set while this match's pairing comes from a recalculation and the match has not been called to the start yet" PendingSlotDto: type: object description: "A placeholder in the live dashboard timeline - either a waiting match slot (round not yet materialized) or a FREE slot/program item (e.g. lunch break). Deliberately without team/participant data, since neither kind has any yet. 'name' distinguishes the cases: set for program items, null for match placeholders." required: - slotId - startTime properties: slotId: type: string format: uuid startTime: type: string format: date-time name: type: string nullable: true competitionName: type: string nullable: true competitionShortName: type: string nullable: true description: "The competition's short name (Kurzname) - null for program items" competitionIdentifier: type: string nullable: true description: "The competition's race number (Rennnummer) - null for program items" roundName: type: string nullable: true matchName: type: string nullable: true LiveDashboardDto: type: object required: - matches - pendingSlots - chainProgressionMode properties: matches: type: array items: $ref: '#/components/schemas/LiveDashboardMatchDto' pendingSlots: type: array description: "Ascending by start time; included in both scopes (ALL and LIVE) - the list is small" items: $ref: '#/components/schemas/PendingSlotDto' chainProgressionMode: $ref: '#/components/schemas/ChainProgressionMode' notice: $ref: '#/components/schemas/EventNoticeDto' CheckType: type: string description: >- The checks evaluated by the referee dashboard. REQUIREMENT and REQUIREMENT_TIME_WINDOW refer to the same participant requirement and are still configured separately: "not checked at all" and "checked but at the wrong time" are two different situations at the tent. enum: - INVOICE_OPEN - NOT_IN_ARENA - REQUIREMENT - REQUIREMENT_TIME_WINDOW CheckSeverityCompetitionDto: type: object description: "A competition as the administration needs it - id, name and whether it requires check-in/check-out" required: - competitionId - identifier - name - checkInOutRequired properties: competitionId: type: string format: uuid identifier: type: string name: type: string checkInOutRequired: type: boolean CheckSeverityRowDto: type: object description: "A row of the administration matrix. requirementId is only set for the requirement checks, name carries the requirement's name for them - the UI names the two fixed checks itself." required: - checkType properties: checkType: $ref: '#/components/schemas/CheckType' requirementId: type: string format: uuid nullable: true name: type: string nullable: true CheckSeverityRowDefaultDto: type: object required: - checkType - severity properties: checkType: $ref: '#/components/schemas/CheckType' requirementId: type: string format: uuid nullable: true severity: $ref: '#/components/schemas/CheckSeverity' CheckSeverityEntryDto: type: object required: - competitionId - checkType - severity properties: competitionId: type: string format: uuid checkType: $ref: '#/components/schemas/CheckType' requirementId: type: string format: uuid nullable: true severity: $ref: '#/components/schemas/CheckSeverity' CheckSeverityConfigDto: type: object description: "entries contains ONLY deviations from the default. The UI shows, for every combination of competitions and rows, the matching entry or the default from defaults." required: - competitions - rows - defaults - entries properties: competitions: type: array items: $ref: '#/components/schemas/CheckSeverityCompetitionDto' rows: type: array items: $ref: '#/components/schemas/CheckSeverityRowDto' defaults: type: array items: $ref: '#/components/schemas/CheckSeverityRowDefaultDto' entries: type: array items: $ref: '#/components/schemas/CheckSeverityEntryDto' UpdateCheckSeverityRequest: type: object required: - entries properties: entries: type: array items: $ref: '#/components/schemas/CheckSeverityEntryDto' EventScheduleSlotState: type: string enum: - FREE - WAITING - LINKED - OBSOLETE - SKIPPED EventScheduleSlotDto: type: object required: - id - startTime - state - matchTeamsTotal - matchTeamsScored - matchTeamsRaced - matchTeamsDeregistered properties: id: type: string format: uuid startTime: type: string format: date-time state: $ref: '#/components/schemas/EventScheduleSlotState' name: type: string nullable: true durationMinutes: type: integer nullable: true competitionId: type: string format: uuid nullable: true competitionName: type: string nullable: true competitionShortName: type: string nullable: true description: "The competition's short name (Kurzname, e.g. 'CM 4x+') - shown in front of the slot label in the schedule tab" competitionIdentifier: type: string nullable: true description: "The competition's race number (Rennnummer, e.g. '17-NC') - shown in front of the slot label in the schedule tab" roundName: type: string nullable: true matchName: type: string nullable: true matchId: type: string format: uuid nullable: true setupMatchId: type: string format: uuid nullable: true setupRoundId: type: string format: uuid nullable: true matchStartedAt: type: string format: date-time nullable: true matchFinishedAt: type: string format: date-time nullable: true matchActivatedAt: type: string format: date-time nullable: true description: "When the linked match was called to the start - drives whether the schedule tab offers 'activate' or 'finish' for a LINKED slot, and together with matchStartedAt whether the slot reads 'preparing' or 'running'. Null without a linked match." matchTeamsTotal: type: integer description: "Teams of the linked match that are still in the race (without the OUT rows carried over from the previous round) - 0 without a linked match" matchTeamsScored: type: integer description: "Of those, settled: place set OR failed OR deregistered - the same rule the referee dashboard uses. Carries 'all scored' (AWAITING_FINISH), NOT the 'partially scored' reading" matchTeamsRaced: type: integer description: "Of those, actually raced: place set OR failed, withdrawals excluded. Together with matchTeamsTotal and matchTeamsDeregistered this reads as 'partially scored n/m'; it is explicitly not a state of its own" matchTeamsDeregistered: type: integer description: "Of those, withdrawn from this round - a plain statement shown as a second, quiet chip; it never decides a state" bye: allOf: - $ref: '#/components/schemas/MatchByeDto' nullable: true description: Set when the linked match is a bye - null for free slots and slots whose round is not materialized yet. UnplannedSetupMatchDto: type: object description: "A setup round of the event with no schedule slot yet" required: - setupMatchId - competitionId - competitionName - roundName properties: setupMatchId: type: string format: uuid competitionId: type: string format: uuid competitionName: type: string competitionShortName: type: string nullable: true description: "The competition's short name (Kurzname)" competitionIdentifier: type: string nullable: true description: "The competition's race number (Rennnummer)" roundName: type: string matchName: type: string nullable: true matchActivatedAt: type: string format: date-time nullable: true description: "Match state, present once the round is materialized - mostly relevant for permanent byes whose open/acknowledged state should be visible in the schedule" matchStartedAt: type: string format: date-time nullable: true matchFinishedAt: type: string format: date-time nullable: true bye: allOf: - $ref: '#/components/schemas/MatchByeDto' nullable: true EventScheduleDto: type: object required: - slots - unplannedSetupMatches - chainProgressionMode properties: slots: type: array items: $ref: '#/components/schemas/EventScheduleSlotDto' unplannedSetupMatches: type: array items: $ref: '#/components/schemas/UnplannedSetupMatchDto' chainProgressionMode: $ref: '#/components/schemas/ChainProgressionMode' UpsertScheduleSlotRequest: type: object description: "Exactly one of competitionSetupMatch (round slot) or name (free slot) must be set, never both and never neither" required: - startTime properties: startTime: type: string format: date-time competitionSetupMatch: type: string format: uuid nullable: true name: type: string nullable: true durationMinutes: type: integer nullable: true ShiftMode: type: string enum: - PLUS_MINUTES - SET_TIME - COMPRESS_TO_TARGET - PLUS_MINUTES_RANGE ShiftScheduleRequest: type: object description: >- Field combination depends on mode: PLUS_MINUTES needs only minutes, SET_TIME only newTime, COMPRESS_TO_TARGET needs targetSlotId plus exactly one of the two, PLUS_MINUTES_RANGE needs minutes plus targetSlotId (the upper bound of the shifted range). required: - fromSlotId - mode - dryRun properties: fromSlotId: type: string format: uuid mode: $ref: '#/components/schemas/ShiftMode' minutes: type: integer format: int64 nullable: true newTime: type: string format: date-time nullable: true targetSlotId: type: string format: uuid nullable: true dryRun: type: boolean AdvanceScheduleRequest: type: object description: >- Only the target slot: start slot and delta are derived from the cancelled slot by the server. required: - targetSlotId - dryRun properties: targetSlotId: type: string format: uuid dryRun: type: boolean ShiftPreviewEntryDto: type: object required: - slotId - oldStartTime - newStartTime properties: slotId: type: string format: uuid oldStartTime: type: string format: date-time newStartTime: type: string format: date-time ShiftPreviewDto: type: object required: - entries - applied properties: entries: type: array items: $ref: '#/components/schemas/ShiftPreviewEntryDto' applied: type: boolean ImportRowStatus: type: string description: >- FREE, COMPETITION_NOT_FOUND and MATCH_NOT_FOUND all end up as a free slot; only FREE is intentional, the other two point at a mistake in the file. enum: - LINKED - FREE - COMPETITION_NOT_FOUND - MATCH_NOT_FOUND - AMBIGUOUS - DUPLICATE ImportRowResultDto: type: object description: "A row for the preview UI. targetLabel is only set for LINKED rows (\"competitionName – roundName – matchName\"), null otherwise." required: - rowNumber - startTime - laufText - status - availableMatches properties: rowNumber: type: integer startTime: type: string format: date-time competitionText: type: string nullable: true laufText: type: string status: $ref: '#/components/schemas/ImportRowStatus' targetLabel: type: string nullable: true availableMatches: type: array description: "Only filled for MATCH_NOT_FOUND: the match names the found competition actually has." items: type: string ScheduleImportResultDto: type: object required: - rows - applied properties: rows: type: array items: $ref: '#/components/schemas/ImportRowResultDto' applied: type: boolean RunningMatchTeamInfo: type: object required: - teamId - startNumber - participants - failed properties: teamId: type: string format: uuid teamName: type: string nullable: true teamNumber: type: integer nullable: true startNumber: type: integer description: "starting position in the match, from competition_match_team.start_number (NOT NULL since migration V202507040930)" clubName: type: string nullable: true clubsShort: type: string nullable: true description: "the clubs the athletes of this boat wear, chained in boat order, in short form" clubsFull: type: string nullable: true description: "the same chain with the full club names" currentScore: type: integer nullable: true currentPosition: type: integer nullable: true timeString: type: string nullable: true description: "partial result of a running match; null means no time yet" penaltySeconds: type: integer nullable: true description: "time penalty in seconds; only stated, never applied - timeString already includes it" penaltyNote: type: string nullable: true failed: type: boolean failedReason: type: string nullable: true participants: type: array items: $ref: '#/components/schemas/UpcomingMatchParticipantInfo' ProduceInvoicesRequest: type: object required: - type properties: type: $ref: '#/components/schemas/RegistrationInvoiceType' RatingCategoryRequest: type: object required: - name properties: name: type: string description: type: string RatingCategoryDto: type: object required: - id - name properties: id: type: string format: uuid name: type: string description: type: string RatingCategoryToEventRequest: type: object required: - ratingCategory properties: ratingCategory: type: string format: uuid yearFrom: type: integer minimum: 1900 maximum: 2100 yearTo: type: integer minimum: 1900 maximum: 2100 RatingCategoriesToEventRequest: type: object required: - ratingCategories properties: ratingCategories: type: array items: $ref: '#/components/schemas/RatingCategoryToEventRequest' RatingCategoryToEventDto: type: object required: - ratingCategory - sortOrder properties: ratingCategory: $ref: '#/components/schemas/RatingCategoryDto' yearFrom: type: integer yearTo: type: integer sortOrder: type: integer description: >- Stelle dieser Kategorie in den Ergebnisabschnitten der Veranstaltung, aufsteigend ab 0. RatingCategoryOrderRequest: type: object required: - ratingCategories properties: ratingCategories: type: array description: >- Die vollständige Reihenfolge der Wertungskategorien von vorne nach hinten. Nicht genannte, aber zugeordnete Kategorien rutschen dahinter. items: type: string format: uuid RatingCategoryRefDto: type: object description: >- Die Wertungskategorie eines Bootes in einer Ergebnisliste - zum Gruppieren, Anzeigen und Sortieren der Abschnitte. required: - id - name - sortOrder properties: id: type: string format: uuid name: type: string sortOrder: type: integer ResultChallengeClubDto: type: object required: - id - clubName - totalRank - totalResult - relativeRank - relativeResult - teams properties: id: type: string format: uuid clubName: type: string totalRank: type: integer totalResult: type: integer relativeRank: type: integer relativeResult: type: integer teams: type: array items: $ref: '#/components/schemas/ResultChallengeClubTeamDto' ResultChallengeClubTeamDto: type: object required: - competitionRegistrationId - competitionRegistrationName - result - competitionId - competitionIdentifier - competitionName - namedParticipants properties: competitionRegistrationId: type: string format: uuid competitionRegistrationName: type: string nullable: true result: type: integer competitionId: type: string format: uuid competitionIdentifier: type: string competitionName: type: string namedParticipants: type: array items: $ref: '#/components/schemas/ResultChallengeClubNamedParticipantDto' ratingCategoryDto: $ref: '#/components/schemas/RatingCategoryDto' ResultChallengeClubNamedParticipantDto: type: object required: - id - name - participants properties: id: type: string format: uuid name: type: string participants: type: array items: $ref: '#/components/schemas/ResultChallengeClubParticipantDto' ResultChallengeClubParticipantDto: type: object required: - id - firstName - lastName - gender - year - external properties: id: type: string format: uuid firstName: type: string lastName: type: string gender: $ref: '#/components/schemas/Gender' year: type: integer external: type: boolean externalClubName: type: string ResultChallengeParticipantDto: type: object required: - id - firstName - lastName - rank - result - clubId - clubName - teams properties: id: type: string format: uuid firstName: type: string lastName: type: string rank: type: integer result: type: integer clubId: type: string format: uuid clubName: type: string teams: type: array items: $ref: '#/components/schemas/ResultChallengeParticipantTeamDto' ResultChallengeParticipantTeamDto: type: object required: - competitionRegistrationId - competitionRegistrationName - result - competitionId - competitionIdentifier - competitionName properties: competitionRegistrationId: type: string format: uuid competitionRegistrationName: type: string nullable: true result: type: integer competitionId: type: string format: uuid competitionIdentifier: type: string competitionName: type: string ratingCategoryDto: $ref: '#/components/schemas/RatingCategoryDto' MatchResultImportConfigRequest: type: object required: - name - colTeamRegistrationId properties: name: type: string colTeamStartNumber: type: string colTeamRegistrationId: type: string description: Header of the column carrying the stable team identifier (competition registration id). Must map to a pass-through field of the timing tooling (e.g. Webscorer "Info 1"). colTeamPlace: type: string colTeamTime: type: string MatchResultImportConfigDto: type: object required: - id - name - colTeamRegistrationId properties: id: type: string format: uuid name: type: string colTeamStartNumber: type: string colTeamRegistrationId: type: string colTeamPlace: type: string colTeamTime: type: string EventInvoicesInfoDto: type: object required: - totalAmount - paidAmount - producing properties: totalAmount: type: string format: decimal paidAmount: type: string format: decimal producing: type: boolean CatererTransactionViewDto: type: object required: - id - catererId - catererFirstname - catererLastname - appUserId - userFirstname - userLastname - eventId - price - createdAt properties: id: type: string format: uuid catererId: type: string format: uuid catererFirstname: type: string catererLastname: type: string appUserId: type: string format: uuid userFirstname: type: string userLastname: type: string eventId: type: string format: uuid price: type: string format: decimal createdAt: type: string format: date-time CatererTransactionRequest: type: object required: - appUserId - eventId - price properties: appUserId: type: string format: uuid price: type: string format: decimal eventId: type: string format: uuid QrCodeParticipantResponse: type: object required: [ firstname, lastname, uuid, qrCodeId, eventId ] properties: firstname: { type: string } lastname: { type: string } id: { type: string, format: uuid } qrCodeId: { type: string } eventId: { type: string } type: { $ref: '#/components/schemas/QrCodeDtoType' } clubName: { type: string, nullable: true } competitions: type: array items: type: string QrCodeAppuserResponse: type: object required: [ firstname, lastname, uuid, qrCodeId, eventId ] properties: firstname: { type: string } lastname: { type: string } id: { type: string, format: uuid } qrCodeId: { type: string } eventId: { type: string } type: { $ref: '#/components/schemas/QrCodeDtoType' } clubName: { type: string, nullable: true } QrCodePublicResponse: type: object required: [ eventId ] properties: eventId: { type: string, format: uuid } type: { $ref: '#/components/schemas/QrCodeDtoType' } QrCodeAppuserUpdate: type: object required: [ id, qrCodeId, eventId ] properties: id: type: string format: uuid qrCodeId: type: string eventId: type: string format: uuid QrCodeParticipantUpdate: type: object required: [ id, qrCodeId, eventId ] properties: id: type: string format: uuid qrCodeId: type: string eventId: type: string format: uuid QrCodeDtoType: type: string enum: [ Participant, User ] # Team Tracking schemas ParticipantScanType: type: string enum: - ENTRY - EXIT TeamForScanOverviewDto: type: object required: - competitionRegistrationId - competitionId - competitionIdentifier - competitionName - checkInOutRequired - clubId - clubName - participants properties: competitionRegistrationId: type: string format: uuid competitionId: type: string format: uuid competitionIdentifier: type: string competitionName: type: string checkInOutRequired: type: boolean description: "Whether this competition uses check-in/out at all. Scans are recorded per participant and event, so a participant racing in one competition that requires it still checks out - the flag only drives what the app shows." clubId: type: string format: uuid clubName: type: string teamName: type: string participants: type: array items: $ref: '#/components/schemas/TeamParticipantDto' TeamParticipantDto: type: object required: - participantId - firstName - lastName - year - gender - external - roleId - role properties: participantId: type: string format: uuid firstName: type: string lastName: type: string year: type: integer gender: $ref: '#/components/schemas/Gender' external: type: boolean externalClubName: type: string roleId: type: string format: uuid role: type: string currentStatus: $ref: '#/components/schemas/ParticipantScanType' lastScanAt: type: string format: date-time ParticipantTrackingDto: type: object required: - id - eventId - participantId - firstName - lastName - year - gender - clubId - clubName - external - source - editCount properties: id: type: string format: uuid eventId: type: string format: uuid participantId: type: string format: uuid firstName: type: string lastName: type: string year: type: integer gender: $ref: '#/components/schemas/Gender' clubId: type: string format: uuid clubName: type: string external: type: boolean externalClubName: type: string scanType: $ref: '#/components/schemas/ParticipantScanType' scannedAt: type: string format: date-time lastScanBy: $ref: '#/components/schemas/AppUserNameDto' source: $ref: '#/components/schemas/ParticipantTrackingSource' editCount: type: integer ParticipantTrackingSource: type: string enum: - QR - MANUAL ParticipantTrackingChangeType: type: string enum: - CREATE - UPDATE ManualTrackingRequest: type: object required: - scanType - scannedAt - reason properties: scanType: $ref: '#/components/schemas/ParticipantScanType' scannedAt: type: string format: date-time reason: type: string ParticipantTrackingEntryDto: type: object required: - id - scanType - scannedAt - source - editCount properties: id: type: string format: uuid scanType: $ref: '#/components/schemas/ParticipantScanType' scannedAt: type: string format: date-time source: $ref: '#/components/schemas/ParticipantTrackingSource' recordedBy: $ref: '#/components/schemas/AppUserNameDto' editCount: type: integer lastEditedAt: type: string format: date-time nullable: true lastEditedBy: $ref: '#/components/schemas/AppUserNameDto' ParticipantTrackingChangeDto: type: object required: - id - changeType - newScanType - newScannedAt - reason - createdAt properties: id: type: string format: uuid trackingId: type: string format: uuid nullable: true changeType: $ref: '#/components/schemas/ParticipantTrackingChangeType' previousScanType: $ref: '#/components/schemas/ParticipantScanType' previousScannedAt: type: string format: date-time nullable: true newScanType: $ref: '#/components/schemas/ParticipantScanType' newScannedAt: type: string format: date-time reason: type: string createdAt: type: string format: date-time createdBy: $ref: '#/components/schemas/AppUserNameDto' ParticipantTrackingHistoryDto: type: object required: - entries - changes properties: entries: type: array items: $ref: '#/components/schemas/ParticipantTrackingEntryDto' changes: type: array items: $ref: '#/components/schemas/ParticipantTrackingChangeDto' ParticipantQrAssignmentDto: type: object required: - participantId - firstname - lastname - namedParticipantName properties: participantId: type: string firstname: type: string lastname: type: string qrCodeValue: type: string nullable: true namedParticipantName: type: string GroupedParticipantQrAssignmentDto: type: object required: - competitionRegistrationId - competitionRegistrationName - competitionName - participants properties: competitionRegistrationId: type: string format: uuid competitionRegistrationName: type: string format: uuid competitionName: type: string participants: type: array items: $ref: '#/components/schemas/ParticipantQrAssignmentDto' CompetitionChoiceDto: type: object required: - id - identifier - name properties: id: type: string format: uuid identifier: type: string name: type: string shortName: type: string category: type: string AppUserForEventDto: type: object required: - id - firstname - lastname - email properties: id: type: string format: uuid firstname: type: string lastname: type: string email: type: string club: type: string format: uuid qrCodeId: type: string CompetitionForExportDto: type: object required: - id - identifier - name properties: id: type: string format: uuid identifier: type: string name: type: string EventForExportDto: type: object required: - id - name - competitions properties: id: type: string format: uuid name: type: string competitions: type: array items: $ref: '#/components/schemas/CompetitionForExportDto' WebDAVExportRequest: type: object required: - name - events - selectedDatabaseExports properties: name: type: string events: type: array items: $ref: '#/components/schemas/WebDAVExportEventRequest' selectedDatabaseExports: type: array items: $ref: '#/components/schemas/WebDAVExportType' WebDAVExportEventRequest: type: object required: - eventId - selectedExports - selectedCompetitions eventId: type: string format: uuid selectedExports: type: array items: $ref: '#/components/schemas/WebDAVExportType' selectedCompetitions: type: array items: type: string format: uuid FileExportEventStatusDto: type: object required: - eventName - fileExportTypes properties: eventName: type: string fileExportTypes: type: array items: $ref: '#/components/schemas/WebDAVExportType' WebDAVExportStatusDto: type: object required: - processId - exportFolderName - exportInitializedAt - dataExportEvents - fileExportEvents - filesExported - totalFilesToExport - filesWithError - dataExported - totalDataToExport - dataWithError properties: processId: type: string format: uuid exportFolderName: type: string exportInitializedAt: type: string format: date-time exportInitializedBy: $ref: '#/components/schemas/AppUserNameDto' dataExportEvents: type: array items: type: string nullable: true fileExportEvents: type: array items: $ref: '#/components/schemas/FileExportEventStatusDto' nullable: true filesExported: type: integer totalFilesToExport: type: integer filesWithError: type: integer dataExported: type: integer totalDataToExport: type: integer dataWithError: type: integer WebDAVImportStatusDto: type: object required: - processId - importFolderName - importInitializedAt - dataImported - totalDataToImport - dataWithError properties: processId: type: string format: uuid importFolderName: type: string importInitializedAt: type: string format: date-time importInitializedBy: $ref: '#/components/schemas/AppUserNameDto' dataImported: type: integer totalDataToImport: type: integer dataWithError: type: integer WebDAVImportOptionsDto: type: object required: - data - events properties: data: type: array items: $ref: '#/components/schemas/WebDAVExportType' events: type: array items: $ref: '#/components/schemas/WebDAVImportOptionsEventDto' WebDAVImportOptionsEventDto: type: object required: - eventId - eventFolderName - competitions properties: eventId: type: string format: uuid eventFolderName: type: string competitions: type: array items: $ref: '#/components/schemas/WebDAVImportOptionsCompetitionDto' WebDAVImportOptionsCompetitionDto: type: object required: - competitionId - competitionFolderName properties: competitionId: type: string format: uuid competitionFolderName: type: string WebDAVImportRequest: type: object required: - folderName - selectedData - selectedEvents properties: folderName: type: string selectedData: type: array items: $ref: '#/components/schemas/WebDAVExportType' selectedEvents: type: array items: $ref: '#/components/schemas/WebDAVImportEventRequest' WebDAVImportEventRequest: type: object required: - eventFolderName - competitionFolderNames properties: eventFolderName: type: string competitionFolderNames: type: array items: type: string CompetitionChallengeResultRequest: type: object required: - result properties: result: type: integer EmailTemplateKey: type: string enum: - USER_REGISTRATION - USER_INVITATION - USER_RESET_PASSWORD - EVENT_REGISTRATION_CONFIRMATION - EVENT_REGISTRATION_INVOICE - PARTICIPANT_CHALLENGE_REGISTERED - CERTIFICATE_OF_PARTICIPATION_PARTICIPANT - CLUB_REPRESENTATIVE_APPROVAL_REQUESTED - COMPETITION_REGISTRATION_EDITED EmailTemplaplatePlaceholder: type: string enum: - recipient - sender - link - event - club - participants - competitions - date EmailTemplateRequest: type: object required: - subject - body - bodyIsHtml properties: subject: type: string body: type: string bodyIsHtml: type: boolean EmailTemplateDto: type: object required: - key - language - subject - body - bodyIsHtml - requiredPlaceholders - optionalPlaceholders properties: key: $ref: '#/components/schemas/EmailTemplateKey' language: $ref: '#/components/schemas/EmailLanguage' subject: type: string body: type: string bodyIsHtml: type: boolean requiredPlaceholders: type: array items: $ref: '#/components/schemas/EmailTemplaplatePlaceholder' optionalPlaceholders: type: array items: $ref: '#/components/schemas/EmailTemplaplatePlaceholder' SmtpConfigOverrideDto: type: object required: - host - port - username - password - smtpStrategy - fromAddress properties: host: type: string port: type: integer format: int32 minimum: 1 maximum: 65535 username: type: string password: type: string smtpStrategy: type: string enum: - SMTP - SMTP_TLS - SMTPS fromAddress: type: string format: email fromName: type: string localhost: type: string replyTo: type: string format: email ResendAccessTokenRequest: type: object required: - callbackUrl properties: callbackUrl: type: string ChallengeParticipantInfoDto: type: object required: - firstname - lastname - clubName properties: firstname: type: string lastname: type: string clubName: type: string ChallengeNamedParticipantInfoDto: type: object required: - name - participants properties: name: type: string participants: type: array items: $ref: '#/components/schemas/ChallengeParticipantInfoDto' ChallengeTeamInfoDto: type: object required: - id - namedParticipants properties: id: type: string format: uuid name: type: string nullable: true namedParticipants: type: array items: $ref: '#/components/schemas/ChallengeNamedParticipantInfoDto' ChallengeResultInfoDto: type: object required: - result properties: result: type: integer proofDocumentId: type: string format: uuid nullable: true ChallengeCompetitionInfoDto: type: object required: - id - name - identifier - proofRequired - teamInfo - challengeStart - challengeEnd properties: id: type: string format: uuid name: type: string identifier: type: string resultInfo: allOf: - $ref: '#/components/schemas/ChallengeResultInfoDto' nullable: true proofRequired: type: boolean teamInfo: $ref: '#/components/schemas/ChallengeTeamInfoDto' challengeStart: type: string format: date-time challengeEnd: type: string format: date-time ChallengeInfoDto: type: object required: - eventId - eventName - resultType - competitions properties: eventId: type: string format: uuid eventName: type: string resultType: $ref: '#/components/schemas/MatchResultType' competitions: type: array items: $ref: '#/components/schemas/ChallengeCompetitionInfoDto' ClubImportRequest: type: object required: - separator - charset - colName - noHeader properties: separator: type: string charset: type: string colName: type: string noHeader: type: boolean UpdateGlobalConfigurationsRequest: type: object required: - allowClubCreationOnRegistration properties: allowClubCreationOnRegistration: type: boolean CompetitionsForRegistrationDto: type: object required: - competitions - teamsEventOmitted properties: competitions: type: array items: $ref: '#/components/schemas/CompetitionDto' teamsEventOmitted: type: boolean ThemeConfigDto: type: object required: - primary - textColor - actionColors - backgroundColor - customFont - customLogo properties: primary: $ref: '#/components/schemas/PrimaryColors' textColor: $ref: '#/components/schemas/TextColors' actionColors: $ref: '#/components/schemas/ActionColors' backgroundColor: type: string pattern: '^#[0-9a-fA-F]{6}$' customFont: $ref: '#/components/schemas/CustomFontDto' customLogo: $ref: '#/components/schemas/CustomLogoDto' CustomFontDto: type: object required: - enabled properties: enabled: type: boolean filename: type: string nullable: true CustomLogoDto: type: object required: - enabled properties: enabled: type: boolean filename: type: string nullable: true UpdateThemeRequest: type: object required: - primary - textColor - actionColors - backgroundColor - enableCustomFont - enableCustomLogo properties: primary: $ref: '#/components/schemas/PrimaryColors' textColor: $ref: '#/components/schemas/TextColors' actionColors: $ref: '#/components/schemas/ActionColors' backgroundColor: type: string pattern: '^#[0-9a-fA-F]{6}$' enableCustomFont: type: boolean enableCustomLogo: type: boolean PrimaryColors: type: object required: - main - light properties: main: type: string pattern: '^#[0-9a-fA-F]{6}$' light: type: string pattern: '^#[0-9a-fA-F]{6}$' TextColors: type: object required: - primary - secondary properties: primary: type: string pattern: '^#[0-9a-fA-F]{6}$' secondary: type: string pattern: '^#[0-9a-fA-F]{6}$' ActionColors: type: object required: - success - warning - error - info properties: success: type: string pattern: '^#[0-9a-fA-F]{6}$' warning: type: string pattern: '^#[0-9a-fA-F]{6}$' error: type: string pattern: '^#[0-9a-fA-F]{6}$' info: type: string pattern: '^#[0-9a-fA-F]{6}$' GapDocumentPlaceholderDto: type: object required: - id - type - page - relLeft - relTop - relWidth - relHeight - textAlign - bold - italic properties: id: type: string format: uuid name: type: string type: $ref: '#/components/schemas/GapDocumentPlaceholderType' page: type: integer relLeft: type: number relTop: type: number relWidth: type: number relHeight: type: number textAlign: $ref: '#/components/schemas/TextAlign' fontSize: type: integer bold: type: boolean italic: type: boolean staticText: description: Fester Text für den Platzhaltertyp FREE_TEXT, z. B. der Name des Unterzeichners. type: string GapDocumentTemplateDto: type: object required: - id - name - type - hasFont - placeholders properties: id: type: string format: uuid name: type: string type: $ref: '#/components/schemas/GapDocumentType' fontName: description: Schriftname für die Word-Ausgabe, z. B. "TheSansOffice". type: string hasFont: description: Ob eine Schriftdatei zum Einbetten in die erzeugten PDFs hochgeladen wurde. type: boolean placeholders: type: array items: $ref: '#/components/schemas/GapDocumentPlaceholderDto' GapDocumentTypeDto: type: object required: - type - allowedPlaceholders properties: type: $ref: '#/components/schemas/GapDocumentType' assignedTemplate: $ref: '#/components/schemas/AssignedTemplateId' allowedPlaceholders: type: array items: $ref: '#/components/schemas/GapDocumentPlaceholderType' GapDocumentPlaceholderRequest: type: object required: - type - page - relLeft - relTop - relWidth - relHeight - textAlign properties: name: type: string type: $ref: '#/components/schemas/GapDocumentPlaceholderType' page: type: integer relLeft: type: number relTop: type: number relWidth: type: number relHeight: type: number textAlign: $ref: '#/components/schemas/TextAlign' fontSize: type: integer bold: type: boolean default: false italic: type: boolean default: false staticText: description: Fester Text für den Platzhaltertyp FREE_TEXT, z. B. der Name des Unterzeichners. type: string GapDocumentTemplateRequest: type: object required: - type - placeholders properties: type: $ref: '#/components/schemas/GapDocumentType' fontName: description: Schriftname für die Word-Ausgabe, z. B. "TheSansOffice". type: string placeholders: type: array items: $ref: '#/components/schemas/GapDocumentPlaceholderRequest' AwardCeremonyChoiceDto: description: Eine Ehrung zur Auswahl - die Einheit ist (Wettkampf, Wertung). type: object required: - competitionId - competitionIdentifier - competitionName - awardedTeams properties: competitionId: type: string format: uuid competitionIdentifier: description: Die Rennnummer des Wettkampfs, z. B. "17-NC". type: string competitionName: type: string competitionShortName: description: Der Kurzname des Wettkampfs, z. B. "CM 4x+". type: string nullable: true ratingCategoryId: description: >- Der Schlüssel der Wertung, in der geehrt wird - darüber wird ausgewählt. `null` ist ein gültiger Wert und heißt "der Wettkampf wird als Ganzes geehrt", nicht "unbekannt". type: string format: uuid nullable: true ratingCategoryName: description: >- Der Name der Wertung, reiner Anzeigewert. `null`, wenn der Wettkampf als Ganzes geehrt wird. type: string nullable: true awardedTeams: description: >- Die Zahl der Boote, die auf dem Blatt landen: Ränge bis drei, Gleichstände eingeschlossen. Bewusst nicht die Zahl aller platzierten Boote der Wertung. type: integer AwardCeremonyKeyRequest: description: Verweist auf genau eine Ehrung aus der Liste. type: object required: - competitionId properties: competitionId: type: string format: uuid ratingCategoryId: description: >- Muss der `ratingCategoryId` der gewünschten Ehrung entsprechen - `null` trifft die Ehrung ohne Wertung und ist kein Platzhalter für "alle". type: string format: uuid nullable: true AwardCeremonySelectionRequest: type: object properties: selection: description: >- Leere oder fehlende Auswahl heißt "alle Ehrungen drucken". Ein Schlüssel, zu dem es keine Ehrung gibt, führt zu 400 statt zu einem still fehlenden Blatt. type: array nullable: true items: $ref: '#/components/schemas/AwardCeremonyKeyRequest'