diff --git a/program/filters.py b/program/filters.py
index 188133acb2d3d535c47d38466170a5b4a9f0ddef..9be299df8f04c83fa1c5fe765e4624a6dceb491b 100644
--- a/program/filters.py
+++ b/program/filters.py
@@ -199,3 +199,12 @@ class TimeSlotFilterSet(filters.FilterSet):
             def clean_end(self):
                 end = self.cleaned_data.get("end", None)
                 return end or self.cleaned_data["start"] + datetime.timedelta(days=60)
+
+
+class ActiveFilterSet(StaticFilterHelpTextMixin, filters.FilterSet):
+    active = filters.BooleanFilter(field_name="is_active")
+
+    class Meta:
+        fields = [
+            "active",
+        ]
diff --git a/program/views.py b/program/views.py
index 6fecaef580e3eb167968242f8c15fe26588fcacd..4293d3546f73539e9c955834f5f87d5f4cb1b66b 100644
--- a/program/views.py
+++ b/program/views.py
@@ -820,99 +820,67 @@ class APINoteViewSet(viewsets.ModelViewSet):
         return Response(status=status.HTTP_204_NO_CONTENT)
 
 
-class ActiveInactiveViewSet(viewsets.ModelViewSet):
-    permission_classes = [permissions.DjangoModelPermissionsOrAnonReadOnly]
-
-    def get_queryset(self: viewsets.ModelViewSet):
-        """Filters"""
-
-        if self.request.query_params.get("active") == "true":
-            return self.queryset.model.objects.filter(is_active=True)
-
-        if self.request.query_params.get("active") == "false":
-            return self.queryset.model.objects.filter(is_active=False)
-
-        return self.queryset.model.objects.all()
+class ActiveFilterMixin:
+    filter_class = filters.ActiveFilterSet
 
 
-class APICategoryViewSet(ActiveInactiveViewSet):
+class APICategoryViewSet(ActiveFilterMixin, viewsets.ModelViewSet):
     """
-    /categories/ returns all categories (GET, POST)
-    /categories/?active=true returns all active categories (GET)
-    /categories/?active=false returns all inactive categories (GET)
-    /categories/{pk} Returns a category by its ID (GET, PUT, DELETE)
+    Returns a list of categories.
     """
 
     queryset = Category.objects.all()
     serializer_class = CategorySerializer
 
 
-class APITypeViewSet(ActiveInactiveViewSet):
+class APITypeViewSet(ActiveFilterMixin, viewsets.ModelViewSet):
     """
-    /types/ returns all types (GET, POST)
-    /types/?active=true returns all active types (GET)
-    /types/?active=false returns all inactive types (GET)
-    /types/{pk} returns a type by its ID (GET, PUT, DELETE)
+    Returns a list of types.
     """
 
     queryset = Type.objects.all()
     serializer_class = TypeSerializer
 
 
-class APITopicViewSet(ActiveInactiveViewSet):
+class APITopicViewSet(ActiveFilterMixin, viewsets.ModelViewSet):
     """
-    /topics/: Returns all topics (GET, POST)
-    /topics/?active=true Returns all active topics (GET)
-    /topics/?active=false Returns all inactive topics (GET)
-    /topics/{pk}: Returns a topic by its ID (GET, PUT, DELETE)
+    Returns a list of topics.
     """
 
     queryset = Topic.objects.all()
     serializer_class = TopicSerializer
 
 
-class APIMusicFocusViewSet(ActiveInactiveViewSet):
+class APIMusicFocusViewSet(ActiveFilterMixin, viewsets.ModelViewSet):
     """
-    /musicfocus/ returns all music focuses (GET, POST)
-    /musicfocus/?active=true: returns all active music focuses (GET)
-    /musicfocus/?active=false: returns all inactive music focuses (GET)
-    /musicfocus/{pk}: returns a music focus by its ID (GET, PUT, DELETE)
+    Returns a list of music focuses.
     """
 
     queryset = MusicFocus.objects.all()
     serializer_class = MusicFocusSerializer
 
 
-class APIFundingCategoryViewSet(ActiveInactiveViewSet):
+class APIFundingCategoryViewSet(ActiveFilterMixin, viewsets.ModelViewSet):
     """
-    /fundingcategories/: returns all funding categories (GET, POST)
-    /fundingcategories/?active=true returns all active funding categories (GET)
-    /fundingcategories/?active=false returns all inactive funding categories (GET)
-    /fundingcategories/{pk} returns a funding category by its ID (GET, PUT, DELETE)
+    Returns a list of funding categories.
     """
 
     queryset = FundingCategory.objects.all()
     serializer_class = FundingCategorySerializer
 
 
-class APILanguageViewSet(ActiveInactiveViewSet):
+class APILanguageViewSet(ActiveFilterMixin, viewsets.ModelViewSet):
     """
-    /languages/ returns all languages (GET, POST)
-    /languages/?active=true returns all active languages (GET)
-    /languages/?active=false returns all inactive languages (GET)
-    /languages/{pk} returns a language by its ID (GET, PUT, DELETE)
+    Returns a list of languages.
     """
 
     queryset = Language.objects.all()
     serializer_class = LanguageSerializer
 
 
-class APIHostViewSet(ActiveInactiveViewSet):
+class APIHostViewSet(ActiveFilterMixin, viewsets.ModelViewSet):
     """
-    /hosts/ returns all hosts (GET, POST)
-    /hosts/?active=true returns all active hosts (GET)
-    /hosts/?active=false returns all inactive hosts (GET)
-    /hosts/{pk} returns a host by its ID (GET, PUT, DELETE)
+    Returns a list of hosts.
     """
 
     queryset = Host.objects.all()