diff --git a/changelog.d/previewcard-void-fill.fix b/changelog.d/previewcard-void-fill.fix
new file mode 100644
index 000000000..04e571347
--- /dev/null
+++ b/changelog.d/previewcard-void-fill.fix
@@ -0,0 +1 @@
+Status: Fill all MastoAPI required values in preview cards
diff --git a/lib/pleroma/web/api_spec/operations/status_operation.ex b/lib/pleroma/web/api_spec/operations/status_operation.ex
index 75ecda321..45ecc41bd 100644
--- a/lib/pleroma/web/api_spec/operations/status_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/status_operation.ex
@@ -345,34 +345,6 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do
     }
   end
 
-  def card_operation do
-    %Operation{
-      tags: ["Retrieve status information"],
-      deprecated: true,
-      summary: "Preview card",
-      description: "Deprecated in favor of card property inlined on Status entity",
-      operationId: "StatusController.card",
-      parameters: [id_param()],
-      security: [%{"oAuth" => ["read:statuses"]}],
-      responses: %{
-        200 =>
-          Operation.response("Card", "application/json", %Schema{
-            type: :object,
-            nullable: true,
-            properties: %{
-              type: %Schema{type: :string, enum: ["link", "photo", "video", "rich"]},
-              provider_name: %Schema{type: :string, nullable: true},
-              provider_url: %Schema{type: :string, format: :uri},
-              url: %Schema{type: :string, format: :uri},
-              image: %Schema{type: :string, nullable: true, format: :uri},
-              title: %Schema{type: :string},
-              description: %Schema{type: :string}
-            }
-          })
-      }
-    }
-  end
-
   def favourited_by_operation do
     %Operation{
       tags: ["Retrieve status information"],
diff --git a/lib/pleroma/web/api_spec/schemas/status.ex b/lib/pleroma/web/api_spec/schemas/status.ex
index 25548d75b..0997abfc4 100644
--- a/lib/pleroma/web/api_spec/schemas/status.ex
+++ b/lib/pleroma/web/api_spec/schemas/status.ex
@@ -34,16 +34,40 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
         type: :object,
         nullable: true,
         description: "Preview card for links included within status content",
-        required: [:url, :title, :description, :type],
+        # Yeah, it's effectivelly all required in MastoAPI so far
+        required: [
+          :url,
+          :title,
+          :description,
+          :type,
+          :author_name,
+          :author_url,
+          :provider_name,
+          :provider_url,
+          :html,
+          :width,
+          :height,
+          :image,
+          :embed_url,
+          :blurhash
+        ],
         properties: %{
+          url: %Schema{type: :string, format: :uri, description: "Location of linked resource"},
+          title: %Schema{type: :string, description: "Title of linked resource"},
+          description: %Schema{type: :string, description: "Description of preview"},
           type: %Schema{
             type: :string,
             enum: ["link", "photo", "video", "rich"],
             description: "The type of the preview card"
           },
+          author_name: %Schema{type: :string, description: "author of the original resource"},
+          author_url: %Schema{
+            type: :string,
+            format: :uri,
+            description: "link to the author of the original resource"
+          },
           provider_name: %Schema{
             type: :string,
-            nullable: true,
             description: "The provider of the original resource"
           },
           provider_url: %Schema{
@@ -51,7 +75,13 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
             format: :uri,
             description: "A link to the provider of the original resource"
           },
-          url: %Schema{type: :string, format: :uri, description: "Location of linked resource"},
+          html: %Schema{
+            type: :string,
+            format: :html,
+            description: "HTML to be used for generating the preview card"
+          },
+          width: %Schema{type: :integer, description: "Width of preview, in pixels"},
+          height: %Schema{type: :integer, description: "Height of preview, in pixels"},
           image: %Schema{
             type: :string,
             nullable: true,
@@ -62,8 +92,17 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
             type: :string,
             description: "Alternate text that describes what is in the thumbnail"
           },
-          title: %Schema{type: :string, description: "Title of linked resource"},
-          description: %Schema{type: :string, description: "Description of preview"}
+          embed_url: %Schema{
+            type: :string,
+            format: :uri,
+            description: "Used for photo embeds, instead of custom `html`"
+          },
+          blurhash: %Schema{
+            type: :string,
+            nullable: true,
+            description:
+              "A hash computed by the (BlurHash algorithm)[https://github.com/woltapp/blurhash], for generating colorful preview thumbnails when media has not been downloaded yet."
+          }
         }
       },
       content: %Schema{type: :string, format: :html, description: "HTML-encoded status content"},
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index 4b5ac9c3b..c22c840a4 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -587,6 +587,13 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
       image_description: rich_media["image:alt"] || "",
       title: rich_media["title"] || "",
       description: rich_media["description"] || "",
