diff --git a/api/funkwhale_api/moderation/serializers.py b/api/funkwhale_api/moderation/serializers.py
new file mode 100644
index 0000000000000000000000000000000000000000..6e85c8c43800c91a789b14ada7c6e2699fe84fa7
--- /dev/null
+++ b/api/funkwhale_api/moderation/serializers.py
@@ -0,0 +1,29 @@
+from rest_framework import serializers
+
+from . import models
+
+
+class InstancePolicySerializer(serializers.ModelsSerializer):
+    class Meta:
+        models = models.InstancePolicy
+        fields = [
+            "actor",
+            "is_active",
+            "summary",
+            "creation_date",
+            "target_domain",
+            "target_actor",
+            "filter_in",
+            "filter_out",
+            "filtered_out_activities",
+            "filtered_in_activities",
+            "last_filtered_in_date",
+        ]
+        read_only_fields = [
+            "actor",
+            "creation_date",
+            "filtered_out_activities",
+            "filtered_in_activities",
+            "last_filtered_in_date",
+            "last_filtered_out_date",
+        ]
diff --git a/api/tests/moderation/test_serializers.py b/api/tests/moderation/test_serializers.py
new file mode 100644
index 0000000000000000000000000000000000000000..1a28ba6812437139a9fe62ce467a3cca47f04798
--- /dev/null
+++ b/api/tests/moderation/test_serializers.py
@@ -0,0 +1,26 @@
+from funkwhale_api.moderation import serializers
+
+
+def test_save_instance_policy(factories):
+    actor = factories["federation.Actor"]()
+    data = {
+        "filter_in": ["Note", "Like", "Like"],
+        "filter_out": ["Like", "Block", "*"],
+        "summary": "Some reason",
+        "is_active": False,
+        "target_domain": "test.domain",
+    }
+
+    serializer = serializers.InstancePolicySerializer(data=data)
+    assert serializer.is_valid(raise_exception=True) is True
+
+    policy = serializer.save(actor=actor)
+
+    assert policy.actor == actor
+    assert policy.summary == data["summary"]
+    # sorted, removed duplicate
+    assert policy.filter_in == ["Like", "Note"]
+    # remove everything else since we have a wildcard
+    assert policy.filter_out == ["*"]
+    assert policy.is_active is data["is_active"]
+    assert policy.target_domain.name == data["target_domain"]