diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 50eb362cd2e9c0e79882d923b3386fd680b5338c..da21104704623c6d9b8c26b5623b2d63e5dc17b3 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -30,6 +30,7 @@ Added
 * [Dev] Introduce new mechanism to register classes over all apps.
 * Data template for `room` model used for haystack search indexing moved to core.
 * Support for two factor authentication via email codes and Webauthn.
+* GraphQL schema for Rooms
 
 Changed
 ~~~~~~~
diff --git a/aleksis/core/schema/__init__.py b/aleksis/core/schema/__init__.py
index deab0e28b5d93e854a020aad687a618817196536..e752d6e456dce1509360990cb8e685b7a12d48c9 100644
--- a/aleksis/core/schema/__init__.py
+++ b/aleksis/core/schema/__init__.py
@@ -9,7 +9,15 @@ from haystack.inputs import AutoQuery
 from haystack.query import SearchQuerySet
 from haystack.utils.loading import UnifiedIndex
 
-from ..models import CustomMenu, DynamicRoute, Notification, PDFFile, Person, TaskUserAssignment
+from ..models import (
+    CustomMenu,
+    DynamicRoute,
+    Notification,
+    PDFFile,
+    Person,
+    Room,
+    TaskUserAssignment,
+)
 from ..util.apps import AppConfig
 from ..util.core_helpers import get_allowed_object_ids, get_app_module, get_app_packages, has_person
 from .celery_progress import CeleryProgressFetchedMutation, CeleryProgressType
@@ -21,6 +29,7 @@ from .message import MessageType
 from .notification import MarkNotificationReadMutation, NotificationType
 from .pdf import PDFFileType
 from .person import PersonMutation, PersonType
+from .room import RoomType
 from .school_term import SchoolTermType  # noqa
 from .search import SearchResultType
 from .system_properties import SystemPropertiesType
@@ -59,6 +68,8 @@ class Query(graphene.ObjectType):
 
     two_factor = graphene.Field(TwoFactorType)
 
+    rooms = graphene.List(RoomType)
+
     def resolve_ping(root, info, payload) -> str:
         return payload
 
@@ -157,6 +168,12 @@ class Query(graphene.ObjectType):
             return None
         return info.context.user
 
+    @staticmethod
+    def resolve_rooms(root, info, **kwargs):
+        if info.context.user.is_anonymous:
+            return []
+        return Room.objects.all()
+
 
 class Mutation(graphene.ObjectType):
     update_person = PersonMutation.Field()
diff --git a/aleksis/core/schema/room.py b/aleksis/core/schema/room.py
new file mode 100644
index 0000000000000000000000000000000000000000..d4f76700793d2f7eededaac1b0361ebeff1a6a5a
--- /dev/null
+++ b/aleksis/core/schema/room.py
@@ -0,0 +1,9 @@
+from graphene_django import DjangoObjectType
+
+from ..models import Room
+
+
+class RoomType(DjangoObjectType):
+    class Meta:
+        model = Room
+        fields = ("id", "name", "short_name")