diff --git a/funkwhale_api/favorites/tests/test_favorites.py b/funkwhale_api/favorites/tests/test_favorites.py
index 55b09baac78b49197b0b80b46da4b6065e102bde..a68659ba41ba28a1f4160b9cb36dbc0483ead8d6 100644
--- a/funkwhale_api/favorites/tests/test_favorites.py
+++ b/funkwhale_api/favorites/tests/test_favorites.py
@@ -63,6 +63,18 @@ class TestFavorites(TestCase):
         url = reverse('api:favorites:tracks-detail', kwargs={'pk': favorite.pk})
         self.client.login(username=self.user.username, password='test')
         response = self.client.delete(url, {'track': self.track.pk})
+        self.assertEqual(response.status_code, 204)
+        self.assertEqual(TrackFavorite.objects.count(), 0)
+
+    def test_user_can_remove_favorite_via_api_using_track_id(self):
+        favorite = TrackFavorite.add(self.track, self.user)
+
+        url = reverse('api:favorites:tracks-remove')
+        self.client.login(username=self.user.username, password='test')
+        response = self.client.delete(
+            url, json.dumps({'track': self.track.pk}),
+            content_type='application/json'
+        )
 
         self.assertEqual(response.status_code, 204)
         self.assertEqual(TrackFavorite.objects.count(), 0)
diff --git a/funkwhale_api/favorites/views.py b/funkwhale_api/favorites/views.py
index 33a3e3d62d3c596fcee645b5b3aaec89477160f1..98c0cfc08de60fc21f2ffc8d66918b638bc28c6c 100644
--- a/funkwhale_api/favorites/views.py
+++ b/funkwhale_api/favorites/views.py
@@ -1,6 +1,8 @@
 from rest_framework import generics, mixins, viewsets
 from rest_framework import status
 from rest_framework.response import Response
+from rest_framework import pagination
+from rest_framework.decorators import list_route
 
 from funkwhale_api.music.models import Track
 from funkwhale_api.common.permissions import ConditionalAuthentication
@@ -8,21 +10,22 @@ from funkwhale_api.common.permissions import ConditionalAuthentication
 from . import models
 from . import serializers
 
+
+class CustomLimitPagination(pagination.PageNumberPagination):
+    page_size = 100
+    page_size_query_param = 'page_size'
+    max_page_size = 100
+
+
 class TrackFavoriteViewSet(mixins.CreateModelMixin,
                            mixins.DestroyModelMixin,
                            mixins.ListModelMixin,
                            viewsets.GenericViewSet):
 
     serializer_class = serializers.UserTrackFavoriteSerializer
-    queryset = (models.TrackFavorite.objects.all()
-                      .select_related()
-                      .select_related('track__album__artist')
-                      .prefetch_related(
-                          'track__tags',
-                          'track__files',
-                          'track__artist__albums__tracks__tags',))
+    queryset = (models.TrackFavorite.objects.all())
     permission_classes = [ConditionalAuthentication]
-
+    pagination_class = CustomLimitPagination
 
     def create(self, request, *args, **kwargs):
         serializer = self.get_serializer(data=request.data)
@@ -39,3 +42,13 @@ class TrackFavoriteViewSet(mixins.CreateModelMixin,
         track = Track.objects.get(pk=serializer.data['track'])
         favorite = models.TrackFavorite.add(track=track, user=self.request.user)
         return favorite
+
+    @list_route(methods=['delete'])
+    def remove(self, request, *args, **kwargs):
+        try:
+            pk = int(request.data['track'])
+            favorite = request.user.track_favorites.get(track__pk=pk)
+        except (AttributeError, ValueError, models.TrackFavorite.DoesNotExist):
+            return Response({}, status=400)
+        favorite.delete()
+        return Response([], status=status.HTTP_204_NO_CONTENT)