{"openapi": "3.1.0", "info": {"title": "StudyPlanner AI API", "version": "1", "description": "Public course catalog of the StudyPlanner for Informatik at the University of Tübingen. Read-only; no personal data."}, "servers": [{"url": "https://studyplaner.pages.dev"}], "paths": {"/api/ai/catalog/search": {"post": {"operationId": "searchCourses", "summary": "Search Informatics courses across semesters", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"query": {"type": "string", "description": "Free-text search over title, number, organisation."}, "limit": {"type": "integer", "minimum": 1, "maximum": 25, "default": 10}, "periodId": {"type": "string", "description": "Catalog period id, or 'all' for the deduplicated multi-semester catalog (default)."}, "ects": {"type": "object", "description": "ECTS filter; use exact, or min/max for a range.", "properties": {"min": {"type": "number"}, "max": {"type": "number"}, "exact": {"type": "number"}}}, "weekdays": {"type": "array", "items": {"type": "string"}, "description": "Weekdays a course must meet on, e.g. ['Monday','Mi'] (German or English)."}, "timeWindow": {"type": "object", "description": "Only courses whose slots fall fully inside this window.", "properties": {"start": {"type": "string", "description": "'HH:MM'"}, "end": {"type": "string", "description": "'HH:MM'"}}}, "courseTypes": {"type": "array", "items": {"type": "string"}, "description": "Course-type keywords, e.g. ['lecture','seminar','Vorlesung']."}, "studyAreaCodes": {"type": "array", "items": {"type": "string"}, "description": "Regulation study-area codes, e.g. ['INFO-THEO','ML-FOUND']."}, "termTypes": {"type": "array", "items": {"type": "string", "enum": ["summer", "winter"]}, "description": "Restrict to summer and/or winter courses."}}}}}}, "responses": {"200": {"description": "Matching courses with compact metadata.", "content": {"application/json": {"schema": {"type": "object"}}}}}}}, "/api/ai/catalog/resolve-course": {"post": {"operationId": "resolveCourse", "summary": "Resolve a course number (and optional title hint) to a current course id", "description": "Numeric course ids are period/import specific. Resolve a stable course number into the current id before quoting or linking a course.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["courseNumber"], "properties": {"courseNumber": {"type": "string"}, "periodId": {"type": "string", "description": "Catalog period id, or 'all' (default)."}, "titleHint": {"type": "string", "description": "Optional title fragment to disambiguate."}}}}}}, "responses": {"200": {"description": "Best-match course plus candidate list.", "content": {"application/json": {"schema": {"type": "object"}}}}}}}, "/api/ai/catalog/courses/{courseId}": {"get": {"operationId": "getCourseDetail", "summary": "Get the full public detail of one course", "parameters": [{"name": "courseId", "in": "path", "required": true, "schema": {"type": "integer"}}], "responses": {"200": {"description": "Course detail including description, schedule, and exams.", "content": {"application/json": {"schema": {"type": "object"}}}}, "404": {"description": "Unknown course id."}}}}}}