diff --git a/program/views.py b/program/views.py
index 852481026314cee79a99f4ea4e36e95dfb4c9a37..b83cd17a72734e64878431731de5f078152204f9 100644
--- a/program/views.py
+++ b/program/views.py
@@ -43,6 +43,7 @@ from program.models import (
     LinkType,
     MusicFocus,
     Note,
+    RRule,
     Schedule,
     ScheduleConflictError,
     Show,
@@ -60,6 +61,7 @@ from program.serializers import (
     LinkTypeSerializer,
     MusicFocusSerializer,
     NoteSerializer,
+    RRuleSerializer,
     ScheduleConflictResponseSerializer,
     ScheduleCreateUpdateRequestSerializer,
     ScheduleDryRunResponseSerializer,
@@ -350,6 +352,15 @@ class APIShowViewSet(DisabledObjectPermissionCheckMixin, viewsets.ModelViewSet):
         return Response(status=status.HTTP_204_NO_CONTENT)
 
 
+@extend_schema_view(
+    retrieve=extend_schema(summary="Retrieve a single rrule."),
+    list=extend_schema(summary="List all rrule."),
+)
+class APIRRuleViewSet(viewsets.ModelViewSet):
+    queryset = RRule.objects.all()
+    serializer_class = RRuleSerializer
+
+
 @extend_schema_view(
     create=extend_schema(
         summary="Create a new schedule.",