diff --git a/api/funkwhale_api/common/preferences.py b/api/funkwhale_api/common/preferences.py
index 527d00c0424c6e006d905be5e37d816f0e4eacbe..668a7c8976d2d784696f10fcaf8843e8e01c8d30 100644
--- a/api/funkwhale_api/common/preferences.py
+++ b/api/funkwhale_api/common/preferences.py
@@ -14,6 +14,11 @@ def get(pref):
     return manager[pref]
 
 
+def all():
+    manager = global_preferences_registry.manager()
+    return manager.all()
+
+
 def set(pref, value):
     manager = global_preferences_registry.manager()
     manager[pref] = value
diff --git a/api/funkwhale_api/instance/dynamic_preferences_registry.py b/api/funkwhale_api/instance/dynamic_preferences_registry.py
index 9d1f1c8f77706562fcdc8a2ecc1c863533a033f2..1e6f3147ca99e279c4b9657c02bce1f729c12021 100644
--- a/api/funkwhale_api/instance/dynamic_preferences_registry.py
+++ b/api/funkwhale_api/instance/dynamic_preferences_registry.py
@@ -43,6 +43,20 @@ class InstanceLongDescription(types.StringPreference):
     field_kwargs = {"required": False}
 
 
+@global_preferences_registry.register
+class InstanceTerms(types.StringPreference):
+    show_in_api = True
+    section = instance
+    name = "terms"
+    verbose_name = "Terms of service"
+    default = ""
+    help_text = (
+        "Terms of service and privacy policy for your instance (markdown allowed)."
+    )
+    widget = widgets.Textarea
+    field_kwargs = {"required": False}
+
+
 @global_preferences_registry.register
 class RavenDSN(types.StringPreference):
     show_in_api = True
diff --git a/api/funkwhale_api/instance/nodeinfo.py b/api/funkwhale_api/instance/nodeinfo.py
index ecdca9e4078e3eaecc4e0031b1e866304c02741d..1d401fbca99684e7ca9c03a6a166062364dc5bfd 100644
--- a/api/funkwhale_api/instance/nodeinfo.py
+++ b/api/funkwhale_api/instance/nodeinfo.py
@@ -13,10 +13,11 @@ memo = memoize.Memoizer(store, namespace="instance:stats")
 
 
 def get():
-    share_stats = preferences.get("instance__nodeinfo_stats_enabled")
-    allow_list_enabled = preferences.get("moderation__allow_list_enabled")
-    allow_list_public = preferences.get("moderation__allow_list_public")
-    unauthenticated_report_types = preferences.get(
+    all_preferences = preferences.all()
+    share_stats = all_preferences.get("instance__nodeinfo_stats_enabled")
+    allow_list_enabled = all_preferences.get("moderation__allow_list_enabled")
+    allow_list_public = all_preferences.get("moderation__allow_list_public")
+    unauthenticated_report_types = all_preferences.get(
         "moderation__unauthenticated_report_types"
     )
     if allow_list_enabled and allow_list_public:
@@ -32,20 +33,21 @@ def get():
         "software": {"name": "funkwhale", "version": funkwhale_api.__version__},
         "protocols": ["activitypub"],
         "services": {"inbound": [], "outbound": []},
-        "openRegistrations": preferences.get("users__registration_enabled"),
+        "openRegistrations": all_preferences.get("users__registration_enabled"),
         "usage": {"users": {"total": 0, "activeHalfyear": 0, "activeMonth": 0}},
         "metadata": {
             "actorId": actors.get_service_actor().fid,
-            "private": preferences.get("instance__nodeinfo_private"),
-            "shortDescription": preferences.get("instance__short_description"),
-            "longDescription": preferences.get("instance__long_description"),
-            "nodeName": preferences.get("instance__name"),
+            "private": all_preferences.get("instance__nodeinfo_private"),
+            "shortDescription": all_preferences.get("instance__short_description"),
+            "longDescription": all_preferences.get("instance__long_description"),
+            "terms": all_preferences.get("instance__terms"),
+            "nodeName": all_preferences.get("instance__name"),
             "library": {
-                "federationEnabled": preferences.get("federation__enabled"),
-                "federationNeedsApproval": preferences.get(
+                "federationEnabled": all_preferences.get("federation__enabled"),
+                "federationNeedsApproval": all_preferences.get(
                     "federation__music_needs_approval"
                 ),
-                "anonymousCanListen": not preferences.get(
+                "anonymousCanListen": not all_preferences.get(
                     "common__api_authentication_required"
                 ),
             },
diff --git a/api/tests/instance/test_nodeinfo.py b/api/tests/instance/test_nodeinfo.py
index cdb9ad93a651388c4d8eba00e37daad3f2bc5217..f85f34b250c6d2c387f0550db8b42666f7e561f4 100644
--- a/api/tests/instance/test_nodeinfo.py
+++ b/api/tests/instance/test_nodeinfo.py
@@ -38,6 +38,7 @@ def test_nodeinfo_dump(preferences, mocker):
             "shortDescription": preferences["instance__short_description"],
             "longDescription": preferences["instance__long_description"],
             "nodeName": preferences["instance__name"],
+            "terms": preferences["instance__terms"],
             "library": {
                 "federationEnabled": preferences["federation__enabled"],
                 "federationNeedsApproval": preferences[
@@ -105,6 +106,7 @@ def test_nodeinfo_dump_stats_disabled(preferences, mocker):
             "shortDescription": preferences["instance__short_description"],
             "longDescription": preferences["instance__long_description"],
             "nodeName": preferences["instance__name"],
+            "terms": preferences["instance__terms"],
             "library": {
                 "federationEnabled": preferences["federation__enabled"],
                 "federationNeedsApproval": preferences[
diff --git a/front/src/views/admin/Settings.vue b/front/src/views/admin/Settings.vue
index 85a2afb420a882615bd7e36c9e72f5d30557424a..a538329e3a0ffefb38ab9089e53160cdef5b8904 100644
--- a/front/src/views/admin/Settings.vue
+++ b/front/src/views/admin/Settings.vue
@@ -94,7 +94,8 @@ export default {
           settings: [
             "instance__name",
             "instance__short_description",
-            "instance__long_description"
+            "instance__long_description",
+            "instance__terms",
           ]
         },
         {