Stream Feeds has support for moderation, allowing you to manage user interactions, content moderation, and platform safety. It's accessible through the client.moderation property.
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();
Ban a user from the platform with various options including timeout, shadow bans, and IP bans.
await client.moderation.ban({ target_user_id: "user-123", reason: "Violation of community guidelines", timeout: 3600, // 1 hour in seconds shadow: false, ip_ban: false,});
await client.moderation.ban({ target_user_id: "user-123", reason: "Violation of community guidelines", timeout: 3600, // 1 hour in seconds shadow: false, ip_ban: false,});
await client.moderation.ban({ target_user_id: "user-123", reason: "Violation of community guidelines", timeout: 3600, // 1 hour in seconds shadow: false, ip_ban: false,});
val banRequest = BanRequest( targetUserId = "user-123", reason = "Violation of community guidelines", timeout = 3600, // 1 hour in seconds shadow = false, ipBan = false)val response: Result<BanResponse> = client.moderation.ban(banRequest = banRequest)println("User banned for: ${response.getOrNull()?.duration}")
let banRequest = BanRequest( targetUserId: "user-123", reason: "Violation of community guidelines", timeout: 3600, // 1 hour in seconds shadow: false, ipBan: false)let response = try await client.moderation.ban(banRequest: banRequest)print("User banned for: \(response.duration)")
const banRequest = BanRequest( targetUserId: 'user-123', reason: 'Violation of community guidelines', timeout: 3600, // 1 hour in seconds shadow: false, ipBan: false,);final response = await client.moderation.ban(banRequest: banRequest);print('User banned for: ${response.getOrThrow().duration}');
await client.moderation.ban({ target_user_id: "user-123", banned_by_id: "<banned by user id>", reason: "Violation of community guidelines", timeout: 3600, // 1 hour in seconds shadow: false, ip_ban: false,});
moderation_response = self.client.feeds.activity_feedback( activity_id, report=True, reason="inappropriate_content", user_id=self.test_user_id_2, # Different user reporting)
$banRequest = new GeneratedModels\BanRequest( targetUserID: "user123", reason: "Violation of community guidelines", timeout: 60, // 1 hour in minutes shadow: false, ipBan: false, bannedByID: "eric");$response = $moderationClient->ban($banRequest);
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();
Parameters:
targetUserId: The ID of the user to ban
reason: Optional reason for the ban
timeout: Optional timeout in seconds (null for permanent ban)
shadow: Whether to perform a shadow ban (user doesn't know they're banned)
ipBan: Whether to ban the user's IP address
bannedBy: Optional user who performed the ban
deleteMessages: Whether to delete user's messages
To reverse a ban, see Unban User in the Moderation docs. The user object returned by queryUsers only exposes the ban state (banned, ban_expires) — it does not include banned_by or the ban reason. To retrieve that metadata, use Query Banned Users.
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();
Parameters:
targetIds: Array of user IDs to mute
timeout: Optional timeout in seconds (null for permanent mute)
moderation_response = self.client.feeds.activity_feedback( activity_id, report=True, reason="inappropriate_content", user_id=self.test_user_id_2, # Different user reporting)
$blockRequest = new GeneratedModels\BlockUsersRequest( blockedUserID: "user123", userID: "moderator");$response = $moderationClient->blockUsers($blockRequest);
// Coming soon
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();
client.unblockUsers({ blocked_user_id: "user-123", user_id: "<moderator user id>",});
moderation_response = self.client.feeds.activity_feedback( activity_id, report=True, reason="inappropriate_content", user_id=self.test_user_id_2, # Different user reporting)
$request = new GeneratedModels\UnblockUsersRequest( blockedUserID: "user123", userID: "moderator");$response = $moderationClient->unblockUsers($request);
// Coming soon
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();
let blockedUsers = try await client.moderation.getBlockedUsers()for user in blockedUsers.users { print("Blocked user: \(user.id)")}
final blockedUsers = await client.moderation.getBlockedUsers();for (final user in blockedUsers.getOrThrow().blocks) { print('Blocked user: ${user.blockedUserId}');}
client.getBlockedUsers({ user_id: "<moderator user id>" });
moderation_response = self.client.feeds.activity_feedback( activity_id, report=True, reason="inappropriate_content", user_id=self.test_user_id_2, # Different user reporting)
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();
Parameters:
entityId: The ID of the content to flag
entityType: The type of content (e.g., "stream:feeds:v3:activity", "stream:feeds:v3:comment")
reason: Optional reason for flagging
entityCreatorId: Optional ID of the content creator
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();
client.moderation.queryReviewQueue({ // Query parameters for filtering and pagination});
client.moderation.queryReviewQueue({ // Query parameters for filtering and pagination});
client.moderation.queryReviewQueue({ // Query parameters for filtering and pagination});
val queryRequest = QueryReviewQueueRequest( // Query parameters for filtering and pagination)val reviewQueue: Result<QueryReviewQueueResponse> = client.moderation.queryReviewQueue(queryRequest)
let queryRequest = QueryReviewQueueRequest( // Query parameters for filtering and pagination)let reviewQueue = try await client.moderation.queryReviewQueue(queryReviewQueueRequest: queryRequest)
const queryRequest = QueryReviewQueueRequest( // Query parameters for filtering and pagination );final reviewQueue = await client.moderation .queryReviewQueue(queryReviewQueueRequest: queryRequest);
client.moderation.queryReviewQueue({ // Query parameters for filtering and pagination user_id: user.id,});
moderation_response = self.client.feeds.activity_feedback( activity_id, report=True, reason="inappropriate_content", user_id=self.test_user_id_2, # Different user reporting)
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();
All moderation methods can throw errors. Handle them appropriately:
try { const response = await client.moderation.ban({ target_user_id: "user-123", reason: "Violation of community guidelines", timeout: 3600, // 1 hour in seconds shadow: false, ip_ban: false, }); console.log(`Banned successfully`);} catch (e) { console.error(`Failed to ban user, error: ${e}`);}
try { const response = await client.moderation.ban({ target_user_id: "user-123", reason: "Violation of community guidelines", timeout: 3600, // 1 hour in seconds shadow: false, ip_ban: false, }); console.log(`Banned successfully`);} catch (e) { console.error(`Failed to ban user, error: ${e}`);}
try { const response = await client.moderation.ban({ target_user_id: "user-123", reason: "Violation of community guidelines", timeout: 3600, // 1 hour in seconds shadow: false, ip_ban: false, }); console.log(`Banned successfully`);} catch (e) { console.error(`Failed to ban user, error: ${e}`);}
// Functions that can result in errors, return Kotlin `Result` objectsval result: Result<BanResponse> = client.moderation.ban(banRequest)
do { let response = try await client.moderation.ban(banRequest: banRequest) print("User banned successfully")} catch { print("Failed to ban user: \(error)")}
final response = await client.moderation.ban(banRequest: banRequest);switch (response) { case Success(data: final banResponse): print('User banned for: ${banResponse.duration}'); case Failure(error: final error): print('Error banning user: $error');}
try { const response = await client.moderation.ban({ target_user_id: "user-123", banned_by_id: "<banned by user id>", reason: "Violation of community guidelines", timeout: 3600, // 1 hour in seconds shadow: false, ip_ban: false, }); console.log(`Banned successfully`);} catch (e) { console.error(`Failed to ban user, error: ${e}`);}
moderation_response = self.client.feeds.activity_feedback( activity_id, report=True, reason="inappropriate_content", user_id=self.test_user_id_2, # Different user reporting)
try { $banRequest = new GeneratedModels\BanRequest( targetUserID: "user-123", reason: "Violation of community guidelines", timeout: 60, // 1 hour in minutes shadow: false, ipBan: false, bannedByID: "moderator" ); $response = $moderationClient->ban($banRequest); echo "User banned successfully\n";} catch (Exception $e) { echo "Failed to ban user: " . $e->getResponseBody() . "\n";}
// Note: Moderation typically requires admin permissions// This test demonstrates the API structureConsole.WriteLine($"Activity {activityId} would be moderated here");// In a real scenario, you would call moderation endpoints
ActivityFeedbackRequest moderationRequest = ActivityFeedbackRequest.builder() .report(true) .reason("inappropriate_content") .userID(testUserId2) // Different user reporting .build();ActivityFeedbackResponse moderationResponse = feeds.activityFeedback(activityId, moderationRequest).execute().getData();