diff --git a/program/filters.py b/program/filters.py
index d442c2acc34d4669dcc5c90c4ad08bcf857b82a2..656d4804e1513aa49023f2ba7465db7338fa837d 100644
--- a/program/filters.py
+++ b/program/filters.py
@@ -334,3 +334,14 @@ class VirtualTimeslotFilterSet(filters.FilterSet):
     class Meta:
         model = models.TimeSlot
         fields = ["start", "end", "include_virtual"]
+
+
+class PlaylistFileUsageFilter(filters.FilterSet):
+    file_id = filters.NumberFilter(
+        field_name="entries__file_id",
+        help_text="Return only playlists that use to the specified file ID.",
+    )
+
+    class Meta:
+        fields = ("file_id",)
+        model = models.Playlist
diff --git a/program/views.py b/program/views.py
index edc0b304a8ece13e6f036f61f31856d783e162fb..deb1577ebcba4c8afb43d28a297ec1a4339b4257 100644
--- a/program/views.py
+++ b/program/views.py
@@ -1700,6 +1700,7 @@ class APIPlaylistViewSet(viewsets.ModelViewSet):
 
 
 class APIPlaylistUsageViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
+    filterset_class = filters.PlaylistFileUsageFilter
     serializer_class = PlaylistSerializer
 
     def get_queryset(self):
@@ -1710,15 +1711,3 @@ class APIPlaylistUsageViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
             return Playlist.objects.none()
 
         return Playlist.objects.all()
-
-    def list(self, request, *args, **kwargs):
-        """The list filters the playlists by the `file_id` they refer to."""
-
-        if file_id := request.query_params.get("file_id"):
-            queryset = self.get_queryset().filter(entries__file_id=int(file_id))
-        else:
-            queryset = self.get_queryset()
-
-        serializer = PlaylistSerializer(queryset, many=True)
-
-        return Response(serializer.data)