diff --git a/api/config/settings/common.py b/api/config/settings/common.py
index f88aa5dd549fe09afd1c41999180e481dd2f151a..5fed9f25e86d065aff3b8f4ab662d38c65870aaf 100644
--- a/api/config/settings/common.py
+++ b/api/config/settings/common.py
@@ -133,6 +133,7 @@ LOCAL_APPS = (
     'funkwhale_api.providers.audiofile',
     'funkwhale_api.providers.youtube',
     'funkwhale_api.providers.acoustid',
+    'funkwhale_api.subsonic',
 )
 
 # See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
diff --git a/api/funkwhale_api/subsonic/dynamic_preferences_registry.py b/api/funkwhale_api/subsonic/dynamic_preferences_registry.py
new file mode 100644
index 0000000000000000000000000000000000000000..93482702ff110e39885dc72395836598f4e7e6bc
--- /dev/null
+++ b/api/funkwhale_api/subsonic/dynamic_preferences_registry.py
@@ -0,0 +1,22 @@
+from dynamic_preferences import types
+from dynamic_preferences.registries import global_preferences_registry
+
+from funkwhale_api.common import preferences
+
+subsonic = types.Section('subsonic')
+
+
+@global_preferences_registry.register
+class APIAutenticationRequired(types.BooleanPreference):
+    section = subsonic
+    show_in_api = True
+    name = 'enabled'
+    default = True
+    verbose_name = 'Enabled Subsonic API'
+    help_text = (
+        'Funkwhale supports a subset of the Subsonic API, that makes '
+        'it compatible with existing clients such as DSub for Android '
+        'or Clementine for desktop. However, Subsonic protocol is less '
+        'than ideal in terms of security and you can disable this feature '
+        'completely using this flag.'
+    )
diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py
index 252afe81a3ba80d5fa5a473d659919cae82d18c4..475e61aa73119ff8df9a71fa2a27cf3188dc0cff 100644
--- a/api/funkwhale_api/subsonic/views.py
+++ b/api/funkwhale_api/subsonic/views.py
@@ -4,11 +4,13 @@ from django.utils import timezone
 
 from rest_framework import exceptions
 from rest_framework import permissions as rest_permissions
+from rest_framework import renderers
 from rest_framework import response
 from rest_framework import viewsets
 from rest_framework.decorators import list_route
 from rest_framework.serializers import ValidationError
 
+from funkwhale_api.common import preferences
 from funkwhale_api.favorites.models import TrackFavorite
 from funkwhale_api.music import models as music_models
 from funkwhale_api.music import utils
@@ -61,6 +63,15 @@ class SubsonicViewSet(viewsets.GenericViewSet):
     authentication_classes = [authentication.SubsonicAuthentication]
     permissions_classes = [rest_permissions.IsAuthenticated]
 
+    def dispatch(self, request, *args, **kwargs):
+        if not preferences.get('subsonic__enabled'):
+            r = response.Response({}, status=405)
+            r.accepted_renderer = renderers.JSONRenderer()
+            r.accepted_media_type = 'application/json'
+            r.renderer_context = {}
+            return r
+        return super().dispatch(request, *args, **kwargs)
+
     def handle_exception(self, exc):
         # subsonic API sends 200 status code with custom error
         # codes in the payload
diff --git a/front/src/store/instance.js b/front/src/store/instance.js
index 245acaf039adb4cc92e5df0760c3b38733e6b241..e78e804898c8c02a1f237297d3ab3dc653e62c0e 100644
--- a/front/src/store/instance.js
+++ b/front/src/store/instance.js
@@ -24,6 +24,11 @@ export default {
           value: true
         }
       },
+      subsonic: {
+        enabled: {
+          value: true
+        }
+      },
       raven: {
         front_enabled: {
           value: false