openapi: 3.1.0 info: title: Artemis Application Server API contact: {name: Stephan Krusche, email: krusche@tum.de} version: "10.0" servers: - {url: 'http://localhost:8080', description: Generated server url} tags: - {name: Global Search Resource, description: 'Weaviate-based semantic search across courses, exercises, lectures, lecture units, exams, FAQs, and public communication channels including their messages and replies'} paths: /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}: get: tags: [tutorial-group] operationId: getTutorialGroup parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupDetailData'} put: tags: [tutorial-group] operationId: updateTutorialGroup parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/CreateOrUpdateTutorialGroupRequest'} required: true responses: '200': {description: OK} delete: tags: [tutorial-group] operationId: deleteTutorialGroup parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} responses: '200': {description: OK} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/sessions/{sessionId}: put: tags: [tutorial-group-session] operationId: updateSession parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} - name: sessionId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/CreateOrUpdateTutorialGroupSessionRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupSession'} delete: tags: [tutorial-group-session] operationId: deleteSession parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} - name: sessionId in: path required: true schema: {type: integer, format: int64} responses: '200': {description: OK} /api/tutorialgroup/courses/{courseId}/tutorial-groups-configuration/{tutorialGroupsConfigurationId}: put: tags: [tutorial-groups-configuration] operationId: update parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupsConfigurationId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupConfiguration'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupConfiguration'} ? /api/tutorialgroup/courses/{courseId}/tutorial-groups-configuration/{tutorialGroupsConfigurationId}/tutorial-free-periods/{tutorialGroupFreePeriodId} : get: tags: [tutorial-group-free-period] operationId: getOneOfConfiguration parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupsConfigurationId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupFreePeriodId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupFreePeriod'} put: tags: [tutorial-group-free-period] operationId: update_1 parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupsConfigurationId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupFreePeriodId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupFreePeriodRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupFreePeriod'} delete: tags: [tutorial-group-free-period] operationId: delete parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupsConfigurationId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupFreePeriodId in: path required: true schema: {type: integer, format: int64} responses: '200': {description: OK} /api/tutorialgroup/courses/{courseId}/tutorial-groups: get: tags: [tutorial-group] operationId: getTutorialGroupsForCourse parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {type: array} post: tags: [tutorial-group] operationId: createTutorialGroup parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/CreateOrUpdateTutorialGroupRequest'} required: true responses: '200': description: OK content: application/json: schema: {type: integer, format: int64} /api/quiz/leaderboard-settings: get: tags: [quiz-training] operationId: getLeaderboardSettings responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/LeaderboardSetting'} put: tags: [quiz-training] operationId: updateLeaderboardSettings requestBody: content: application/json: schema: {$ref: '#/components/schemas/LeaderboardSetting'} required: true responses: '200': {description: OK} /api/quiz/exercises/{exerciseId}/submissions/exam: put: tags: [quiz-submission] operationId: submitQuizForExam parameters: - name: exerciseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/QuizSubmissionFromLiveClient'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/QuizSubmissionBeforeEvaluation'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/sessions: post: tags: [tutorial-group-session] operationId: createSession parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/CreateOrUpdateTutorialGroupSessionRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupSession'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/import-registrations: post: tags: [tutorial-group] operationId: importRegistrations parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupStudentImportData'} required: true responses: '200': description: OK content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupStudentImportData'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/batch-register: post: tags: [tutorial-group] operationId: batchRegisterStudents parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: type: array items: {type: string} required: true responses: '200': {description: OK} /api/tutorialgroup/courses/{courseId}/tutorial-groups/import: post: tags: [tutorial-group] operationId: importTutorialGroupsWithRegistrations parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupImportData'} uniqueItems: true required: true responses: '200': description: OK content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupImportData'} /api/tutorialgroup/courses/{courseId}/tutorial-groups-configuration: get: tags: [tutorial-groups-configuration] operationId: getOneOfCourse parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupConfiguration'} post: tags: [tutorial-groups-configuration] operationId: create parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupConfiguration'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupConfiguration'} /api/tutorialgroup/courses/{courseId}/tutorial-groups-configuration/{tutorialGroupsConfigurationId}/tutorial-free-periods: post: tags: [tutorial-group-free-period] operationId: create_1 parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupsConfigurationId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupFreePeriodRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupFreePeriod'} /api/hyperion/programming-exercises/{exerciseId}/generate-code: post: tags: [hyperion-code-generation] operationId: generateCode parameters: - name: exerciseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/CodeGenerationRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/CodeGenerationJobStart'} /api/quiz/quiz-exercises/{quizExerciseId}/add-batch: put: tags: [quiz-exercise-batch] operationId: addBatch parameters: - name: quizExerciseId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/QuizBatchWithPassword'} /api/quiz/quiz-exercises/{quizBatchId}/start-batch: put: tags: [quiz-exercise-batch] operationId: startBatch parameters: - name: quizBatchId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/QuizBatch'} /api/quiz/quiz-batches/{quizBatchId}/start-batch: put: tags: [quiz-exercise-batch] operationId: startBatch_1 parameters: - name: quizBatchId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/QuizBatch'} /api/quiz/quiz-exercises/{quizExerciseId}/join: post: tags: [quiz-exercise-batch] operationId: joinBatch parameters: - name: quizExerciseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/QuizBatchJoin'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/QuizBatch'} /api/quiz/quiz-exercises/{exerciseId}/start-participation: post: tags: [quiz-participation] operationId: startParticipation parameters: - name: exerciseId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/StudentQuizParticipation'} /api/quiz/exercises/{exerciseId}/submissions/preview: post: tags: [quiz-submission] operationId: submitForPreview parameters: - name: exerciseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/QuizSubmissionFromStudent'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ResultAfterEvaluationWithSubmission'} /api/quiz/exercises/{exerciseId}/submissions/practice: post: tags: [quiz-submission] operationId: submitForPractice parameters: - name: exerciseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/QuizSubmissionFromStudent'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ResultAfterEvaluationWithSubmission'} /api/quiz/exercises/{exerciseId}/submissions/live: post: tags: [quiz-submission] operationId: saveOrSubmitForLiveMode parameters: - name: exerciseId in: path required: true schema: {type: integer, format: int64} - name: submit in: query required: false schema: {type: boolean, default: false} requestBody: content: application/json: schema: {$ref: '#/components/schemas/QuizSubmissionFromLiveClient'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/QuizSubmissionBeforeEvaluation'} /api/quiz/courses/{courseId}/training-questions: post: tags: [quiz-training] operationId: getQuizQuestionsForPractice parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: page in: query description: Zero-based page index (0..N) required: false schema: {type: integer, default: 0, minimum: 0} - name: size in: query description: The size of the page to be returned required: false schema: {type: integer, default: 20, minimum: 1} - name: sort in: query description: 'Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.' required: false schema: type: array items: {type: string} - name: isNewSession in: query required: true schema: {type: boolean} requestBody: content: application/json: schema: type: array items: {type: integer, format: int64} uniqueItems: true required: true responses: '200': description: OK headers: X-Has-Next: style: simple schema: {type: boolean} content: application/json: schema: type: array items: {$ref: '#/components/schemas/QuizQuestionTraining'} /api/quiz/courses/{courseId}/training-questions/{trainingQuestionId}/submit: post: tags: [quiz-training] operationId: submitForTraining parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: trainingQuestionId in: path required: true schema: {type: integer, format: int64} - name: isRated in: query required: true schema: {type: boolean} requestBody: content: application/json: schema: {$ref: '#/components/schemas/SubmittedAnswerFromLiveClient'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/SubmittedAnswerAfterEvaluation'} /api/quiz/courses/{courseId}/leaderboard-entry: post: tags: [quiz-training] operationId: initializeLeaderboardEntry parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/LeaderboardSetting'} required: true responses: '200': {description: OK} /api/hyperion/programming-exercises/{exerciseId}/consistency-check: post: tags: [hyperion-problem-statement] operationId: checkExerciseConsistency parameters: - name: exerciseId in: path required: true schema: {type: integer, format: int64} - name: skipThreadContext in: query required: false schema: {type: boolean, default: false} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ConsistencyCheckResponse'} /api/hyperion/courses/{courseId}/assessment-criteria/generate: post: tags: [hyperion-assessment-criteria-generation] operationId: generateAssessmentCriteria parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/AssessmentCriteriaGenerationRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/AssessmentCriteriaGenerationResponse'} /api/hyperion/courses/{courseId}/quiz-exercises/refine-question: post: tags: [hyperion-quiz-question-generation] operationId: refineQuizQuestion parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/QuizQuestionRefinementRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/QuizQuestionRefinementResponse'} /api/hyperion/courses/{courseId}/quiz-exercises/refine-all-questions: post: tags: [hyperion-quiz-question-generation] operationId: refineAllQuizQuestions parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/QuizQuestionBulkRefinementRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/QuizQuestionBulkRefinementResponse'} /api/hyperion/courses/{courseId}/quiz-exercises/generate-questions: post: tags: [hyperion-quiz-question-generation] operationId: generateQuizQuestions parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/QuizQuestionGenerationRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/QuizQuestionGenerationResponse'} /api/hyperion/courses/{courseId}/problem-statements/rewrite: post: tags: [hyperion-problem-statement] operationId: rewriteProblemStatement parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementRewriteRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementRewriteResponse'} /api/hyperion/courses/{courseId}/problem-statements/refine/targeted: post: tags: [hyperion-problem-statement] operationId: refineProblemStatementTargeted parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementTargetedRefinementRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementRefinementResponse'} /api/hyperion/courses/{courseId}/problem-statements/refine/global: post: tags: [hyperion-problem-statement] operationId: refineProblemStatementGlobally parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementGlobalRefinementRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementRefinementResponse'} /api/hyperion/courses/{courseId}/problem-statements/generate: post: tags: [hyperion-problem-statement] operationId: generateProblemStatement parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementGenerationRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ProblemStatementGenerationResponse'} /api/hyperion/courses/{courseId}/faq/rewrite: post: tags: [hyperion-faq] operationId: rewriteFaq parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/RewriteFaqRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/RewriteFaqResponse'} /api/hyperion/courses/{courseId}/checklist-analysis: post: tags: [hyperion-problem-statement] operationId: analyzeChecklist parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/ChecklistAnalysisRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ChecklistAnalysisResponse'} /api/hyperion/courses/{courseId}/checklist-analysis/sections/{section}: post: tags: [hyperion-problem-statement] operationId: analyzeChecklistSection parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: section in: path required: true schema: type: string enum: [COMPETENCIES, DIFFICULTY, QUALITY] requestBody: content: application/json: schema: {$ref: '#/components/schemas/ChecklistAnalysisRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ChecklistAnalysisResponse'} /api/hyperion/courses/{courseId}/checklist-actions: post: tags: [hyperion-problem-statement] operationId: applyChecklistAction parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/ChecklistActionRequest'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ChecklistActionResponse'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/sessions/{sessionId}/cancel: patch: tags: [tutorial-group-session] operationId: cancelSession parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} - name: sessionId in: path required: true schema: {type: integer, format: int64} - name: explanation in: query required: false schema: {type: string} responses: '200': {description: OK} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/sessions/{sessionId}/activate: patch: tags: [tutorial-group-session] operationId: activateSession parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} - name: sessionId in: path required: true schema: {type: integer, format: int64} responses: '200': {description: OK} /api/tutorialgroup/tutorial-groups/{tutorialGroupId}/title: get: tags: [tutorial-group] operationId: getTitle parameters: - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {type: string} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/unregistered-students: get: tags: [tutorial-group] operationId: searchUnregisteredStudents parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} - name: loginOrName in: query required: true schema: {type: string} - name: pageIndex in: query required: true schema: {type: integer, format: int32} - name: pageSize in: query required: true schema: {type: integer, format: int32} responses: '200': description: OK content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupStudent'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/schedule: get: tags: [tutorial-group] operationId: getTutorialGroupSchedule parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroupSchedule'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/registered-students: get: tags: [tutorial-group] operationId: getRegisteredStudents parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupStudent'} uniqueItems: true /api/tutorialgroup/courses/{courseId}/tutorial-groups/language-values: get: tags: [tutorial-group] operationId: getUniqueLanguageValues parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: type: array items: {type: string} uniqueItems: true /api/tutorialgroup/courses/{courseId}/tutorial-groups/export/json: get: tags: [tutorial-group] operationId: exportTutorialGroupsToJSON parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: fields in: query required: true schema: type: array items: {type: string} responses: '200': description: OK content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupExportData'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/export/csv: get: tags: [tutorial-group] operationId: exportTutorialGroupsToCSV parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: fields in: query required: true schema: type: array items: {type: string} responses: '200': description: OK content: text/csv: schema: {type: string, format: binary} /api/search: get: tags: [Global Search] summary: Perform a unified semantic search across entity types description: |- Searches across multiple entity types (exercises, lectures, lecture units, exams, FAQs, channels, courses, posts, answer posts) with a consistent response format. When courseId is not specified, the search is performed globally across all courses the authenticated user has access to. Per-type access rules are enforced server-side via compound Weaviate filters. operationId: globalSearch parameters: - name: q in: query description: Search query; can be empty to retrieve recent items required: true schema: {type: string} - name: types in: query description: Comma-separated entity type filter (exercise, lecture, lecture_unit, exam, faq, channel, course, post, answer_post) or 'all'; default 'all' required: false schema: {type: string} - name: courseId in: query description: Course ID to restrict the search to a single course required: false schema: {type: integer, format: int64} - name: limit in: query description: Maximum number of results (1–25, default 10) required: false schema: {type: integer, format: int32, default: 10} responses: '200': description: Search results matching the query content: application/json: schema: type: array items: {$ref: '#/components/schemas/GlobalSearchResult'} '400': description: Unsupported entity type requested content: application/json: schema: type: array items: {$ref: '#/components/schemas/GlobalSearchResult'} /api/quiz/quiz-exercises/{exerciseId}/participations/{participationId}/result: get: tags: [quiz-participation] operationId: getParticipationResult parameters: - name: exerciseId in: path required: true schema: {type: integer, format: int64} - name: participationId in: path required: true schema: {type: integer, format: int64} - name: submissionId in: query required: false schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/StudentQuizParticipation'} /api/quiz/courses/{courseId}/training/leaderboard: get: tags: [quiz-training] operationId: getQuizTrainingLeaderboard parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/LeaderboardWithCurrentUserEntry'} /api/core/calendar/courses/{courseId}/calendar-events-ics: get: tags: [legacy-calendar] operationId: getLegacyCalendarEventSubscriptionFile parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: token in: query required: true schema: {type: string} - name: filterOptions in: query required: true schema: type: array items: type: string enum: [LECTURES, TUTORIALS, EXAMS, EXERCISES] uniqueItems: true - name: language in: query required: true schema: type: string enum: [ENGLISH, GERMAN] responses: '200': description: OK content: text/calendar: schema: {type: string} deprecated: true /api/calendar/subscription-token: get: tags: [calendar] operationId: getCalendarEventSubscriptionToken responses: '200': description: OK content: text/plain: schema: {type: string} /api/calendar/courses/{courseId}/calendar-events: get: tags: [calendar] summary: Get calendar events grouped by month operationId: getCalendarEventsOverlappingMonths parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: monthKeys in: query required: true schema: type: array items: {type: string} - name: timeZone in: query required: true schema: {type: string} - name: language in: query required: true schema: type: string enum: [ENGLISH, GERMAN] responses: '200': description: OK content: application/json: schema: type: object additionalProperties: type: array items: {$ref: '#/components/schemas/CalendarEvent'} /api/calendar/courses/{courseId}/calendar-events-ics: get: tags: [calendar] operationId: getCalendarEventSubscriptionFile parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: token in: query required: true schema: {type: string} - name: filterOptions in: query required: true schema: type: array items: type: string enum: [LECTURES, TUTORIALS, EXAMS, EXERCISES] uniqueItems: true - name: language in: query required: true schema: type: string enum: [ENGLISH, GERMAN] responses: '200': description: OK content: text/calendar: schema: {type: string} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/deregister/{studentLogin}: delete: tags: [tutorial-group] operationId: deregisterStudent parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} - name: tutorialGroupId in: path required: true schema: {type: integer, format: int64} - name: studentLogin in: path required: true schema: {type: string} responses: '200': {description: OK} components: schemas: QuizBatchWithPassword: type: object properties: id: {type: integer, format: int64} startTime: {type: string, format: date-time} started: {type: boolean} ended: {type: boolean} password: {type: string} ExerciseVariantGroupReference: type: object properties: id: {type: integer, format: int64} title: {type: string} maxPoints: {type: number, format: double} releaseDate: {type: string, format: date-time} startDate: {type: string, format: date-time} dueDate: {type: string, format: date-time} assessmentDueDate: {type: string, format: date-time} exampleSolutionPublicationDate: {type: string, format: date-time} QuizQuestionRefinementSuccess: description: Successful refinement result containing the refined question and an explanation of the changes required: [question, reasoning] type: object properties: reasoning: {type: string, description: Brief explanation of what was changed during refinement, minLength: 1} type: type: string enum: [success] example: success ChecklistAnalysisRequest: type: object description: Request to analyze a problem statement for quality, competencies, and difficulty properties: problemStatementMarkdown: {type: string, description: Problem statement in Markdown format, maxLength: 50000, minLength: 1} declaredDifficulty: {type: string, description: Declared difficulty of the exercise, maxLength: 20, minLength: 0, pattern: EASY|MEDIUM|HARD} language: {type: string, description: 'Programming language, e.g. JAVA, PYTHON', maxLength: 50, minLength: 0} exerciseId: {type: integer, format: int64, description: ID of the exercise} required: [problemStatementMarkdown] QuizBatchJoin: type: object properties: password: {type: string} QuizSubmissionFromStudent: type: object properties: submittedAnswers: type: array items: {$ref: '#/components/schemas/SubmittedAnswerFromStudent'} uniqueItems: true required: [submittedAnswers] QuizSubmissionBeforeEvaluation: type: object properties: id: {type: integer, format: int64} submissionExerciseType: {type: string} submitted: {type: boolean} type: type: string enum: [MANUAL, TIMEOUT, TEST, OTHER, INSTRUCTOR, EXTERNAL] submissionDate: {type: string, format: date-time} submittedAnswers: type: array items: {$ref: '#/components/schemas/SubmittedAnswerBeforeEvaluation'} uniqueItems: true ChecklistAnalysisResponse: type: object description: Response containing the checklist analysis results properties: inferredCompetencies: type: array description: Top inferred competencies from the standardized catalog items: {$ref: '#/components/schemas/InferredCompetency'} bloomRadar: {$ref: '#/components/schemas/BloomRadar', description: Bloom's taxonomy radar distribution} difficultyAssessment: {$ref: '#/components/schemas/DifficultyAssessment', description: Difficulty assessment with delta indicator} qualityIssues: type: array description: List of quality issues found in the problem statement items: {$ref: '#/components/schemas/QualityIssue'} ResultAfterEvaluationWithSubmission: type: object properties: id: {type: integer, format: int64} completionDate: {type: string, format: date-time} successful: {type: boolean} score: {type: number, format: double} rated: {type: boolean} assessmentType: type: string enum: [AUTOMATIC, SEMI_AUTOMATIC, MANUAL, AUTOMATIC_ATHENA] submission: {$ref: '#/components/schemas/QuizSubmissionForResult'} ChecklistActionResponse: type: object description: Response from applying a checklist action to the problem statement properties: updatedProblemStatement: {type: string, description: The updated problem statement markdown} applied: {type: boolean, description: Whether the action was successfully applied} summary: {type: string, description: Short summary of what was changed} AssessmentCriteriaGenerationRequest: type: object description: Context used to generate structured assessment criteria properties: problemStatement: {type: string, description: Current problem statement, maxLength: 50000, minLength: 1} maxPoints: {type: number, format: double, description: Maximum regular score, exclusiveMinimum: 0} bonusPoints: {type: number, format: double, description: Maximum bonus score, minimum: 0} gradingInstructions: {type: string, description: General assessment instructions, maxLength: 50000, minLength: 0} exampleSolution: {type: string, description: Current example solution, if available, maxLength: 200000, minLength: 0} additionalContext: {type: string, description: Optional exercise-specific context appended to the default prompt, maxLength: 200000, minLength: 0} required: [bonusPoints, maxPoints, problemStatement] AssessmentCriteriaGenerationResponse: type: object description: Generated structured assessment criteria properties: criteria: type: array description: Ordered generated criteria items: {$ref: '#/components/schemas/GeneratedAssessmentCriterion'} minItems: 1 required: [criteria] GeneratedAssessmentCriterion: type: object description: Generated structured assessment criterion properties: title: {type: string, description: Criterion title, maxLength: 255, minLength: 1} bonus: {type: boolean, description: Whether the criterion awards bonus points} structuredGradingInstructions: type: array description: Full-credit, partial-credit, and no-credit instructions, in that order items: {$ref: '#/components/schemas/GeneratedAssessmentInstruction'} minItems: 3 maxItems: 3 required: [bonus, structuredGradingInstructions, title] GeneratedAssessmentInstruction: type: object description: Generated structured grading instruction properties: credits: {type: number, format: double, description: Nonnegative credits awarded, minimum: 0} gradingScale: {type: string, description: Grading scale label, maxLength: 255, minLength: 1} instructionDescription: {type: string, description: Assessment instruction, minLength: 1} feedback: {type: string, description: Suggested feedback, minLength: 1} usageCount: {type: integer, format: int32, description: Maximum number of uses, minimum: 0} required: [credits, feedback, gradingScale, instructionDescription, usageCount] ShortAnswerSubmittedAnswerFromStudent: required: [questionId, submittedTexts, type] type: object properties: questionId: {type: integer, format: int64} submittedTexts: type: array items: {$ref: '#/components/schemas/ShortAnswerSubmittedTextFromStudent'} type: type: string default: short-answer enum: [short-answer] SubmittedAnswerFromLiveClient: discriminator: propertyName: type mapping: {multiple-choice: '#/components/schemas/MultipleChoiceSubmittedAnswerFromLiveClient', drag-and-drop: '#/components/schemas/DragAndDropSubmittedAnswerFromLiveClient', short-answer: '#/components/schemas/ShortAnswerSubmittedAnswerFromLiveClient'} oneOf: - {$ref: '#/components/schemas/MultipleChoiceSubmittedAnswerFromLiveClient'} - {$ref: '#/components/schemas/DragAndDropSubmittedAnswerFromLiveClient'} - {$ref: '#/components/schemas/ShortAnswerSubmittedAnswerFromLiveClient'} properties: type: {type: string} required: [type] CreateOrUpdateTutorialGroupRequest: type: object properties: title: {type: string, pattern: '^[A-Za-z0-9][A-Za-z0-9: -]{0,19}$'} tutorId: {type: integer, format: int64} language: {type: string, maxLength: 255, minLength: 1} isOnline: {type: boolean} campus: {type: string, maxLength: 255, minLength: 1} capacity: {type: integer, format: int32} additionalInformation: {type: string, maxLength: 255, minLength: 1} tutorialGroupSchedule: {$ref: '#/components/schemas/TutorialGroupSchedule'} required: [language, title] ShortAnswerMapping: type: object properties: id: {type: integer, format: int64} shortAnswerSpotIndex: {type: integer, format: int32} shortAnswerSolutionIndex: {type: integer, format: int32} invalid: {type: boolean} solution: {$ref: '#/components/schemas/ShortAnswerSolution'} spot: {$ref: '#/components/schemas/ShortAnswerSpot'} ProblemStatementTargetedRefinementRequest: type: object description: Request to refine a problem statement using targeted selection-based instructions properties: problemStatementText: {type: string, description: 'Original problem statement text to be refined (max 50,000 chars)', maxLength: 50000, minLength: 1} startLine: {type: integer, format: int32, description: Start line number (1-indexed), maximum: 10000, minimum: 1} endLine: {type: integer, format: int32, description: 'End line number (1-indexed, inclusive)', maximum: 10000, minimum: 1} startColumn: {type: integer, format: int32, description: 'Start column within start line (1-indexed, optional for character-level targeting)', maximum: 10000, minimum: 1} endColumn: {type: integer, format: int32, description: 'End column within end line (1-indexed, exclusive — points after the last selected character, optional for character-level targeting)', maximum: 10000, minimum: 1} instruction: {type: string, description: Instruction describing what should change, maxLength: 500, minLength: 1} required: [endLine, instruction, problemStatementText, startLine] ResultAfterEvaluation: type: object properties: id: {type: integer, format: int64} completionDate: {type: string, format: date-time} successful: {type: boolean} score: {type: number, format: double} rated: {type: boolean} assessmentType: type: string enum: [AUTOMATIC, SEMI_AUTOMATIC, MANUAL, AUTOMATIC_ATHENA] QuizQuestionWithSolution: type: object discriminator: propertyName: type mapping: {multiple-choice: '#/components/schemas/MultipleChoiceQuizQuestionWithSolution', drag-and-drop: '#/components/schemas/DragAndDropQuizQuestionWithSolution', short-answer: '#/components/schemas/ShortAnswerQuizQuestionWithSolution'} oneOf: - {$ref: '#/components/schemas/MultipleChoiceQuizQuestionWithSolution'} - {$ref: '#/components/schemas/DragAndDropQuizQuestionWithSolution'} - {$ref: '#/components/schemas/ShortAnswerQuizQuestionWithSolution'} properties: id: {type: integer, format: int64} title: {type: string} text: {type: string} hint: {type: string} points: {type: number, format: double} scoringType: type: string enum: [ALL_OR_NOTHING, PROPORTIONAL_WITH_PENALTY, PROPORTIONAL_WITHOUT_PENALTY] randomizeOrder: {type: boolean} invalid: {type: boolean} type: {type: string} explanation: {type: string} answerOptions: type: array items: {$ref: '#/components/schemas/AnswerOptionWithSolution'} singleChoice: {type: boolean} backgroundFilePath: {type: string} dropLocations: type: array items: {$ref: '#/components/schemas/DropLocation'} dragItems: type: array items: {$ref: '#/components/schemas/DragItem'} correctMappings: type: array items: {$ref: '#/components/schemas/ShortAnswerMapping'} spots: type: array items: {$ref: '#/components/schemas/ShortAnswerSpot'} solutions: type: array items: {$ref: '#/components/schemas/ShortAnswerSolution'} similarityValue: {type: integer, format: int32} matchLetterCase: {type: boolean} TutorialGroupExportData: type: object properties: id: {type: integer, format: int64} title: {type: string} dayOfWeek: {type: string} startTime: {type: string} endTime: {type: string} location: {type: string} campus: {type: string} language: {type: string} additionalInformation: {type: string} capacity: {type: integer, format: int32} isOnline: {type: boolean} students: type: array items: {$ref: '#/components/schemas/StudentExport'} BloomRadar: type: object description: Bloom's taxonomy radar distribution with normalized proportions (0.0–1.0, summing to 1.0) properties: REMEMBER: {type: number, format: double, description: Proportion of REMEMBER level (0.0–1.0)} UNDERSTAND: {type: number, format: double, description: Proportion of UNDERSTAND level (0.0–1.0)} APPLY: {type: number, format: double, description: Proportion of APPLY level (0.0–1.0)} ANALYZE: {type: number, format: double, description: Proportion of ANALYZE level (0.0–1.0)} EVALUATE: {type: number, format: double, description: Proportion of EVALUATE level (0.0–1.0)} CREATE: {type: number, format: double, description: Proportion of CREATE level (0.0–1.0)} ShortAnswerSpot: type: object properties: id: {type: integer, format: int64} spotNr: {type: integer, format: int32} width: {type: integer, format: int32} invalid: {type: boolean} CodeGenerationJobStart: type: object properties: jobId: {type: string} repositoryType: type: string enum: [exercise, solution, tests, auxiliary, user] QuizQuestionRefinementRequest: type: object description: Request to refine an existing quiz question using a user prompt properties: refinementPrompt: {type: string, description: User instructions describing how the question should be changed, maxLength: 2000, minLength: 1} required: [question, refinementPrompt] ConsistencyIssue: type: object description: Individual consistency issue details properties: severity: type: string description: Severity of the issue enum: [LOW, MEDIUM, HIGH] example: HIGH category: type: string description: Category of the issue enum: [METHOD_RETURN_TYPE_MISMATCH, METHOD_PARAMETER_MISMATCH, CONSTRUCTOR_PARAMETER_MISMATCH, ATTRIBUTE_TYPE_MISMATCH, VISIBILITY_MISMATCH, IDENTIFIER_NAMING_INCONSISTENCY] example: METHOD_RETURN_TYPE_MISMATCH description: {type: string, description: Detailed description of the issue, example: Problem statement does not match test cases} suggestedFix: {type: string, description: Suggested fix for the issue, example: Update problem statement to clarify expected behavior} relatedLocations: type: array description: Related locations across artifacts items: {$ref: '#/components/schemas/ArtifactLocation'} required: [category, description, relatedLocations, severity, suggestedFix] ProblemStatementRewriteRequest: type: object description: Request to rewrite a problem statement properties: problemStatementText: {type: string, description: Original problem statement text to be improved, minLength: 1} required: [problemStatementText] LeaderboardSetting: type: object properties: showInLeaderboard: {type: boolean} DropLocation: type: object properties: id: {type: integer, format: int64} posX: {type: number, format: double} posY: {type: number, format: double} width: {type: number, format: double} height: {type: number, format: double} invalid: {type: boolean} Tokens: type: object description: Response containing consistency check tokens properties: prompt: {type: integer, format: int64, description: Prompt token length, example: 10204} completion: {type: integer, format: int64, description: Completion token length, example: 3753} total: {type: integer, format: int64, description: Total token length, example: 13957} DragAndDropQuizQuestionWithSolution: type: object properties: id: {type: integer, format: int64} title: {type: string} text: {type: string} hint: {type: string} points: {type: number, format: double} scoringType: type: string enum: [ALL_OR_NOTHING, PROPORTIONAL_WITH_PENALTY, PROPORTIONAL_WITHOUT_PENALTY] randomizeOrder: {type: boolean} invalid: {type: boolean} type: {type: string} explanation: {type: string} backgroundFilePath: {type: string} dropLocations: type: array items: {$ref: '#/components/schemas/DropLocation'} dragItems: type: array items: {$ref: '#/components/schemas/DragItem'} correctMappings: type: array items: {$ref: '#/components/schemas/DragAndDropMapping'} ProblemStatementRewriteResponse: type: object description: Response containing rewritten problem statement properties: rewrittenText: {type: string, description: Improved problem statement text} improved: {type: boolean, description: Whether the text was actually improved, example: true} required: [improved, rewrittenText] EntityIdRef: type: object properties: id: {type: integer, format: int64} Channel: type: object properties: type: {type: string} id: {type: integer, format: int64} creationDate: {type: string, format: date-time} lastMessageDate: {type: string, format: date-time} creator: {$ref: '#/components/schemas/ConversationUser'} lastReadDate: {type: string, format: date-time} unreadMessagesCount: {type: integer, format: int64} isFavorite: {type: boolean} isHidden: {type: boolean} isMuted: {type: boolean} isCreator: {type: boolean} isMember: {type: boolean} numberOfMembers: {type: integer, format: int32} name: {type: string} description: {type: string} topic: {type: string} isPublic: {type: boolean} isAnnouncementChannel: {type: boolean} isArchived: {type: boolean} isCourseWide: {type: boolean} hasChannelModerationRights: {type: boolean} isChannelModerator: {type: boolean} tutorialGroupId: {type: integer, format: int64} tutorialGroupTitle: {type: string} subType: type: string enum: [general, exercise, lecture, exam, feedbackDiscussion] subTypeReferenceId: {type: integer, format: int64} subTypeWithReferenceFromChannel: {$ref: '#/components/schemas/Channel', writeOnly: true} ShortAnswerQuizQuestionWithSolution: type: object properties: id: {type: integer, format: int64} title: {type: string} text: {type: string} hint: {type: string} points: {type: number, format: double} scoringType: type: string enum: [ALL_OR_NOTHING, PROPORTIONAL_WITH_PENALTY, PROPORTIONAL_WITHOUT_PENALTY] randomizeOrder: {type: boolean} invalid: {type: boolean} type: {type: string} explanation: {type: string} spots: type: array items: {$ref: '#/components/schemas/ShortAnswerSpot'} solutions: type: array items: {$ref: '#/components/schemas/ShortAnswerSolution'} similarityValue: {type: integer, format: int32} matchLetterCase: {type: boolean} correctMappings: type: array items: {$ref: '#/components/schemas/ShortAnswerMapping'} QuizSubmissionAfterEvaluation: type: object properties: id: {type: integer, format: int64} submissionExerciseType: {type: string} submitted: {type: boolean} type: type: string enum: [MANUAL, TIMEOUT, TEST, OTHER, INSTRUCTOR, EXTERNAL] submissionDate: {type: string, format: date-time} scoreInPoints: {type: number, format: double} submittedAnswers: type: array items: {$ref: '#/components/schemas/SubmittedAnswerAfterEvaluation'} uniqueItems: true results: type: array items: {$ref: '#/components/schemas/ResultAfterEvaluation'} Student: type: object properties: login: {type: string, maxLength: 50, minLength: 0} firstName: {type: string, maxLength: 50, minLength: 0} lastName: {type: string, maxLength: 50, minLength: 0} registrationNumber: {type: string, maxLength: 10, minLength: 0} email: {type: string, format: email, maxLength: 100, minLength: 0} isTestUser: {type: boolean} DragItem: type: object properties: id: {type: integer, format: int64} pictureFilePath: {type: string} text: {type: string} invalid: {type: boolean} DragAndDropMappingFromLiveClient: type: object properties: dragItem: {$ref: '#/components/schemas/EntityIdRef'} dropLocation: {$ref: '#/components/schemas/EntityIdRef'} ShortAnswerSolution: type: object properties: id: {type: integer, format: int64} text: {type: string} invalid: {type: boolean} ExamSeat: type: object properties: name: {type: string} condition: type: string enum: [USABLE, NO_TABLE, DEFECT, WHEELCHAIR] x: {type: number, format: double} y: {type: number, format: double} required: [condition, name] TutorialGroupStudent: type: object properties: id: {type: integer, format: int64} name: {type: string} profilePictureUrl: {type: string} login: {type: string} email: {type: string} registrationNumber: {type: string} required: [id, login] TutorialGroupDetailData: type: object properties: id: {type: integer, format: int64} title: {type: string} language: {type: string} isOnline: {type: boolean} tutorName: {type: string} tutorLogin: {type: string} tutorId: {type: integer, format: int64} tutorImageUrl: {type: string} capacity: {type: integer, format: int32} campus: {type: string} additionalInformation: {type: string} groupChannelId: {type: integer, format: int64} tutorChatId: {type: integer, format: int64} sessions: type: array items: {$ref: '#/components/schemas/TutorialGroupSession'} required: [id, isOnline, language, sessions, title, tutorId, tutorLogin, tutorName] DragAndDropQuizQuestionWithoutSolution: type: object properties: id: {type: integer, format: int64} title: {type: string} text: {type: string} hint: {type: string} points: {type: number, format: double} scoringType: type: string enum: [ALL_OR_NOTHING, PROPORTIONAL_WITH_PENALTY, PROPORTIONAL_WITHOUT_PENALTY] randomizeOrder: {type: boolean} invalid: {type: boolean} type: type: string default: drag-and-drop enum: [drag-and-drop] backgroundFilePath: {type: string} dropLocations: type: array items: {$ref: '#/components/schemas/DropLocation'} dragItems: type: array items: {$ref: '#/components/schemas/DragItem'} required: [type] DragAndDropSubmittedAnswerFromLiveClient: required: [type] type: object properties: quizQuestion: {$ref: '#/components/schemas/EntityIdRef'} mappings: type: array items: {$ref: '#/components/schemas/DragAndDropMappingFromLiveClient'} uniqueItems: true type: type: string default: drag-and-drop enum: [drag-and-drop] QualityIssueLocation: type: object description: Location of a quality issue within the problem statement properties: startLine: {type: integer, format: int32, description: Starting line number (1-indexed)} endLine: {type: integer, format: int32, description: 'Ending line number (1-indexed, inclusive)'} QuizExerciseWithSolution: type: object properties: id: {type: integer, format: int64} title: {type: string} shortName: {type: string} releaseDate: {type: string, format: date-time} startDate: {type: string, format: date-time} dueDate: {type: string, format: date-time} assessmentDueDate: {type: string, format: date-time} difficulty: type: string enum: [EASY, MEDIUM, HARD] visibleToStudents: {type: boolean} course: {$ref: '#/components/schemas/CourseForQuizExercise'} type: {type: string} randomizeQuestionOrder: {type: boolean} allowedNumberOfAttempts: {type: integer, format: int32} remainingNumberOfAttempts: {type: integer, format: int32} quizMode: type: string enum: [SYNCHRONIZED, BATCHED, INDIVIDUAL] duration: {type: integer, format: int32} quizBatches: type: array items: {$ref: '#/components/schemas/QuizBatch'} uniqueItems: true quizStarted: {type: boolean} quizEnded: {type: boolean} includedInOverallScore: type: string enum: [INCLUDED_COMPLETELY, INCLUDED_AS_BONUS, NOT_INCLUDED] mode: type: string enum: [INDIVIDUAL, TEAM] maxPoints: {type: number, format: double} bonusPoints: {type: number, format: double} exerciseVariantGroup: {$ref: '#/components/schemas/ExerciseVariantGroupReference'} quizQuestions: type: array items: {$ref: '#/components/schemas/QuizQuestionWithSolution'} DragAndDropMappingReEvaluate: type: object properties: dragItemId: {type: integer, format: int64} dropLocationId: {type: integer, format: int64} required: [dragItemId, dropLocationId] TutorialGroupFreePeriodRequest: type: object properties: startDate: {type: string, format: date-time} endDate: {type: string, format: date-time} reason: {type: string} required: [endDate, startDate] ArtifactLocation: type: object description: Location information for artifacts properties: type: type: string description: Type of artifact enum: [PROBLEM_STATEMENT, TEMPLATE_REPOSITORY, SOLUTION_REPOSITORY, TESTS_REPOSITORY] example: PROBLEM_STATEMENT filePath: {type: string, description: 'Path to file, empty or problem_statement.md for problem statement', example: src/main/java/Main.java} startLine: {type: integer, format: int32, description: Start line number (1-based)} endLine: {type: integer, format: int32, description: End line number (1-based)} suggestedInlineFix: type: [string, 'null'] description: Optional inline replacement code for this location required: [endLine, filePath, startLine, type] QuizBatch: type: object properties: id: {type: integer, format: int64} startTime: {type: string, format: date-time} started: {type: boolean} ended: {type: boolean} RewriteFaqResponse: type: object description: Response containing rewritten FAQ properties: rewrittenText: {type: string} inconsistencies: type: array items: {type: string} suggestions: type: array items: {type: string} improvement: {type: string} required: [improvement, inconsistencies, rewrittenText, suggestions] Timing: type: object description: Response containing consistency check timing properties: startTime: {type: string, description: Starting time, example: !!timestamp '2025-07-27T07:17:05.500Z'} endTime: {type: string, description: Ending time, example: !!timestamp '2025-07-27T07:17:05.500Z'} durationS: {type: number, format: double, description: Duration of consistency check, example: 27.765} RewriteFaqRequest: type: object description: Request to rewrite a FAQ properties: faqText: {type: string, minLength: 1} required: [faqText] DragAndDropSubmittedAnswerFromStudent: required: [mappings, questionId, type] type: object properties: questionId: {type: integer, format: int64} mappings: type: array items: {$ref: '#/components/schemas/DragAndDropMappingReEvaluate'} type: type: string default: drag-and-drop enum: [drag-and-drop] QuizQuestionWithoutSolution: type: object discriminator: propertyName: type mapping: {multiple-choice: '#/components/schemas/MultipleChoiceQuizQuestionWithoutSolution', drag-and-drop: '#/components/schemas/DragAndDropQuizQuestionWithoutSolution', short-answer: '#/components/schemas/ShortAnswerQuizQuestionWithoutSolution'} oneOf: - {$ref: '#/components/schemas/MultipleChoiceQuizQuestionWithoutSolution'} - {$ref: '#/components/schemas/DragAndDropQuizQuestionWithoutSolution'} - {$ref: '#/components/schemas/ShortAnswerQuizQuestionWithoutSolution'} properties: id: {type: integer, format: int64} title: {type: string} text: {type: string} hint: {type: string} points: {type: number, format: double} scoringType: type: string enum: [ALL_OR_NOTHING, PROPORTIONAL_WITH_PENALTY, PROPORTIONAL_WITHOUT_PENALTY] randomizeOrder: {type: boolean} invalid: {type: boolean} type: {type: string} answerOptions: type: array items: {$ref: '#/components/schemas/AnswerOptionWithoutSolution'} singleChoice: {type: boolean} backgroundFilePath: {type: string} dropLocations: type: array items: {$ref: '#/components/schemas/DropLocation'} dragItems: type: array items: {$ref: '#/components/schemas/DragItem'} spots: type: array items: {$ref: '#/components/schemas/ShortAnswerSpot'} solutions: type: array items: {$ref: '#/components/schemas/ShortAnswerSolution'} similarityValue: {type: integer, format: int32} matchLetterCase: {type: boolean} DifficultyAssessment: type: object properties: suggested: type: string enum: [EASY, MEDIUM, HARD, UNKNOWN] confidence: {type: number, format: double} reasoning: {type: string} matchesDeclared: {type: boolean} delta: type: string enum: [LOWER, MATCH, HIGHER, UNKNOWN] taskCount: {type: integer, format: int32} testCount: {type: integer, format: int32} QuizExerciseWithQuestions: type: object properties: id: {type: integer, format: int64} title: {type: string} shortName: {type: string} releaseDate: {type: string, format: date-time} startDate: {type: string, format: date-time} dueDate: {type: string, format: date-time} assessmentDueDate: {type: string, format: date-time} difficulty: type: string enum: [EASY, MEDIUM, HARD] visibleToStudents: {type: boolean} course: {$ref: '#/components/schemas/CourseForQuizExercise'} type: {type: string} randomizeQuestionOrder: {type: boolean} allowedNumberOfAttempts: {type: integer, format: int32} remainingNumberOfAttempts: {type: integer, format: int32} quizMode: type: string enum: [SYNCHRONIZED, BATCHED, INDIVIDUAL] duration: {type: integer, format: int32} quizBatches: type: array items: {$ref: '#/components/schemas/QuizBatch'} uniqueItems: true quizStarted: {type: boolean} quizEnded: {type: boolean} includedInOverallScore: type: string enum: [INCLUDED_COMPLETELY, INCLUDED_AS_BONUS, NOT_INCLUDED] mode: type: string enum: [INDIVIDUAL, TEAM] maxPoints: {type: number, format: double} bonusPoints: {type: number, format: double} exerciseVariantGroup: {$ref: '#/components/schemas/ExerciseVariantGroupReference'} quizQuestions: type: array items: {$ref: '#/components/schemas/QuizQuestionWithoutSolution'} Costs: type: object description: Response containing consistency check costs properties: promptEur: {type: number, format: double, description: Prompt costs in EUR, example: 0.011224} completionEur: {type: number, format: double, description: Completion costs in EUR, example: 0.016513} totalEur: {type: number, format: double, description: Total costs in EUR, example: 0.027738} TutorialGroupConfiguration: type: object properties: id: {type: integer, format: int64} tutorialPeriodStartInclusive: {type: string, minLength: 1} tutorialPeriodEndInclusive: {type: string, minLength: 1} useTutorialGroupChannels: {type: boolean} usePublicTutorialGroupChannels: {type: boolean} tutorialGroupFreePeriods: type: array items: {$ref: '#/components/schemas/TutorialGroupFreePeriod'} uniqueItems: true required: [tutorialPeriodEndInclusive, tutorialPeriodStartInclusive, usePublicTutorialGroupChannels, useTutorialGroupChannels] DragAndDropMapping: type: object properties: id: {type: integer, format: int64} dragItemIndex: {type: integer, format: int32} dropLocationIndex: {type: integer, format: int32} invalid: {type: boolean} dragItem: {$ref: '#/components/schemas/DragItem'} dropLocation: {$ref: '#/components/schemas/DropLocation'} MultipleChoiceSubmittedAnswerFromLiveClient: required: [type] type: object properties: quizQuestion: {$ref: '#/components/schemas/EntityIdRef'} selectedOptions: type: array items: {$ref: '#/components/schemas/EntityIdRef'} uniqueItems: true type: type: string default: multiple-choice enum: [multiple-choice] ProblemStatementGenerationResponse: type: object description: Response containing generated problem statement properties: draftProblemStatement: {type: string, description: Draft problem statement text} ShortAnswerSubmittedText: type: object properties: id: {type: integer, format: int64} text: {type: string} isCorrect: {type: boolean} spot: {$ref: '#/components/schemas/ShortAnswerSpot'} LeaderboardWithCurrentUserEntry: type: object properties: leaderboardEntries: type: array items: {$ref: '#/components/schemas/LeaderboardEntry'} hasUserSetSettings: {type: boolean} currentUserEntry: {$ref: '#/components/schemas/LeaderboardEntry'} currentTime: {type: string, format: date-time} required: [currentTime, currentUserEntry, leaderboardEntries] QuizQuestionGenerationRequest: type: object description: Request to generate quiz questions. Either topic or competencyIds must be provided. properties: topic: {type: string, description: Main topic for the generated quiz (used in free-topic mode), maxLength: 500, minLength: 1} competencyIds: type: array description: IDs of course competencies to assess (used in competency mode). Either topic or competencyIds must be provided. items: {type: integer, format: int64} minItems: 1 optionalPrompt: {type: string, description: Optional additional instructions, maxLength: 2000, minLength: 0} language: type: string description: Target language for the generated quiz enum: [en, de] questionTypes: type: array description: Question types to include items: type: string enum: [single-choice, multiple-choice, true-false] minItems: 1 uniqueItems: true numberOfQuestions: {type: integer, format: int32, description: Number of questions to generate, maximum: 10, minimum: 1} difficulty: {type: integer, format: int32, description: Difficulty as a value from 0 to 100, maximum: 100, minimum: 0} required: [difficulty, language, numberOfQuestions, questionTypes] TutorialGroupSummarySession: type: object properties: id: {type: integer, format: int64} start: {type: string, format: date-time} end: {type: string, format: date-time} status: type: string enum: [ACTIVE, CANCELLED] statusExplanation: {type: string} location: {type: string} tutorialGroupFreePeriod: {$ref: '#/components/schemas/TutorialGroupFreePeriod'} attendanceCount: {type: integer, format: int32} GlobalSearchResult: type: object description: Unified search result representing an entity found via global search properties: id: {type: string, description: Unique identifier of the entity} type: {type: string, description: 'Entity type, e.g. ''exercise'', ''lecture'', ''exam'''} title: {type: string, description: Display title of the entity} description: {type: string, description: Short description or body text excerpt} badge: {type: string, description: 'Human-readable badge label, e.g. ''Programming'', ''Quiz'', ''Lecture'''} metadata: type: object additionalProperties: {} description: Additional type-specific metadata such as courseId, dueDate, or points StudentQuizParticipationWithoutQuestions: required: [quizQuestionsType] type: object properties: id: {type: integer, format: int64} type: {type: string} initializationState: type: string enum: [UNINITIALIZED, REPO_COPIED, REPO_CONFIGURED, INACTIVE, BUILD_PLAN_COPIED, BUILD_PLAN_CONFIGURED, INITIALIZED, FINISHED] initializationDate: {type: string, format: date-time} student: {$ref: '#/components/schemas/DomainObject'} exercise: {$ref: '#/components/schemas/QuizExerciseWithoutQuestions'} submissions: type: array items: {$ref: '#/components/schemas/QuizSubmissionBeforeEvaluation'} uniqueItems: true quizQuestionsType: type: string default: before-quiz-start enum: [before-quiz-start] CodeGenerationRequest: type: object properties: repositoryType: type: string enum: [exercise, solution, tests, auxiliary, user] checkOnly: {type: boolean} initialAutoGeneration: {type: boolean} selectedFeedbackThreadIds: type: array items: {type: integer, format: int64} QuizQuestionRefinementResponse: description: Discriminated response for a single quiz question refinement, either a success with the refined question or a failure with an error message discriminator: {propertyName: type} oneOf: - {$ref: '#/components/schemas/QuizQuestionRefinementSuccess'} - {$ref: '#/components/schemas/QuizQuestionRefinementFailure'} properties: type: {type: string} required: [type] StudentQuizParticipationWithSolutions: required: [quizQuestionsType] type: object properties: id: {type: integer, format: int64} type: {type: string} initializationState: type: string enum: [UNINITIALIZED, REPO_COPIED, REPO_CONFIGURED, INACTIVE, BUILD_PLAN_COPIED, BUILD_PLAN_CONFIGURED, INITIALIZED, FINISHED] initializationDate: {type: string, format: date-time} student: {$ref: '#/components/schemas/DomainObject'} exercise: {$ref: '#/components/schemas/QuizExerciseWithSolution'} submissions: type: array items: {$ref: '#/components/schemas/QuizSubmissionAfterEvaluation'} uniqueItems: true quizQuestionsType: type: string default: after-quiz-end enum: [after-quiz-end] MultipleChoiceQuizQuestionWithoutSolution: type: object properties: id: {type: integer, format: int64} title: {type: string} text: {type: string} hint: {type: string} points: {type: number, format: double} scoringType: type: string enum: [ALL_OR_NOTHING, PROPORTIONAL_WITH_PENALTY, PROPORTIONAL_WITHOUT_PENALTY] randomizeOrder: {type: boolean} invalid: {type: boolean} type: type: string default: multiple-choice enum: [multiple-choice] answerOptions: type: array items: {$ref: '#/components/schemas/AnswerOptionWithoutSolution'} singleChoice: {type: boolean} required: [type] DomainObject: type: object properties: id: {type: integer, format: int64} ShortAnswerQuizQuestionWithoutSolution: type: object properties: id: {type: integer, format: int64} title: {type: string} text: {type: string} hint: {type: string} points: {type: number, format: double} scoringType: type: string enum: [ALL_OR_NOTHING, PROPORTIONAL_WITH_PENALTY, PROPORTIONAL_WITHOUT_PENALTY] randomizeOrder: {type: boolean} invalid: {type: boolean} type: type: string default: short-answer enum: [short-answer] spots: type: array items: {$ref: '#/components/schemas/ShortAnswerSpot'} solutions: type: array items: {$ref: '#/components/schemas/ShortAnswerSolution'} similarityValue: {type: integer, format: int32} matchLetterCase: {type: boolean} required: [type] TutorialGroupStudentImportData: type: object properties: login: {type: string, maxLength: 50, minLength: 0} registrationNumber: {type: string, maxLength: 10, minLength: 0} ChecklistActionRequest: type: object description: Request to apply an AI-powered checklist action to the problem statement properties: actionType: type: string description: Type of action to apply enum: [FIX_QUALITY_ISSUE, FIX_ALL_QUALITY_ISSUES, ADAPT_DIFFICULTY] problemStatementMarkdown: {type: string, description: Current problem statement markdown, maxLength: 50000, minLength: 1} context: type: object additionalProperties: {type: string} description: Action-specific context parameters required: [actionType, problemStatementMarkdown] AnswerOptionWithoutSolution: type: object properties: id: {type: integer, format: int64} text: {type: string} hint: {type: string} invalid: {type: boolean} StudentQuizParticipation: discriminator: propertyName: quizQuestionsType mapping: {after-quiz-end: '#/components/schemas/StudentQuizParticipationWithSolutions', live-quiz: '#/components/schemas/StudentQuizParticipationWithQuestions', before-quiz-start: '#/components/schemas/StudentQuizParticipationWithoutQuestions'} oneOf: - {$ref: '#/components/schemas/StudentQuizParticipationWithSolutions'} - {$ref: '#/components/schemas/StudentQuizParticipationWithQuestions'} - {$ref: '#/components/schemas/StudentQuizParticipationWithoutQuestions'} properties: quizQuestionsType: {type: string} required: [quizQuestionsType] CourseForQuizExercise: type: object properties: id: {type: integer, format: int64} title: {type: string} description: {type: string} shortName: {type: string} studentGroupName: {type: string} teachingAssistantGroupName: {type: string} editorGroupName: {type: string} instructorGroupName: {type: string} startDate: {type: string, format: date-time} endDate: {type: string, format: date-time} enrollmentStartDate: {type: string, format: date-time} enrollmentEndDate: {type: string, format: date-time} unenrollmentEndDate: {type: string, format: date-time} semester: {type: string} testCourse: {type: boolean} language: type: string enum: [ENGLISH, GERMAN] defaultProgrammingLanguage: type: string enum: [EMPTY, JAVA, PYTHON, C, HASKELL, KOTLIN, VHDL, ASSEMBLER, SWIFT, OCAML, JAVASCRIPT, C_SHARP, C_PLUS_PLUS, SQL, R, TYPESCRIPT, RUST, GO, MATLAB, BASH, RUBY, POWERSHELL, ADA, DART, PHP] onlineCourse: {type: boolean} courseInformationSharingConfiguration: type: string enum: [DISABLED, COMMUNICATION_AND_MESSAGING, COMMUNICATION_ONLY] maxComplaints: {type: integer, format: int32} maxTeamComplaints: {type: integer, format: int32} maxComplaintTimeDays: {type: integer, format: int32} maxRequestMoreFeedbackTimeDays: {type: integer, format: int32} maxComplaintTextLimit: {type: integer, format: int32} maxComplaintResponseTextLimit: {type: integer, format: int32} complaintsEnabled: {type: boolean} requestMoreFeedbackEnabled: {type: boolean} accuracyOfScores: {type: integer, format: int32} SubmittedAnswerBeforeEvaluation: type: object discriminator: propertyName: type mapping: {multiple-choice: '#/components/schemas/MultipleChoiceSubmittedAnswerBeforeEvaluation', drag-and-drop: '#/components/schemas/DragAndDropSubmittedAnswerBeforeEvaluation', short-answer: '#/components/schemas/ShortAnswerSubmittedAnswerBeforeEvaluation'} oneOf: - {$ref: '#/components/schemas/MultipleChoiceSubmittedAnswerBeforeEvaluation'} - {$ref: '#/components/schemas/DragAndDropSubmittedAnswerBeforeEvaluation'} - {$ref: '#/components/schemas/ShortAnswerSubmittedAnswerBeforeEvaluation'} properties: id: {type: integer, format: int64} quizQuestion: {$ref: '#/components/schemas/QuizQuestionWithoutSolution'} selectedOptions: type: array items: {$ref: '#/components/schemas/AnswerOptionWithoutSolution'} uniqueItems: true type: {type: string} mappings: type: array items: {$ref: '#/components/schemas/DragAndDropMapping'} uniqueItems: true submittedTexts: type: array items: {$ref: '#/components/schemas/ShortAnswerSubmittedText'} uniqueItems: true MultipleChoiceSubmittedAnswerBeforeEvaluation: type: object properties: id: {type: integer, format: int64} quizQuestion: {$ref: '#/components/schemas/QuizQuestionWithoutSolution'} selectedOptions: type: array items: {$ref: '#/components/schemas/AnswerOptionWithoutSolution'} uniqueItems: true type: type: string default: multiple-choice enum: [multiple-choice] required: [type] DragAndDropSubmittedAnswerBeforeEvaluation: type: object properties: id: {type: integer, format: int64} quizQuestion: {$ref: '#/components/schemas/QuizQuestionWithoutSolution'} mappings: type: array items: {$ref: '#/components/schemas/DragAndDropMapping'} uniqueItems: true type: type: string default: drag-and-drop enum: [drag-and-drop] required: [type] ShortAnswerSubmittedAnswerBeforeEvaluation: type: object properties: id: {type: integer, format: int64} quizQuestion: {$ref: '#/components/schemas/QuizQuestionWithoutSolution'} submittedTexts: type: array items: {$ref: '#/components/schemas/ShortAnswerSubmittedText'} uniqueItems: true type: type: string default: short-answer enum: [short-answer] required: [type] SubmittedAnswerFromStudent: discriminator: propertyName: type mapping: {multiple-choice: '#/components/schemas/MultipleChoiceSubmittedAnswerFromStudent', drag-and-drop: '#/components/schemas/DragAndDropSubmittedAnswerFromStudent', short-answer: '#/components/schemas/ShortAnswerSubmittedAnswerFromStudent'} oneOf: - {$ref: '#/components/schemas/MultipleChoiceSubmittedAnswerFromStudent'} - {$ref: '#/components/schemas/DragAndDropSubmittedAnswerFromStudent'} - {$ref: '#/components/schemas/ShortAnswerSubmittedAnswerFromStudent'} properties: type: {type: string} required: [type] QuizExerciseWithoutQuestions: type: object properties: id: {type: integer, format: int64} title: {type: string} shortName: {type: string} releaseDate: {type: string, format: date-time} startDate: {type: string, format: date-time} dueDate: {type: string, format: date-time} assessmentDueDate: {type: string, format: date-time} difficulty: type: string enum: [EASY, MEDIUM, HARD] visibleToStudents: {type: boolean} course: {$ref: '#/components/schemas/CourseForQuizExercise'} type: {type: string} randomizeQuestionOrder: {type: boolean} allowedNumberOfAttempts: {type: integer, format: int32} remainingNumberOfAttempts: {type: integer, format: int32} quizMode: type: string enum: [SYNCHRONIZED, BATCHED, INDIVIDUAL] duration: {type: integer, format: int32} quizBatches: type: array items: {$ref: '#/components/schemas/QuizBatch'} uniqueItems: true quizStarted: {type: boolean} quizEnded: {type: boolean} includedInOverallScore: type: string enum: [INCLUDED_COMPLETELY, INCLUDED_AS_BONUS, NOT_INCLUDED] mode: type: string enum: [INDIVIDUAL, TEAM] maxPoints: {type: number, format: double} bonusPoints: {type: number, format: double} exerciseVariantGroup: {$ref: '#/components/schemas/ExerciseVariantGroupReference'} StudentQuizParticipationWithQuestions: required: [quizQuestionsType] type: object properties: id: {type: integer, format: int64} type: {type: string} initializationState: type: string enum: [UNINITIALIZED, REPO_COPIED, REPO_CONFIGURED, INACTIVE, BUILD_PLAN_COPIED, BUILD_PLAN_CONFIGURED, INITIALIZED, FINISHED] initializationDate: {type: string, format: date-time} student: {$ref: '#/components/schemas/DomainObject'} exercise: {$ref: '#/components/schemas/QuizExerciseWithQuestions'} submissions: type: array items: {$ref: '#/components/schemas/QuizSubmissionBeforeEvaluation'} uniqueItems: true quizQuestionsType: type: string default: live-quiz enum: [live-quiz] MultipleChoiceSubmittedAnswerFromStudent: required: [questionId, selectedOptions, type] type: object properties: questionId: {type: integer, format: int64} selectedOptions: type: array items: {type: integer, format: int64} uniqueItems: true type: type: string default: multiple-choice enum: [multiple-choice] InferredCompetency: type: object properties: knowledgeAreaShortTitle: {type: string} competencyTitle: {type: string} competencyVersion: {type: string} catalogSourceId: {type: integer, format: int64} taxonomyLevel: {type: string} confidence: {type: number, format: double} rank: {type: integer, format: int32} evidence: type: array items: {type: string} whyThisMatches: {type: string} isLikelyPrimary: {type: boolean} relatedTaskNames: type: array items: {type: string} matchedCourseCompetencyId: {type: integer, format: int64} QuizQuestionBulkRefinementRequest: type: object description: Request to refine multiple quiz questions at once using a single user prompt properties: questions: {type: array, description: The quiz questions to refine, maxItems: 50, minItems: 1} refinementPrompt: {type: string, description: User instructions describing how all questions should be changed, maxLength: 2000, minLength: 1} required: [questions, refinementPrompt] SubmittedAnswerAfterEvaluation: type: object properties: id: {type: integer, format: int64} scoreInPoints: {type: number, format: double} quizQuestion: {$ref: '#/components/schemas/QuizQuestionWithSolution'} selectedOptions: type: array items: {$ref: '#/components/schemas/AnswerOptionWithSolution'} uniqueItems: true type: {type: string} mappings: type: array items: {$ref: '#/components/schemas/DragAndDropMapping'} uniqueItems: true submittedTexts: type: array items: {$ref: '#/components/schemas/ShortAnswerSubmittedText'} uniqueItems: true ShortAnswerSubmittedTextFromLiveClient: type: object properties: text: {type: string, maxLength: 255, minLength: 0} spot: {$ref: '#/components/schemas/EntityIdRef'} QuizQuestionBulkRefinementResponse: type: object description: Response containing one refinement result per input question, in the same order properties: refinements: type: array description: Refinement results, one per input question in the same order items: {$ref: '#/components/schemas/QuizQuestionRefinementResponse'} required: [refinements] LeaderboardEntry: type: object properties: rank: {type: integer, format: int32} selectedLeague: {type: integer, format: int32} userId: {type: integer, format: int64} userName: {type: string} imageURL: {type: string} score: {type: integer, format: int32} answeredCorrectly: {type: integer, format: int32} answeredWrong: {type: integer, format: int32} totalQuestions: {type: integer, format: int64} dueDate: {type: string, format: date-time} streak: {type: integer, format: int32} required: [dueDate, userName] ProblemStatementRefinementResponse: type: object description: Response containing refined problem statement properties: refinedProblemStatement: {type: string, description: Refined problem statement text} QuizQuestionGenerationResponse: type: object description: Response containing generated quiz questions properties: questions: {type: array, description: Generated quiz questions, minItems: 1} required: [questions] ProblemStatementGenerationRequest: type: object description: Request to generate a problem statement properties: userPrompt: {type: string, description: User prompt describing the problem statement requirements, maxLength: 1000, minLength: 1} required: [userPrompt] TutorialGroupFreePeriod: type: object properties: id: {type: integer, format: int64} start: {type: string} end: {type: string} reason: {type: string} required: [end, start] ShortAnswerSubmittedTextFromStudent: type: object properties: text: {type: string, maxLength: 255, minLength: 0} spotId: {type: integer, format: int64} required: [spotId, text] CalendarEvent: type: object properties: type: type: string enum: [LECTURE, TUTORIAL, EXAM, QUIZ_EXERCISE, TEXT_EXERCISE, MODELING_EXERCISE, PROGRAMMING_EXERCISE, FILE_UPLOAD_EXERCISE] title: {type: string} startDate: {type: string, format: date-time} endDate: {type: string, format: date-time} location: {type: string} facilitator: {type: string} required: [startDate, title, type] QuizQuestionTraining: type: object properties: quizQuestionWithSolutionDTO: {$ref: '#/components/schemas/QuizQuestionWithSolution'} isRated: {type: boolean} questionIds: type: array items: {type: integer, format: int64} uniqueItems: true isNewSession: {type: boolean} id: {type: integer, format: int64} required: [quizQuestionWithSolutionDTO] QualityIssue: type: object description: A quality issue found in the problem statement properties: category: type: string description: 'Issue category: CLARITY, COHERENCE, or COMPLETENESS' enum: [CLARITY, COHERENCE, COMPLETENESS] severity: type: string description: 'Issue severity: LOW, MEDIUM, or HIGH' enum: [LOW, MEDIUM, HIGH] description: {type: string, description: Description of what is wrong} location: {$ref: '#/components/schemas/QualityIssueLocation', description: Location in the problem statement} suggestedFix: {type: string, description: Concrete suggestion to fix the issue} impactOnLearners: {type: string, description: How this issue increases extraneous cognitive load} TutorialGroupImportData: type: object properties: title: {type: string} student: {$ref: '#/components/schemas/Student'} importSuccessful: {type: boolean} error: type: string enum: [NO_TITLE, NO_USER_FOUND, MULTIPLE_REGISTRATIONS] campus: {type: string} capacity: {type: integer, format: int32} language: {type: string} additionalInformation: {type: string} isOnline: {type: boolean} ConsistencyCheckResponse: type: object description: Response containing consistency check results properties: timestamp: {type: string, format: date-time, description: Timestamp of the response generation} issues: type: array description: List of consistency issues found items: {$ref: '#/components/schemas/ConsistencyIssue'} timing: {$ref: '#/components/schemas/Timing', description: Execution timing details} tokens: {$ref: '#/components/schemas/Tokens', description: Token usage statistics} costs: {$ref: '#/components/schemas/Costs', description: Costs statistics} required: [issues, timestamp] TutorialGroupSchedule: type: object properties: firstSessionStart: {type: string, format: date-time} firstSessionEnd: {type: string, format: date-time} repetitionFrequency: {type: integer, format: int32} tutorialPeriodEnd: {type: string, format: date} location: {type: string, maxLength: 255, minLength: 1} required: [firstSessionEnd, firstSessionStart, location, repetitionFrequency, tutorialPeriodEnd] MultipleChoiceQuizQuestionWithSolution: type: object properties: id: {type: integer, format: int64} title: {type: string} text: {type: string} hint: {type: string} points: {type: number, format: double} scoringType: type: string enum: [ALL_OR_NOTHING, PROPORTIONAL_WITH_PENALTY, PROPORTIONAL_WITHOUT_PENALTY] randomizeOrder: {type: boolean} invalid: {type: boolean} type: {type: string} explanation: {type: string} answerOptions: type: array items: {$ref: '#/components/schemas/AnswerOptionWithSolution'} singleChoice: {type: boolean} CreateOrUpdateTutorialGroupSessionRequest: type: object properties: date: {type: string, format: date} startTime: {type: string} endTime: {type: string} location: {type: string, maxLength: 2000, minLength: 1} attendance: {type: integer, format: int32} required: [date, endTime, location, startTime] TutorialGroupSession: type: object properties: id: {type: integer, format: int64} start: {type: string, format: date-time} end: {type: string, format: date-time} location: {type: string, maxLength: 255, minLength: 1} isCancelled: {type: boolean} isCancelledByFreePeriod: {type: boolean} locationChanged: {type: boolean} timeChanged: {type: boolean} dateChanged: {type: boolean} attendanceCount: {type: integer, format: int32} required: [dateChanged, end, id, isCancelled, isCancelledByFreePeriod, location, locationChanged, start, timeChanged] AnswerOptionWithSolution: type: object properties: id: {type: integer, format: int64} text: {type: string} hint: {type: string} invalid: {type: boolean} explanation: {type: string} isCorrect: {type: boolean} ShortAnswerSubmittedAnswerFromLiveClient: required: [type] type: object properties: quizQuestion: {$ref: '#/components/schemas/EntityIdRef'} submittedTexts: type: array items: {$ref: '#/components/schemas/ShortAnswerSubmittedTextFromLiveClient'} uniqueItems: true type: type: string default: short-answer enum: [short-answer] QuizSubmissionForResult: type: object properties: id: {type: integer, format: int64} submissionExerciseType: {type: string} submitted: {type: boolean} type: type: string enum: [MANUAL, TIMEOUT, TEST, OTHER, INSTRUCTOR, EXTERNAL] submissionDate: {type: string, format: date-time} scoreInPoints: {type: number, format: double} submittedAnswers: type: array items: {$ref: '#/components/schemas/SubmittedAnswerAfterEvaluation'} uniqueItems: true results: type: array items: {$ref: '#/components/schemas/ResultAfterEvaluation'} participation: {$ref: '#/components/schemas/StudentQuizParticipationWithSolutions'} QuizSubmissionFromLiveClient: type: object properties: id: {type: integer, format: int64} submittedAnswers: type: array items: {$ref: '#/components/schemas/SubmittedAnswerFromLiveClient'} uniqueItems: true QuizQuestionRefinementFailure: description: Failed refinement result containing an error message required: [error] type: object properties: error: {type: string, description: Error message describing why the refinement failed, minLength: 1} type: type: string enum: [failure] example: failure ConversationUser: type: object properties: id: {type: integer, format: int64} login: {type: string} name: {type: string} firstName: {type: string} lastName: {type: string} imageUrl: {type: string} isInstructor: {type: boolean} isEditor: {type: boolean} isTeachingAssistant: {type: boolean} isStudent: {type: boolean} isChannelModerator: {type: boolean} isRequestingUser: {type: boolean} StudentExport: type: object properties: registrationNumber: {type: string} firstName: {type: string} lastName: {type: string} ProblemStatementGlobalRefinementRequest: type: object description: Request to refine a problem statement globally using a user prompt properties: problemStatementText: {type: string, description: 'Original problem statement text to be refined (max 50,000 chars)', maxLength: 50000, minLength: 1} userPrompt: {type: string, description: User prompt for global refinement, maxLength: 1000, minLength: 1} required: [problemStatementText, userPrompt]