diff --git a/api/funkwhale_api/music/spa_views.py b/api/funkwhale_api/music/spa_views.py
index 7997a3c07a89a68073a2d62dddfadf80240f4f6a..2d1d1a22cc5585eedf216f64d2af83a23ead2d6c 100644
--- a/api/funkwhale_api/music/spa_views.py
+++ b/api/funkwhale_api/music/spa_views.py
@@ -33,8 +33,12 @@ def library_track(request, pk, redirect_to_ap):
     except models.Track.DoesNotExist:
         return []
 
+    playable_uploads = obj.uploads.playable_by(None).order_by("id")
+    upload = playable_uploads.first()
+
     if redirect_to_ap:
-        raise middleware.ApiRedirect(obj.fid)
+        redirect_url = upload.fid if upload else obj.fid
+        raise middleware.ApiRedirect(redirect_url)
 
     track_url = utils.join_url(
         settings.FUNKWHALE_URL,
@@ -84,8 +88,6 @@ def library_track(request, pk, redirect_to_ap):
                 "content": obj.album.attachment_cover.download_url_medium_square_crop,
             }
         )
-    playable_uploads = obj.uploads.playable_by(None).order_by("id")
-    upload = playable_uploads.first()
     if upload:
         metas.append(
             {
diff --git a/api/tests/common/test_middleware.py b/api/tests/common/test_middleware.py
index 88e8d05848fa83e1052af1be5672dbc95f8ff617..40ff279cbf1b6b38761c114c503ef8053043d797 100644
--- a/api/tests/common/test_middleware.py
+++ b/api/tests/common/test_middleware.py
@@ -394,6 +394,8 @@ def test_get_request_head_tags_calls_view_with_proper_arg_when_accept_header_set
         ("music.Album", {}, "library_album", "pk", "pk",),
         ("music.Track", {}, "library_track", "pk", "pk",),
         ("music.Library", {}, "library_library", "uuid", "uuid",),
+        # when a track as a public upload, we should redirect to the upload instead
+        ("music.Upload", {"playable": True}, "library_track", "pk", "track.pk"),
     ],
 )
 def test_spa_views_raise_api_redirect_when_accept_json_set(