diff --git a/api_tests/package.json b/api_tests/package.json
index 8924847093c70ae51195124b7c7299aec4f37500..84e5d3df579fd0fcaf52a6796a7a379fcd5f535b 100644
--- a/api_tests/package.json
+++ b/api_tests/package.json
@@ -19,7 +19,7 @@
     "eslint": "^8.51.0",
     "eslint-plugin-prettier": "^5.0.1",
     "jest": "^29.5.0",
-    "lemmy-js-client": "0.19.0-alpha.12",
+    "lemmy-js-client": "0.19.0-rc.12",
     "prettier": "^3.0.0",
     "ts-jest": "^29.1.0",
     "typescript": "^5.0.4"
diff --git a/api_tests/src/community.spec.ts b/api_tests/src/community.spec.ts
index a67cd693a0aa6ba582454d448cc3701c7bfa0953..2c97d629f52a20b3b2e78ec93a715fc8ed397227 100644
--- a/api_tests/src/community.spec.ts
+++ b/api_tests/src/community.spec.ts
@@ -25,6 +25,7 @@ import {
   getCommunityByName,
   blockInstance,
   waitUntil,
+  delay,
   alphaUrl,
   delta,
   betaAllowedInstances,
@@ -240,7 +241,7 @@ test("Admin actions in remote community are not federated to origin", async () =
     true,
     true,
   );
-  expect(banRes.success).toBe(true);
+  expect(banRes.banned).toBe(true);
 
   // ban doesnt federate to community's origin instance alpha
   let alphaPost = (await resolvePost(alpha, gammaPost.post)).post;
diff --git a/api_tests/src/post.spec.ts b/api_tests/src/post.spec.ts
index f9af236ce8a6cd83b27223d6faf2508789b578fd..8c1f2222628eebbeda6b36bd2eab4e218649d6c7 100644
--- a/api_tests/src/post.spec.ts
+++ b/api_tests/src/post.spec.ts
@@ -415,7 +415,7 @@ test("Enforce site ban for federated user", async () => {
     true,
     true,
   );
-  expect(banAlpha.success).toBe(true);
+  expect(banAlpha.banned).toBe(true);
 
   // alpha ban should be federated to beta
   let alphaUserOnBeta1 = await waitUntil(
@@ -437,7 +437,7 @@ test("Enforce site ban for federated user", async () => {
     false,
     false,
   );
-  expect(unBanAlpha.success).toBe(true);
+  expect(unBanAlpha.banned).toBe(false);
 
   // Login gets invalidated by ban, need to login again
   if (!alphaUserPerson) {
@@ -479,7 +479,7 @@ test.skip("Enforce community ban for federated user", async () => {
     true,
     true,
   );
-  expect(banAlpha.success).toBe(true);
+  expect(banAlpha.banned).toBe(true);
 
   // ensure that the post by alpha got removed
   await expect(getPost(alpha, searchBeta1.posts[0].post.id)).rejects.toBe(
@@ -499,7 +499,7 @@ test.skip("Enforce community ban for federated user", async () => {
     false,
     false,
   );
-  expect(unBanAlpha.success).toBe(true);
+  expect(unBanAlpha.banned).toBe(false);
   let postRes3 = await createPost(alpha, betaCommunity.community.id);
   expect(postRes3.post_view.post).toBeDefined();
   expect(postRes3.post_view.community.local).toBe(false);
diff --git a/api_tests/src/shared.ts b/api_tests/src/shared.ts
index fce25adc2dc7aa12a65f11b23d14bbdd521a4c2c..e4dabb1d402062c62d5b8a9f0143564d755ba430 100644
--- a/api_tests/src/shared.ts
+++ b/api_tests/src/shared.ts
@@ -1,12 +1,12 @@
 import {
   BlockInstance,
+  BlockInstanceResponse,
   GetReplies,
   GetRepliesResponse,
   GetUnreadCountResponse,
   InstanceId,
   LemmyHttp,
   PostView,
-  SuccessResponse,
 } from "lemmy-js-client";
 import { CreatePost } from "lemmy-js-client/dist/types/CreatePost";
 import { DeletePost } from "lemmy-js-client/dist/types/DeletePost";
@@ -27,7 +27,9 @@ import { ResolveObjectResponse } from "lemmy-js-client/dist/types/ResolveObjectR
 import { Search } from "lemmy-js-client/dist/types/Search";
 import { SearchResponse } from "lemmy-js-client/dist/types/SearchResponse";
 import { Comment } from "lemmy-js-client/dist/types/Comment";
+import { BanPersonResponse } from "lemmy-js-client/dist/types/BanPersonResponse";
 import { BanPerson } from "lemmy-js-client/dist/types/BanPerson";
+import { BanFromCommunityResponse } from "lemmy-js-client/dist/types/BanFromCommunityResponse";
 import { BanFromCommunity } from "lemmy-js-client/dist/types/BanFromCommunity";
 import { CommunityResponse } from "lemmy-js-client/dist/types/CommunityResponse";
 import { FollowCommunity } from "lemmy-js-client/dist/types/FollowCommunity";
@@ -53,6 +55,7 @@ import { Register } from "lemmy-js-client/dist/types/Register";
 import { SaveUserSettings } from "lemmy-js-client/dist/types/SaveUserSettings";
 import { DeleteAccount } from "lemmy-js-client/dist/types/DeleteAccount";
 import { GetSiteResponse } from "lemmy-js-client/dist/types/GetSiteResponse";
+import { DeleteAccountResponse } from "lemmy-js-client/dist/types/DeleteAccountResponse";
 import { PrivateMessagesResponse } from "lemmy-js-client/dist/types/PrivateMessagesResponse";
 import { GetPrivateMessages } from "lemmy-js-client/dist/types/GetPrivateMessages";
 import { PostReportResponse } from "lemmy-js-client/dist/types/PostReportResponse";
@@ -382,7 +385,7 @@ export async function banPersonFromSite(
   person_id: number,
   ban: boolean,
   remove_data: boolean,
-): Promise<SuccessResponse> {
+): Promise<BanPersonResponse> {
   // Make sure lemmy-beta/c/main is cached on lemmy_alpha
   let form: BanPerson = {
     person_id,
@@ -398,7 +401,7 @@ export async function banPersonFromCommunity(
   community_id: number,
   remove_data: boolean,
   ban: boolean,
-): Promise<SuccessResponse> {
+): Promise<BanFromCommunityResponse> {
   let form: BanFromCommunity = {
     person_id,
     community_id,
@@ -686,7 +689,9 @@ export async function getPersonDetails(
   return api.getPersonDetails(form);
 }
 
-export async function deleteUser(api: LemmyHttp): Promise<SuccessResponse> {
+export async function deleteUser(
+  api: LemmyHttp,
+): Promise<DeleteAccountResponse> {
   let form: DeleteAccount = {
     delete_content: true,
     password,
@@ -783,7 +788,7 @@ export function blockInstance(
   api: LemmyHttp,
   instance_id: InstanceId,
   block: boolean,
-): Promise<SuccessResponse> {
+): Promise<BlockInstanceResponse> {
   let form: BlockInstance = {
     instance_id,
     block,
diff --git a/api_tests/yarn.lock b/api_tests/yarn.lock
index f528a91448033341d4bbfeeb796b31b2faeb3520..56764e09697b4833afe00087fb0f1a94249cd2a1 100644
--- a/api_tests/yarn.lock
+++ b/api_tests/yarn.lock
@@ -2275,10 +2275,10 @@ kleur@^3.0.3:
   resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
   integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
 
-lemmy-js-client@0.19.0-alpha.12:
-  version "0.19.0-alpha.12"
-  resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.19.0-alpha.12.tgz#0f98743483b3859414e7accce905105a7fc6df78"
-  integrity sha512-4SicZRNxZpLAxrjP54eRJmFHJ2AjNbWJv3PuTp2g6tkLQPUukDr8RsEOoDXDoIoqadgR3B5z1ujnuTtQrVrFKg==
+lemmy-js-client@0.19.0-rc.12:
+  version "0.19.0-rc.12"
+  resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.19.0-rc.12.tgz#e3bd4e21b1966d583ab790ef70ece8394b012b48"
+  integrity sha512-1iu2fW9vlb3TrI+QR/ODP3+5pWZB0rUqL1wH09IzomDXohCqoQvfmXpwArmgF4Eq8GZgjkcfeMDC2gMrfw/i7Q==
   dependencies:
     cross-fetch "^3.1.5"
     form-data "^4.0.0"
diff --git a/crates/api/src/community/add_mod.rs b/crates/api/src/community/add_mod.rs
index e8bf2c19fc7c4bc4c0652fa2bb2976aade8ba269..9d055c65492ee3d1f52788c069c172b7f3c3a60f 100644
--- a/crates/api/src/community/add_mod.rs
+++ b/crates/api/src/community/add_mod.rs
@@ -1,11 +1,10 @@
 use activitypub_federation::config::Data;
 use actix_web::web::Json;
 use lemmy_api_common::{
-  community::AddModToCommunity,
+  community::{AddModToCommunity, AddModToCommunityResponse},
   context::LemmyContext,
   send_activity::{ActivityChannel, SendActivityData},
   utils::check_community_mod_action,
-  SuccessResponse,
 };
 use lemmy_db_schema::{
   source::{
@@ -15,6 +14,7 @@ use lemmy_db_schema::{
   traits::{Crud, Joinable},
 };
 use lemmy_db_views::structs::LocalUserView;
+use lemmy_db_views_actor::structs::CommunityModeratorView;
 use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType};
 
 #[tracing::instrument(skip(context))]
@@ -22,7 +22,7 @@ pub async fn add_mod_to_community(
   data: Json<AddModToCommunity>,
   context: Data<LemmyContext>,
   local_user_view: LocalUserView,
-) -> Result<Json<SuccessResponse>, LemmyError> {
+) -> Result<Json<AddModToCommunityResponse>, LemmyError> {
   let community_id = data.community_id;
 
   // Verify that only mods or admins can add mod
@@ -63,6 +63,11 @@ pub async fn add_mod_to_community(
 
   ModAddCommunity::create(&mut context.pool(), &form).await?;
 
+  // Note: in case a remote mod is added, this returns the old moderators list, it will only get
+  //       updated once we receive an activity from the community (like `Announce/Add/Moderator`)
+  let community_id = data.community_id;
+  let moderators = CommunityModeratorView::for_community(&mut context.pool(), community_id).await?;
+
   ActivityChannel::submit_activity(
     SendActivityData::AddModToCommunity(
       local_user_view.person,
@@ -74,5 +79,5 @@ pub async fn add_mod_to_community(
   )
   .await?;
 
-  Ok(Json(SuccessResponse::default()))
+  Ok(Json(AddModToCommunityResponse { moderators }))
 }
diff --git a/crates/api/src/community/ban.rs b/crates/api/src/community/ban.rs
index 8e315568de9d044cfa5be0a2645701986181e65e..f662c4a08911b6f9ee9213bd6e3ac3a9e23f9bc1 100644
--- a/crates/api/src/community/ban.rs
+++ b/crates/api/src/community/ban.rs
@@ -1,11 +1,10 @@
 use activitypub_federation::config::Data;
 use actix_web::web::Json;
 use lemmy_api_common::{
-  community::BanFromCommunity,
+  community::{BanFromCommunity, BanFromCommunityResponse},
   context::LemmyContext,
   send_activity::{ActivityChannel, SendActivityData},
   utils::{check_community_mod_action, check_expire_time, remove_user_data_in_community},
-  SuccessResponse,
 };
 use lemmy_db_schema::{
   source::{
@@ -31,7 +30,7 @@ pub async fn ban_from_community(
   data: Json<BanFromCommunity>,
   context: Data<LemmyContext>,
   local_user_view: LocalUserView,
-) -> Result<Json<SuccessResponse>, LemmyError> {
+) -> Result<Json<BanFromCommunityResponse>, LemmyError> {
   let banned_person_id = data.person_id;
   let remove_data = data.remove_data.unwrap_or(false);
   let expires = check_expire_time(data.expires)?;
@@ -103,5 +102,8 @@ pub async fn ban_from_community(
   )
   .await?;
 
-  Ok(Json(SuccessResponse::default()))
+  Ok(Json(BanFromCommunityResponse {
+    person_view,
+    banned: data.ban,
+  }))
 }
diff --git a/crates/api/src/community/block.rs b/crates/api/src/community/block.rs
index 3c4e7ed9c729479701777b3a23740f7122ddea95..fd4a5a01bf3b268252871203f1a2b1a738331c22 100644
--- a/crates/api/src/community/block.rs
+++ b/crates/api/src/community/block.rs
@@ -1,10 +1,9 @@
 use activitypub_federation::config::Data;
 use actix_web::web::Json;
 use lemmy_api_common::{
-  community::BlockCommunity,
+  community::{BlockCommunity, BlockCommunityResponse},
   context::LemmyContext,
   send_activity::{ActivityChannel, SendActivityData},
-  SuccessResponse,
 };
 use lemmy_db_schema::{
   source::{
@@ -22,7 +21,7 @@ pub async fn block_community(
   data: Json<BlockCommunity>,
   context: Data<LemmyContext>,
   local_user_view: LocalUserView,
-) -> Result<Json<SuccessResponse>, LemmyError> {
+) -> Result<Json<BlockCommunityResponse>, LemmyError> {
   let community_id = data.community_id;
   let person_id = local_user_view.person.id;
   let community_block_form = CommunityBlockForm {
@@ -64,5 +63,8 @@ pub async fn block_community(
   )
   .await?;
 
-  Ok(Json(SuccessResponse::default()))
+  Ok(Json(BlockCommunityResponse {
+    blocked: data.block,
+    community_view,
+  }))
 }
diff --git a/crates/api/src/local_user/add_admin.rs b/crates/api/src/local_user/add_admin.rs
index 0fc9989b91b8afa306c01b393eedf2245617381d..50233587606d26a468ff5a15d459305d2e7c8f8a 100644
--- a/crates/api/src/local_user/add_admin.rs
+++ b/crates/api/src/local_user/add_admin.rs
@@ -1,5 +1,9 @@
 use actix_web::web::{Data, Json};
-use lemmy_api_common::{context::LemmyContext, person::AddAdmin, utils::is_admin, SuccessResponse};
+use lemmy_api_common::{
+  context::LemmyContext,
+  person::{AddAdmin, AddAdminResponse},
+  utils::is_admin,
+};
 use lemmy_db_schema::{
   source::{
     local_user::{LocalUser, LocalUserUpdateForm},
@@ -8,6 +12,7 @@ use lemmy_db_schema::{
   traits::Crud,
 };
 use lemmy_db_views::structs::LocalUserView;
+use lemmy_db_views_actor::structs::PersonView;
 use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType};
 
 #[tracing::instrument(skip(context))]
@@ -15,7 +20,7 @@ pub async fn add_admin(
   data: Json<AddAdmin>,
   context: Data<LemmyContext>,
   local_user_view: LocalUserView,
-) -> Result<Json<SuccessResponse>, LemmyError> {
+) -> Result<Json<AddAdminResponse>, LemmyError> {
   // Make sure user is an admin
   is_admin(&local_user_view)?;
 
@@ -44,5 +49,7 @@ pub async fn add_admin(
 
   ModAdd::create(&mut context.pool(), &form).await?;
 
-  Ok(Json(SuccessResponse::default()))
+  let admins = PersonView::admins(&mut context.pool()).await?;
+
+  Ok(Json(AddAdminResponse { admins }))
 }
diff --git a/crates/api/src/local_user/ban_person.rs b/crates/api/src/local_user/ban_person.rs
index caa30465dbb931157e07ef16407e99812c8237e6..d7c47e6192e18dda833c2e9532686303a0a826cb 100644
--- a/crates/api/src/local_user/ban_person.rs
+++ b/crates/api/src/local_user/ban_person.rs
@@ -2,10 +2,9 @@ use activitypub_federation::config::Data;
 use actix_web::web::Json;
 use lemmy_api_common::{
   context::LemmyContext,
-  person::BanPerson,
+  person::{BanPerson, BanPersonResponse},
   send_activity::{ActivityChannel, SendActivityData},
   utils::{check_expire_time, is_admin, remove_user_data},
-  SuccessResponse,
 };
 use lemmy_db_schema::{
   source::{
@@ -27,7 +26,7 @@ pub async fn ban_from_site(
   data: Json<BanPerson>,
   context: Data<LemmyContext>,
   local_user_view: LocalUserView,
-) -> Result<Json<SuccessResponse>, LemmyError> {
+) -> Result<Json<BanPersonResponse>, LemmyError> {
   // Make sure user is an admin
   is_admin(&local_user_view)?;
 
@@ -82,5 +81,8 @@ pub async fn ban_from_site(
   )
   .await?;
 
-  Ok(Json(SuccessResponse::default()))
+  Ok(Json(BanPersonResponse {
+    person_view,
+    banned: data.ban,
+  }))
 }
diff --git a/crates/api/src/local_user/block.rs b/crates/api/src/local_user/block.rs
index 2524c0d8eb3f82174acbe462c7027151f0af7f9d..cb345616bb59b2c15af0ccb4705b1cbf6c9f5d65 100644
--- a/crates/api/src/local_user/block.rs
+++ b/crates/api/src/local_user/block.rs
@@ -1,10 +1,14 @@
 use actix_web::web::{Data, Json};
-use lemmy_api_common::{context::LemmyContext, person::BlockPerson, SuccessResponse};
+use lemmy_api_common::{
+  context::LemmyContext,
+  person::{BlockPerson, BlockPersonResponse},
+};
 use lemmy_db_schema::{
   source::person_block::{PersonBlock, PersonBlockForm},
   traits::Blockable,
 };
 use lemmy_db_views::structs::LocalUserView;
+use lemmy_db_views_actor::structs::PersonView;
 use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType};
 
 #[tracing::instrument(skip(context))]
@@ -12,7 +16,7 @@ pub async fn block_person(
   data: Json<BlockPerson>,
   context: Data<LemmyContext>,
   local_user_view: LocalUserView,
-) -> Result<Json<SuccessResponse>, LemmyError> {
+) -> Result<Json<BlockPersonResponse>, LemmyError> {
   let target_id = data.person_id;
   let person_id = local_user_view.person.id;
 
@@ -41,5 +45,9 @@ pub async fn block_person(
       .with_lemmy_type(LemmyErrorType::PersonBlockAlreadyExists)?;
   }
 
-  Ok(Json(SuccessResponse::default()))
+  let person_view = PersonView::read(&mut context.pool(), target_id).await?;
+  Ok(Json(BlockPersonResponse {
+    person_view,
+    blocked: data.block,
+  }))
 }
diff --git a/crates/api/src/local_user/notifications/mark_reply_read.rs b/crates/api/src/local_user/notifications/mark_reply_read.rs
index cc8a9774ee15d856fa7a8779ba5e3aa620f26575..f7b259c94b1a914b9dc7c31e0e6bb2aed38f3abd 100644
--- a/crates/api/src/local_user/notifications/mark_reply_read.rs
+++ b/crates/api/src/local_user/notifications/mark_reply_read.rs
@@ -1,10 +1,14 @@
 use actix_web::web::{Data, Json};
-use lemmy_api_common::{context::LemmyContext, person::MarkCommentReplyAsRead, SuccessResponse};
+use lemmy_api_common::{
+  context::LemmyContext,
+  person::{CommentReplyResponse, MarkCommentReplyAsRead},
+};
 use lemmy_db_schema::{
   source::comment_reply::{CommentReply, CommentReplyUpdateForm},
   traits::Crud,
 };
 use lemmy_db_views::structs::LocalUserView;
+use lemmy_db_views_actor::structs::CommentReplyView;
 use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType};
 
 #[tracing::instrument(skip(context))]
@@ -12,7 +16,7 @@ pub async fn mark_reply_as_read(
   data: Json<MarkCommentReplyAsRead>,
   context: Data<LemmyContext>,
   local_user_view: LocalUserView,
-) -> Result<Json<SuccessResponse>, LemmyError> {
+) -> Result<Json<CommentReplyResponse>, LemmyError> {
   let comment_reply_id = data.comment_reply_id;
   let read_comment_reply = CommentReply::read(&mut context.pool(), comment_reply_id).await?;
 
@@ -31,5 +35,10 @@ pub async fn mark_reply_as_read(
   .await
   .with_lemmy_type(LemmyErrorType::CouldntUpdateComment)?;
 
-  Ok(Json(SuccessResponse::default()))
+  let comment_reply_id = read_comment_reply.id;
+  let person_id = local_user_view.person.id;
+  let comment_reply_view =
+    CommentReplyView::read(&mut context.pool(), comment_reply_id, Some(person_id)).await?;
+
+  Ok(Json(CommentReplyResponse { comment_reply_view }))
 }
diff --git a/crates/api/src/site/block.rs b/crates/api/src/site/block.rs
index 6cf220038b78987fc9b4f3b4c160353495b804b1..be48e8ce85c57419209d7078b3bb4708d79251f7 100644
--- a/crates/api/src/site/block.rs
+++ b/crates/api/src/site/block.rs
@@ -1,6 +1,9 @@
 use activitypub_federation::config::Data;
 use actix_web::web::Json;
-use lemmy_api_common::{context::LemmyContext, site::BlockInstance, SuccessResponse};
+use lemmy_api_common::{
+  context::LemmyContext,
+  site::{BlockInstance, BlockInstanceResponse},
+};
 use lemmy_db_schema::{
   source::instance_block::{InstanceBlock, InstanceBlockForm},
   traits::Blockable,
@@ -13,7 +16,7 @@ pub async fn block_instance(
   data: Json<BlockInstance>,
   local_user_view: LocalUserView,
   context: Data<LemmyContext>,
-) -> Result<Json<SuccessResponse>, LemmyError> {
+) -> Result<Json<BlockInstanceResponse>, LemmyError> {
   let instance_id = data.instance_id;
   let person_id = local_user_view.person.id;
   let instance_block_form = InstanceBlockForm {
@@ -31,5 +34,7 @@ pub async fn block_instance(
       .with_lemmy_type(LemmyErrorType::InstanceBlockAlreadyExists)?;
   }
 
-  Ok(Json(SuccessResponse::default()))
+  Ok(Json(BlockInstanceResponse {
+    blocked: data.block,
+  }))
 }
diff --git a/crates/api_common/src/community.rs b/crates/api_common/src/community.rs
index dab69e7112e140a3cabb0356cfb90353486de1ca..8e87ab750212c17976184686a44e773e6a9b0519 100644
--- a/crates/api_common/src/community.rs
+++ b/crates/api_common/src/community.rs
@@ -4,7 +4,7 @@ use lemmy_db_schema::{
   ListingType,
   SortType,
 };
-use lemmy_db_views_actor::structs::{CommunityModeratorView, CommunityView};
+use lemmy_db_views_actor::structs::{CommunityModeratorView, CommunityView, PersonView};
 use serde::{Deserialize, Serialize};
 use serde_with::skip_serializing_none;
 #[cfg(feature = "full")]
@@ -100,6 +100,15 @@ pub struct BanFromCommunity {
   pub expires: Option<i64>,
 }
 
+#[derive(Debug, Serialize, Deserialize, Clone)]
+#[cfg_attr(feature = "full", derive(TS))]
+#[cfg_attr(feature = "full", ts(export))]
+/// The response for banning a user from a community.
+pub struct BanFromCommunityResponse {
+  pub person_view: PersonView,
+  pub banned: bool,
+}
+
 #[derive(Debug, Serialize, Deserialize, Clone, Default)]
 #[cfg_attr(feature = "full", derive(TS))]
 #[cfg_attr(feature = "full", ts(export))]
@@ -110,6 +119,14 @@ pub struct AddModToCommunity {
   pub added: bool,
 }
 
+#[derive(Debug, Serialize, Deserialize, Clone)]
+#[cfg_attr(feature = "full", derive(TS))]
+#[cfg_attr(feature = "full", ts(export))]
+/// The response of adding a moderator to a community.
+pub struct AddModToCommunityResponse {
+  pub moderators: Vec<CommunityModeratorView>,
+}
+
 #[skip_serializing_none]
 #[derive(Debug, Serialize, Deserialize, Clone, Default)]
 #[cfg_attr(feature = "full", derive(TS))]
@@ -183,6 +200,16 @@ pub struct BlockCommunity {
   pub block: bool,
 }
 
+#[skip_serializing_none]
+#[derive(Debug, Serialize, Deserialize, Clone)]
+#[cfg_attr(feature = "full", derive(TS))]
+#[cfg_attr(feature = "full", ts(export))]
+/// The block community response.
+pub struct BlockCommunityResponse {
+  pub community_view: CommunityView,
+  pub blocked: bool,
+}
+
 #[derive(Debug, Serialize, Deserialize, Clone, Default)]
 #[cfg_attr(feature = "full", derive(TS))]
 #[cfg_attr(feature = "full", ts(export))]
diff --git a/crates/api_common/src/person.rs b/crates/api_common/src/person.rs
index 9642821c43fe9b4cf3f7947da45f57e01a6254f8..c067c37998c16c34d23f0b32ac9ad36602ddc737 100644
--- a/crates/api_common/src/person.rs
+++ b/crates/api_common/src/person.rs
@@ -193,6 +193,14 @@ pub struct AddAdmin {
   pub added: bool,
 }
 
+#[derive(Debug, Serialize, Deserialize, Clone)]
+#[cfg_attr(feature = "full", derive(TS))]
+#[cfg_attr(feature = "full", ts(export))]
+/// The response of current admins.
+pub struct AddAdminResponse {
+  pub admins: Vec<PersonView>,
+}
+
 #[skip_serializing_none]
 #[derive(Debug, Serialize, Deserialize, Clone, Default)]
 #[cfg_attr(feature = "full", derive(TS))]
@@ -216,6 +224,15 @@ pub struct BannedPersonsResponse {
   pub banned: Vec<PersonView>,
 }
 
+#[derive(Debug, Serialize, Deserialize, Clone)]
+#[cfg_attr(feature = "full", derive(TS))]
+#[cfg_attr(feature = "full", ts(export))]
+/// A response for a banned person.
+pub struct BanPersonResponse {
+  pub person_view: PersonView,
+  pub banned: bool,
+}
+
 #[derive(Debug, Serialize, Deserialize, Clone, Default)]
 #[cfg_attr(feature = "full", derive(TS))]
 #[cfg_attr(feature = "full", ts(export))]
@@ -225,6 +242,15 @@ pub struct BlockPerson {
   pub block: bool,
 }
 
+#[derive(Debug, Serialize, Deserialize, Clone)]
+#[cfg_attr(feature = "full", derive(TS))]
+#[cfg_attr(feature = "full", ts(export))]
+/// The response for a person block.
+pub struct BlockPersonResponse {
+  pub person_view: PersonView,
+  pub blocked: bool,
+}
+
 #[skip_serializing_none]
 #[derive(Debug, Serialize, Deserialize, Clone, Default)]
 #[cfg_attr(feature = "full", derive(TS))]
@@ -292,6 +318,14 @@ pub struct MarkCommentReplyAsRead {
   pub read: bool,
 }
 
+#[derive(Debug, Serialize, Deserialize, Clone)]
+#[cfg_attr(feature = "full", derive(TS))]
+#[cfg_attr(feature = "full", ts(export))]
+/// The response for a comment reply action.
+pub struct CommentReplyResponse {
+  pub comment_reply_view: CommentReplyView,
+}
+
 #[derive(Debug, Serialize, Deserialize, Clone, Default)]
 #[cfg_attr(feature = "full", derive(TS))]
 #[cfg_attr(feature = "full", ts(export))]
diff --git a/crates/api_common/src/site.rs b/crates/api_common/src/site.rs
index a66f200407ee0d41879c9e687a19baeaf8ce348f..d40729e3558adedb7797987e49e1939b9dcb48f5 100644
--- a/crates/api_common/src/site.rs
+++ b/crates/api_common/src/site.rs
@@ -416,3 +416,11 @@ pub struct BlockInstance {
   pub instance_id: InstanceId,
   pub block: bool,
 }
+
+#[skip_serializing_none]
+#[derive(Debug, Serialize, Deserialize, Clone)]
+#[cfg_attr(feature = "full", derive(TS))]
+#[cfg_attr(feature = "full", ts(export))]
+pub struct BlockInstanceResponse {
+  pub blocked: bool,
+}