+      author_name: "",
+      author_url: "",
+      html: "",
+      width: 0,
+      height: 0,
+      embed_url: "",
+      blurhash: nil,
       pleroma: %{
         opengraph:
           rich_media
diff --git a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
index 25a17d5c1..60e35276e 100644
--- a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
@@ -1663,6 +1663,105 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do
     end
   end
 
+  describe "cards" do
+    setup do
+      Pleroma.StaticStubbedConfigMock
+      |> stub(:get, fn
+        [:rich_media, :enabled] -> true
+        path -> Pleroma.Test.StaticConfig.get(path)
+      end)
+
+      oauth_access(["read:statuses"])
+    end
+
+    test "returns rich-media card", %{conn: conn, user: user} do
+      Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
+
+      {:ok, activity} = CommonAPI.post(user, %{status: "https://example.com/ogp"})
+
+      card_data = %{
+        "image" => "http://ia.media-imdb.com/images/rock.jpg",
+        "provider_name" => "example.com",
+        "provider_url" => "https://example.com",
+        "title" => "The Rock",
+        "type" => "link",
+        "url" => "https://example.com/ogp",
+        "description" =>
+          "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.",
+        "pleroma" => %{
+          "opengraph" => %{
+            "image" => "http://ia.media-imdb.com/images/rock.jpg",
+            "title" => "The Rock",
+            "type" => "video.movie",
+            "url" => "https://example.com/ogp",
+            "description" =>
+              "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer."
+          }
+        },
+        "author_name" => "",
+        "author_url" => "",
+        "blurhash" => nil,
+        "embed_url" => "",
+        "height" => 0,
+        "html" => "",
+        "width" => 0
+      }
+
+      response =
+        conn
+        |> get("/api/v1/statuses/#{activity.id}")
+        |> json_response_and_validate_schema(200)
+
+      assert response["card"] == card_data
+
+      # works with private posts
+      {:ok, activity} =
+        CommonAPI.post(user, %{status: "https://example.com/ogp", visibility: "direct"})
+
+      response_two =
+        conn
+        |> get("/api/v1/statuses/#{activity.id}")
+        |> json_response_and_validate_schema(200)
+
+      assert response_two["card"] == card_data
+    end
+
+    test "replaces missing description with an empty string", %{conn: conn, user: user} do
+      Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
+
+      {:ok, activity} = CommonAPI.post(user, %{status: "https://example.com/ogp-missing-data"})
+
+      response =
+        conn
+        |> get("/api/v1/statuses/#{activity.id}")
+        |> json_response_and_validate_schema(:ok)
+
+      assert response["card"] == %{
+               "type" => "link",
+               "title" => "Pleroma",
+               "description" => "",
+               "image" => nil,
+               "provider_name" => "example.com",
+               "provider_url" => "https://example.com",
+               "url" => "https://example.com/ogp-missing-data",
+               "pleroma" => %{
+                 "opengraph" => %{
+                   "title" => "Pleroma",
+                   "type" => "website",
+                   "url" => "https://example.com/ogp-missing-data"
+                 }
+               },
+               "author_name" => "",
+               "author_url" => "",
+               "blurhash" => nil,
+               "embed_url" => "",
+               "height" => 0,
+               "html" => "",
+               "width" => 0
+             }
+    end
+  end
+
   test "bookmarks" do
     bookmarks_uri = "/api/v1/bookmarks"