openapi: 3.1.0 info: title: Artemis Application Server API contact: {name: Stephan Krusche, email: krusche@tum.de} version: 8.8.2 servers: - {url: 'http://localhost:8080', description: Generated server url} paths: /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}: get: tags: [tutorial-group] operationId: getOneOfCourse 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/TutorialGroup'} put: tags: [tutorial-group] operationId: update 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/TutorialGroupUpdate'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroup'} delete: tags: [tutorial-group] operationId: delete 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}: 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}/tutorial-free-periods/{tutorialGroupFreePeriodId} : delete: tags: [tutorial-group-free-period] operationId: delete_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} responses: '200': {description: OK} /api/tutorialgroup/courses/{courseId}/tutorial-groups: get: tags: [tutorial-group] operationId: getAllForCourse parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroup'} post: tags: [tutorial-group] operationId: create parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: {$ref: '#/components/schemas/TutorialGroup'} required: true responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/TutorialGroup'} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/register/{studentLogin}: post: tags: [tutorial-group] operationId: registerStudent 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} /api/tutorialgroup/courses/{courseId}/tutorial-groups/{tutorialGroupId}/register-multiple: post: tags: [tutorial-group] operationId: registerMultipleStudentsToTutorialGroup 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/Student'} uniqueItems: true required: true responses: '200': description: OK content: application/json: schema: type: array items: {$ref: '#/components/schemas/Student'} uniqueItems: true /api/tutorialgroup/courses/{courseId}/tutorial-groups/import: post: tags: [tutorial-group] operationId: importRegistrations parameters: - name: courseId in: path required: true schema: {type: integer, format: int64} requestBody: content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupRegistrationImport'} uniqueItems: true required: true responses: '200': description: OK content: application/json: schema: type: array items: {$ref: '#/components/schemas/TutorialGroupRegistrationImport'} /api/hyperion/programming-exercises/{programmingExerciseId}/consistency-check: post: tags: [hyperion-problem-statement] operationId: checkExerciseConsistency parameters: - name: programmingExerciseId in: path required: true schema: {type: integer, format: int64} responses: '200': description: OK content: application/json: schema: {$ref: '#/components/schemas/ConsistencyCheckResponse'} /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/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/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/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/TutorialGroupExport'} /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/tutorialgroup/courses/{courseId}/tutorial-groups/campus-values: get: tags: [tutorial-group] operationId: getUniqueCampusValues 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-group-detail/{tutorialGroupId}: get: tags: [tutorial-group] operationId: getTutorialGroupDetailGroupDTO 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/TutorialGroupDetailGroup'} /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: 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} TutorialGroup: type: object properties: id: {type: integer, format: int64} title: {type: string, maxLength: 19, minLength: 1} teachingAssistant: {$ref: '#/components/schemas/TeachingAssistant'} additionalInformation: {type: string} capacity: {type: integer, format: int32} isOnline: {type: boolean} language: {type: string} campus: {type: string} TutorialGroupStatus: type: object properties: status_explanation: {type: string} ProblemStatementGenerationResponse: type: object description: Response containing generated problem statement properties: draftProblemStatement: {type: string, description: Draft problem statement text} error: {type: string, description: Error message if generation failed} 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: 0} 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: 0} required: [endLine, instruction, problemStatementText, startLine] CodeGenerationRequest: type: object properties: repositoryType: type: string enum: [exercise, solution, tests, auxiliary, user] checkOnly: {type: boolean} TutorialGroupDetailSession: type: object properties: start: {type: string, format: date-time} end: {type: string, format: date-time} location: {type: string} isCancelled: {type: boolean} locationChanged: {type: boolean} timeChanged: {type: boolean} dateChanged: {type: boolean} attendanceCount: {type: integer, format: int32} required: [end, location, start] CodeGenerationJobStart: type: object properties: jobId: {type: string} 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] TutorialGroupDetailGroup: type: object properties: id: {type: integer, format: int64} title: {type: string} language: {type: string} isOnline: {type: boolean} teachingAssistantName: {type: string} teachingAssistantLogin: {type: string} teachingAssistantImageUrl: {type: string} capacity: {type: integer, format: int32} campus: {type: string} groupChannelId: {type: integer, format: int64} tutorChatId: {type: integer, format: int64} sessions: type: array items: {$ref: '#/components/schemas/TutorialGroupDetailSession'} required: [language, sessions, teachingAssistantLogin, teachingAssistantName, title] 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} ProblemStatementRefinementResponse: type: object description: Response containing refined problem statement properties: refinedProblemStatement: {type: string, description: Refined problem statement text} 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: 0} required: [userPrompt] 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] 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} TutorialGroupRegistrationImport: 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} 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} TutorialGroupUpdate: type: object properties: tutorialGroup: {$ref: '#/components/schemas/TutorialGroup'} notificationText: {type: string, maxLength: 1000, minLength: 1} updateTutorialGroupChannelName: {type: boolean} required: [tutorialGroup] 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] 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] TeachingAssistant: type: object properties: login: {type: string} 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)} required: [endLine, filePath, startLine, type] 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] TutorialGroupExport: 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'} 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] 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} TutorialGroupSessionRequest: type: object properties: date: {type: string, format: date} startTime: {type: string} endTime: {type: string} location: {type: string, maxLength: 2000, minLength: 1} 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]