diff --git a/config/config.exs b/config/config.exs
index c3094eb2b..608c035b0 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -74,7 +74,12 @@
   rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy,
   public: true,
   quarantined_instances: [],
-  managed_config: true
+  managed_config: true,
+  allowed_post_formats: [
+    "text/plain",
+    "text/html",
+    "text/markdown"
+  ]
 
 config :pleroma, :markup,
   # XXX - unfortunately, inline images must be enabled by default right now, because
diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex
index 2ab50c968..d4a973e36 100644
--- a/lib/pleroma/web/common_api/common_api.ex
+++ b/lib/pleroma/web/common_api/common_api.ex
@@ -73,6 +73,11 @@ def get_visibility(%{"in_reply_to_status_id" => status_id}) when not is_nil(stat
   def get_visibility(_), do: "public"
 
   @instance Application.get_env(:pleroma, :instance)
+  @allowed_post_formats Keyword.get(@instance, :allowed_post_formats)
+
+  defp get_content_type(content_type) when content_type in @allowed_post_formats, do: content_type
+  defp get_content_type(_), do: "text/plain"
+
   @limit Keyword.get(@instance, :limit)
   def post(user, %{"status" => status} = data) do
     visibility = get_visibility(data)
@@ -90,7 +95,7 @@ def post(user, %{"status" => status} = data) do
              mentions,
              attachments,
              tags,
-             data["content_type"] || "text/plain",
+             get_content_type(data["content_type"]),
              data["no_attachment_links"]
            ),
          context <- make_context(inReplyTo),