diff --git a/api/funkwhale_api/instance/dynamic_preferences_registry.py b/api/funkwhale_api/instance/dynamic_preferences_registry.py
index ed2cef527f9b54087009d40be8b5321049071ff3..0d6260a83726fffa6118ba5f1ecfa30472f2c359 100644
--- a/api/funkwhale_api/instance/dynamic_preferences_registry.py
+++ b/api/funkwhale_api/instance/dynamic_preferences_registry.py
@@ -59,6 +59,29 @@ class InstanceTerms(types.StringPreference):
     field_kwargs = {"required": False}
 
 
+@global_preferences_registry.register
+class InstanceRules(types.StringPreference):
+    show_in_api = True
+    section = instance
+    name = "rules"
+    verbose_name = "Rules"
+    default = ""
+    help_text = "Rules/Code of Conduct (markdown allowed)."
+    widget = widgets.Textarea
+    field_kwargs = {"required": False}
+
+
+@global_preferences_registry.register
+class InstanceContactEmail(types.StringPreference):
+    show_in_api = True
+    section = instance
+    name = "contact_email"
+    verbose_name = "Contact email"
+    default = ""
+    help_text = "A contact email for visitors who need to contact an admin or moderator"
+    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 dc495108e79ddfe25497f57a4c043d08cd4a5ce6..15f2b1b41e94550a618b4e741b7b1929919fe825 100644
--- a/api/funkwhale_api/instance/nodeinfo.py
+++ b/api/funkwhale_api/instance/nodeinfo.py
@@ -42,6 +42,8 @@ def get():
             "private": all_preferences.get("instance__nodeinfo_private"),
             "shortDescription": all_preferences.get("instance__short_description"),
             "longDescription": all_preferences.get("instance__long_description"),
+            "rules": all_preferences.get("instance__rules"),
+            "contactEmail": all_preferences.get("instance__contact_email"),
             "terms": all_preferences.get("instance__terms"),
             "nodeName": all_preferences.get("instance__name"),
             "banner": federation_utils.full_url(banner.url) if banner else None,
diff --git a/api/tests/instance/test_nodeinfo.py b/api/tests/instance/test_nodeinfo.py
index d30873ec224ca1ed065064a8b986c951e7e75f9d..d1816ff3d21e4d42466899f063dde269a36d12b6 100644
--- a/api/tests/instance/test_nodeinfo.py
+++ b/api/tests/instance/test_nodeinfo.py
@@ -40,6 +40,8 @@ def test_nodeinfo_dump(preferences, mocker, avatar):
             "shortDescription": preferences["instance__short_description"],
             "longDescription": preferences["instance__long_description"],
             "nodeName": preferences["instance__name"],
+            "rules": preferences["instance__rules"],
+            "contactEmail": preferences["instance__contact_email"],
             "terms": preferences["instance__terms"],
             "banner": federation_utils.full_url(preferences["instance__banner"].url),
             "library": {
@@ -109,6 +111,8 @@ def test_nodeinfo_dump_stats_disabled(preferences, mocker):
             "shortDescription": preferences["instance__short_description"],
             "longDescription": preferences["instance__long_description"],
             "nodeName": preferences["instance__name"],
+            "rules": preferences["instance__rules"],
+            "contactEmail": preferences["instance__contact_email"],
             "terms": preferences["instance__terms"],
             "banner": None,
             "library": {
diff --git a/front/src/views/admin/Settings.vue b/front/src/views/admin/Settings.vue
index 6ae7e73a116ea6199227ce865fa17cacef139cc3..8d080e0d4e55bb542ed9d0e92366b7c0aff48e6b 100644
--- a/front/src/views/admin/Settings.vue
+++ b/front/src/views/admin/Settings.vue
@@ -95,6 +95,8 @@ export default {
             "instance__name",
             "instance__short_description",
             "instance__long_description",
+            "instance__contact_email",
+            "instance__rules",
             "instance__terms",
             "instance__banner",
           ]