openapi: 3.2.0 info: title: TUM App Backend Campus API version: 1.0.0 description: REST surface of the TUM Campus App backend — the backend behind the official Technical University of Munich Campus App (Android/iOS), listed by TUM IT (CIO) under Mobile Apps. Serves campus news, alerts, student clubs, cinema listings, canteen and dish ratings, device registration and feedback. Generated by grpc-gateway from tumdev/campus_backend.proto; the same service is exposed over gRPC at api-grpc.tum.app. contact: name: Open Source @ TUM e.V. (TUM-Dev) url: https://www.tum.dev/ license: name: GPL-3.0 url: https://www.gnu.org/licenses/gpl-3.0.en.html servers: - url: https://api.tum.app/v1 description: production tags: - name: Campus paths: /canteen/allCanteens: get: operationId: Campus_ListCanteens tags: - Campus responses: '200': description: Response. content: application/json: schema: type: array items: $ref: '#/components/schemas/apiCanteen' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /canteen/headCount/{canteenId}: get: operationId: Campus_GetCanteenHeadCount tags: - Campus parameters: - name: canteenId in: path required: true description: The requested canteen ID schema: type: string responses: '200': description: A successful response. content: application/json: schema: $ref: '#/components/schemas/apiGetCanteenHeadCountReply' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /canteen/rating/allRatingTags: get: operationId: Campus_ListAvailableCanteenTags tags: - Campus responses: '200': description: Response. content: application/json: schema: type: array items: $ref: '#/components/schemas/apiTagsOverview' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /canteen/rating/get: post: summary: This endpoint retrieves Canteen Ratings from the Backend. operationId: Campus_ListCanteenRatings tags: - Campus requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/apiListCanteenRatingsRequest' responses: '200': description: A successful response. content: application/json: schema: $ref: '#/components/schemas/apiListCanteenRatingsReply' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /canteen/rating/new: post: operationId: Campus_CreateCanteenRating tags: - Campus requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/apiCreateCanteenRatingRequest' responses: '200': description: A successful response. content: application/json: schema: $ref: '#/components/schemas/apiCreateCanteenRatingReply' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /device: post: summary: Create an device (Android/iOS/Windows) for push notifications operationId: Campus_CreateDevice tags: - Campus requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/apiCreateDeviceRequest' responses: '200': description: A successful response. content: application/json: schema: $ref: '#/components/schemas/apiCreateDeviceReply' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /device/{deviceId}: delete: summary: Delete a device from push notifications operationId: Campus_DeleteDevice tags: - Campus parameters: - name: deviceId in: path required: true schema: type: string - name: deviceType in: query required: false schema: type: string enum: - IOS - ANDROID - WINDOWS default: IOS responses: '200': description: A successful response. content: application/json: schema: $ref: '#/components/schemas/apiDeleteDeviceReply' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /dish/rating/allDishTags: get: operationId: Campus_ListNameTags tags: - Campus responses: '200': description: Response. content: application/json: schema: type: array items: $ref: '#/components/schemas/apiTagsOverview' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /dish/rating/allRatingTags: get: operationId: Campus_ListAvailableDishTags tags: - Campus responses: '200': description: Response. content: application/json: schema: type: array items: $ref: '#/components/schemas/apiTagsOverview' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /dish/rating/get: post: summary: Allows to query ratings for a specific dish in a specific cafeteria. operationId: Campus_GetDishRatings tags: - Campus requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/apiGetDishRatingsRequest' responses: '200': description: A successful response. content: application/json: schema: $ref: '#/components/schemas/apiGetDishRatingsReply' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /dish/rating/new: post: operationId: Campus_CreateDishRating tags: - Campus requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/apiCreateDishRatingRequest' responses: '200': description: A successful response. content: application/json: schema: $ref: '#/components/schemas/apiCreateDishRatingReply' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /dishes: get: summary: Returns all dishes for a specific cafeteria, year, week and day operationId: Campus_ListDishes tags: - Campus parameters: - name: canteenId in: query required: false schema: type: string - name: year in: query required: false description: '>=2022 until the current year' schema: type: integer format: int32 - name: week in: query required: false description: Must be in the range 1 - 52 schema: type: integer format: int32 - name: day in: query required: false description: 'Day of the week Days must be in the range 0 (Monday) - 4 (Friday)' schema: type: integer format: int32 responses: '200': description: Response. content: application/json: schema: type: array items: type: string default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /feedback: post: operationId: Campus_CreateFeedback tags: - Campus parameters: - name: recipient in: query required: false description: "who is the feedback for\n\n - TUM_DEV: Feedback for the TUM Dev Team\n - TUM_CONTACT: Feedback for the general TUM Contact Form" schema: type: string enum: - TUM_DEV - TUM_CONTACT default: TUM_DEV - name: fromEmail in: query required: false description: the email address of the user schema: type: string - name: fromName in: query required: false description: how the person wants to be called schema: type: string - name: message in: query required: false description: The actual message schema: type: string - name: location.latitude in: query required: false schema: type: number format: double - name: location.longitude in: query required: false schema: type: number format: double - name: osVersion in: query required: false description: Optional os information which the user can choose (data protection) to attach or not schema: type: string - name: appVersion in: query required: false description: Optional app information which the user can choose (data protection) to attach or not schema: type: string requestBody: required: true content: application/json: schema: type: string format: byte description: 'Optional file in Base64. Accepted file formats: jpeg, jpg, png, webp, md, txt, pdf Maximum file size 4MB as by Protobuf maximum per request message size (streaming inputs)' description: 'Optional file in Base64. Accepted file formats: jpeg, jpg, png, webp, md, txt, pdf Maximum file size 4MB as by Protobuf maximum per request message size (streaming inputs)' responses: '200': description: A successful response. content: application/json: schema: $ref: '#/components/schemas/apiCreateFeedbackReply' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /movies/{lastId}: get: operationId: Campus_ListMovies tags: - Campus parameters: - name: lastId in: path required: true description: the last Id you have requested. Use -1 to get all movies schema: type: integer format: int32 - name: oldestDateAt in: query required: false description: the oldest time you want to be included in the response schema: type: string format: date-time responses: '200': description: A successful response. content: application/json: schema: $ref: '#/components/schemas/apiListMoviesReply' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /news: get: operationId: Campus_ListNews tags: - Campus parameters: - name: lastNewsId in: query required: false description: the last id of the news item received. 0 to get all news items schema: type: integer format: int32 - name: newsSource in: query required: false description: filter by news source id. 0 to get all news items schema: type: integer format: int32 - name: oldestDateAt in: query required: false description: the oldest time you want to be included in the response schema: type: string format: date-time responses: '200': description: Response. content: application/json: schema: type: array items: $ref: '#/components/schemas/apiNews' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /news/alerts: get: operationId: Campus_ListNewsAlerts tags: - Campus parameters: - name: lastNewsAlertId in: query required: false description: the last id of the news item received. 0 to get all news items schema: type: integer format: int32 responses: '200': description: Response. content: application/json: schema: type: array items: $ref: '#/components/schemas/apiNewsAlert' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /news/sources: get: operationId: Campus_ListNewsSources tags: - Campus responses: '200': description: Response. content: application/json: schema: type: array items: $ref: '#/components/schemas/apiNewsSource' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /student_clubs: get: summary: List all avaliable student clubs operationId: Campus_ListStudentClub tags: - Campus parameters: - name: language in: query required: false description: 'Language of the student clubs and categories Defaults to german' schema: type: string enum: - German - English default: German responses: '200': description: A successful response. content: application/json: schema: $ref: '#/components/schemas/apiListStudentClubReply' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' /updatenote/{version}: get: operationId: Campus_GetUpdateNote tags: - Campus parameters: - name: version in: path required: true schema: type: string format: int64 responses: '200': description: A successful response. content: application/json: schema: $ref: '#/components/schemas/apiGetUpdateNoteReply' default: description: An unexpected error response. content: application/json: schema: $ref: '#/components/schemas/rpcStatus' components: schemas: apiRatingTag: type: object properties: tagId: type: string format: int64 points: type: number format: double apiCreateDishRatingReply: type: object apiNewsAlert: type: object properties: imageUrl: type: string link: type: string created: type: string format: date-time from: type: string format: date-time to: type: string format: date-time apiCreateCanteenRatingRequest: type: object properties: points: type: integer format: int32 title: number in the range 1-5 canteenId: type: string image: type: string format: byte ratingTags: type: array items: $ref: '#/components/schemas/apiRatingTag' title: Optional list of tag ratings add as many tags with a rating (1-5) of the list of canteenRatingTags comment: type: string title: Optional comment (max 256 chars) apiGetDishRatingsRequest: type: object properties: canteenId: type: string title: Mandatory Name of the canteen (EAT-API naming scheme "MENSA_GARCHING") dish: type: string title: 'Mandatory Name of the dish (EAT-API naming scheme) Must be available in the given cafeteria' from: type: string format: date-time title: Optional Parameter to define an interval for the ratings (Lower bound) to: type: string format: date-time title: Optional Parameter to define an interval for the ratings (Upper bound) limit: type: integer format: int32 title: Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" apiGetDishRatingsReply: type: object properties: rating: type: array items: $ref: '#/components/schemas/apiSingleRatingReply' title: a number of actual ratings avg: type: number format: double title: average rating for all dish rating tags which were used to rate this dish in this cafeteria std: type: number format: double title: std of all dish rating tags which were used to rate this dish in this cafeteria min: type: integer format: int32 title: minimum of all dish rating tags which were used to rate this dish in this cafeteria max: type: integer format: int32 title: maximum of all dish rating tags which were used to rate this dish in this cafeteria ratingTags: type: array items: $ref: '#/components/schemas/apiRatingTagResult' nameTags: type: array items: $ref: '#/components/schemas/apiRatingTagResult' apiListMoviesReply: type: object properties: movies: type: array items: $ref: '#/components/schemas/apiMovie' apiStudentClub: type: object properties: name: type: string title: The name of the club description: type: string title: How the club describes itsself linkUrl: type: string title: Where the clubs main internet presence is coverUrl: type: string title: Where to find a image for this club apiCreateDeviceReply: type: object properties: deviceId: type: string apiStudentClubCollection: type: object properties: title: type: string description: type: string clubs: type: array items: $ref: '#/components/schemas/apiStudentClub' unstableCollectionId: type: string format: uint64 title: 'id of the collection. Might not be stable over time because of scraping' apiListStudentClubReply: type: object properties: collections: type: array items: $ref: '#/components/schemas/apiStudentClubCollection' apiCreateDeviceRequest: type: object properties: deviceId: type: string publicKey: type: string deviceType: $ref: '#/components/schemas/apiDeviceType' apiCreateFeedbackReply: type: object apiDeviceType: type: string enum: - IOS - ANDROID - WINDOWS default: IOS apiGetUpdateNoteReply: type: object properties: message: type: string versionName: type: string apiSingleRatingReply: type: object properties: points: type: integer format: int32 title: number in the range 1-5 image: type: string format: byte title: Optional JPEG image in Base64 comment: type: string title: Optional comment (max 256 chars) ratingTags: type: array items: $ref: '#/components/schemas/apiRatingTagNewRequest' visited: type: string format: date-time apiListCanteenRatingsReply: type: object properties: rating: type: array items: $ref: '#/components/schemas/apiSingleRatingReply' avg: type: number format: double std: type: number format: double min: type: integer format: int32 max: type: integer format: int32 ratingTags: type: array items: $ref: '#/components/schemas/apiRatingTagResult' apiGetCanteenHeadCountReply: type: object properties: count: type: integer format: int64 description: The absolut count of humans in the canteen. Only valid in case percent != -1. maxCount: type: integer format: int64 description: The maximum nunmber of humans in the canteen for the percent to be 100.00. Only valid in case percent != -1. percent: type: number format: float description: Current capacity utilization of the canteen clamped to 0 and 100 or -1 in case no data is available. timestamp: type: string format: date-time description: A time stamp indicating how up to date the response is. Only valid in case percent != -1. apiRatingTagResult: type: object properties: tagId: type: integer format: int32 avg: type: number format: double std: type: number format: double min: type: integer format: int32 max: type: integer format: int32 apiRatingTagNewRequest: type: object properties: tagId: type: integer format: int32 points: type: integer format: int32 apiTagsOverview: type: object properties: tagId: type: integer format: int32 de: type: string en: type: string apiNewsSource: type: object properties: source: type: string title: type: string iconUrl: type: string title: where the icon can be found apiListCanteenRatingsRequest: type: object properties: canteenId: type: string title: canteenId Mandatory Name of the canteen (EAT-API naming scheme "MENSA_GARCHING") from: type: string format: date-time title: Optional Parameter to define an interval for the ratings (Lower bound) to: type: string format: date-time title: Optional Parameter to define an interval for the ratings (Upper bound) limit: type: integer format: int32 title: Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" apiCanteen: type: object properties: id: type: string address: type: string longitude: type: number format: double latitude: type: number format: double apiCreateDishRatingRequest: type: object properties: points: type: integer format: int32 title: number in the range 1-5 canteenId: type: string title: Mandatory Name of the dish (EAT-API naming scheme "MENSA_GARCHING") Must be available in the given cafeteria dish: type: string title: 'Mandatory Name of the dish (EAT-API naming scheme) Must be available in the given cafeteria' image: type: string format: byte title: Optional JPEG image in Base64 ratingTags: type: array items: $ref: '#/components/schemas/apiRatingTag' title: Optional list of tag ratings add as many tags with a rating (1-5) of the list of dishRatingTags comment: type: string title: Optional comment (max 256 chars) rpcStatus: type: object properties: code: type: integer format: int32 message: type: string details: type: array items: $ref: '#/components/schemas/protobufAny' apiNews: type: object properties: id: type: string format: int64 title: type: string text: type: string link: type: string imageUrl: type: string title: where a news thumbnail is stored. empty string means no image is available sourceId: type: string title: the id of the news source sourceIconUrl: type: string title: where the icon can be found sourceTitle: type: string title: human readable title of the news source created: type: string format: date-time title: when the news item was created in OUR database date: type: string format: date-time title: the date of the news item apiDeleteDeviceReply: type: object properties: deviceId: type: string protobufAny: type: object properties: '@type': type: string additionalProperties: {} apiMovie: type: object properties: movieId: type: string format: int64 title: the id of the movie date: type: string format: date-time title: the date of the movie created: type: string format: date-time title: when the movie was created in OUR database title: type: string title: title of the movie if available, empty otherwise location: type: string title: Where the movie is shown releaseYear: type: string title: release year of the movie if available, empty otherwise runtime: type: string title: runtime of the movie if available, empty otherwise genre: type: string title: genre of the movie if available, empty otherwise director: type: string title: director of the movie as by omdb(/tu-film), empty otherwise actors: type: string title: actors of the movie as by omdb(/tu-film), empty otherwise imdbRating: type: string title: imdb rating for the movie if available, empty otherwise description: type: string title: short description of the movie including limited html tags (only , ) trailerUrl: type: string title: Where to find a trailer for this movie additionalInformationUrl: type: string title: Where to find additional information about this movie coverId: type: string format: int64 title: the id of the cover image coverUrl: type: string title: Where to find a cover image for this movie apiCreateCanteenRatingReply: type: object x-operator: institution x-operator-note: 'api.tum.app is the TUM-branded registrable domain serving the official TUM Campus App. The service is built and operated by Open Source @ TUM e.V. (TUM-Dev), a TUM-affiliated association promoted by TUM IT, and the app is listed as a TUM mobile app on it.tum.de. No vendor platform is involved: the contract, the code and the deployment are all TUM-side.' x-provenance: generated: '2026-08-19' method: searched source: https://api.tum.app/swagger/swagger.json note: Found 2026-08-19 by probing the Swagger UI shell at https://api.tum.app/ — its declared spec URL ./swagger.json returns the UI HTML (soft 200), the real document is one level down at /swagger/swagger.json. Pristine Swagger 2.0 copy kept at openapi/_original/tum-campus-backend-swagger.json; this file is a mechanical 2.0 -> 3.0.3 structural conversion of it, with servers[] filled from the live host the document was fetched from. No operation, parameter or schema was invented.