diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py
index 60209a92d238ab762c3d5c9b524a3bd06b650185..db2620100e4993862ff552d17c8a2803408b6831 100644
--- a/api/funkwhale_api/subsonic/views.py
+++ b/api/funkwhale_api/subsonic/views.py
@@ -351,6 +351,12 @@ class SubsonicViewSet(viewsets.GenericViewSet):
             )
         )
         queryset = queryset.playable_by(actor)
+        try:
+            offset = int(data.get("offset", 0))
+        except (TypeError, ValueError):
+
+            offset = 0
+
         try:
             size = int(
                 data["count"]
@@ -369,7 +375,7 @@ class SubsonicViewSet(viewsets.GenericViewSet):
             )
             .prefetch_related("uploads")
             .distinct()
-            .order_by("-creation_date")[:size]
+            .order_by("-creation_date")[offset : offset + size]
         )
         data = {
             "songsByGenre": {
diff --git a/api/tests/subsonic/test_views.py b/api/tests/subsonic/test_views.py
index d58cc3932c61a4763db228716e7a418f417a3432..f56cfc1a94a5d7422c14321f16c1050aa7a3df94 100644
--- a/api/tests/subsonic/test_views.py
+++ b/api/tests/subsonic/test_views.py
@@ -520,6 +520,23 @@ def test_get_songs_by_genre(f, tags_field, db, logged_in_api_client, factories):
     assert response.data == expected
 
 
+def test_get_songs_by_genre_offset(logged_in_api_client, factories):
+    url = reverse("api:subsonic-get_songs_by_genre")
+    assert url.endswith("getSongsByGenre") is True
+    track1 = factories["music.Track"](playable=True, set_tags=["Rock"])
+    factories["music.Track"](playable=True, set_tags=["Rock"])
+    factories["music.Track"](playable=True, set_tags=["Pop"])
+    # the API order tracks by creation date DESC, so the second one
+    # returned by the API is the first one to be created in the test.
+    expected = {"songsByGenre": {"song": serializers.get_song_list_data([track1])}}
+
+    response = logged_in_api_client.get(
+        url, {"f": "json", "count": 1, "offset": 1, "genre": "rock"}
+    )
+    assert response.status_code == 200
+    assert response.data == expected
+
+
 @pytest.mark.parametrize("f", ["json"])
 def test_search3(f, db, logged_in_api_client, factories):
     url = reverse("api:subsonic-search3")
diff --git a/changes/changelog.d/954.bugfix b/changes/changelog.d/954.bugfix
new file mode 100644
index 0000000000000000000000000000000000000000..eacb9603af97dc5cc913b26124c97286c4da4d46
--- /dev/null
+++ b/changes/changelog.d/954.bugfix
@@ -0,0 +1 @@
+Fixed pagination in subsonic getSongsByGenre endpoint (#954)