Getting Started

Stream's Moderation API lets you integrate content moderation into any application. This guide walks you through installation, configuration, and your first moderation check.

Moderation lives in the Stream Dashboard, where you can create and tune policies, manage AI rules and blocklists, and review flagged content across your app. You can also manage moderation from the terminal with the Stream CLI — useful for scripting policy setup, or for letting an AI agent configure policies and blocklists for you.

Installation

gem install getstream-ruby

Or add to your Gemfile:

gem 'getstream-ruby'

Initialize the Client

require "getstream_ruby"

client = GetStream::Client.new(api_key: "YOUR_API_KEY", api_secret: "YOUR_API_SECRET")

Create a Moderation Policy

Before checking content, create a moderation configuration that defines which rules to apply:

client.moderation.upsert_config(
  GetStream::Generated::Models::UpsertConfigRequest.new(
    key: "my_config",
    ai_text_config: GetStream::Generated::Models::AiTextConfig.new(
      rules: [
        GetStream::Generated::Models::AiTextRule.new(label: "SPAM", action: "flag"),
        GetStream::Generated::Models::AiTextRule.new(label: "HARASSMENT", action: "remove"),
      ]
    ),
    block_list_config: GetStream::Generated::Models::BlockListConfig.new(
      rules: [
        GetStream::Generated::Models::BlockListRule.new(name: "profanity_en", action: "remove"),
      ]
    )
  )
)

For Stream Chat, use config key chat:messaging. For Stream Feeds, use feeds. See Configuration for details.

Check Content

response = client.moderation.check(
  GetStream::Generated::Models::CheckRequest.new(
    entity_type: "stream:chat:v1:message",
    entity_id: "message-123",
    entity_creator_id: "user-456",
    moderation_payload: GetStream::Generated::Models::ModerationPayload.new(
      texts: ["Hello, this is a test message"]
    ),
    config_key: "my_config"
  )
)

puts response.data.recommended_action # "keep", "flag", or "remove"

Handle the Response

The response includes:

  • recommended_action -- "keep", "flag", or "remove"
  • status -- "complete" or "partial" (if async checks are still running)
  • item -- the review queue item (if content was flagged or removed)
case response.data.recommended_action
when "keep"
  # Content is safe, no action needed
when "flag"
  # Content is suspicious, send to review queue
  puts "Flagged for review: #{response.data.item}"
when "remove"
  # Content violates policies, remove it
  puts "Content removed: #{response.data.item}"
end

Next Steps