# Getting Started

Stream's Moderation API lets you integrate content moderation into any application. This guide walks you through installing one of the [backend SDKs](https://getstream.io/docs/platform/backend-sdks/), configuration, and your first moderation check.

Moderation lives in the [Stream Dashboard](https://getstream.io/signin/?product=moderation), where you can create and tune policies, manage AI rules and blocklists, and review flagged content across your app.

## Start here

- [Policies](https://getstream.io/moderation/docs/ruby/configuration/policies/): Choose which engines run and what happens when content matches.
- [Stream Chat integration](https://getstream.io/moderation/docs/ruby/integrations/stream-chat/): Moderate chat messages with no code changes.
- [Stream Feeds integration](https://getstream.io/moderation/docs/ruby/integrations/stream-feeds/): Automatically moderate activities and comments as they are created or updated.

## Stream CLI and Agent Skills

Manage moderation from your terminal with the [Stream CLI](https://getstream.io/cli/docs/), including scripting policy setup and AI-agent workflows. Install the CLI and the default [Agent Skills](https://getstream.io/agent-skills/docs/):

```bash
curl -fsSL https://getstream.io/cli.sh | bash
getstream skills
```

Then ask your agent in plain English, for example:

```text
/stream Show flagged content in the review queue.
```

See the [CLI docs](https://getstream.io/cli/docs/) and [Agent Skills docs](https://getstream.io/agent-skills/docs/) for more.

## Installation

```bash
gem install getstream-ruby
```

Or add to your `Gemfile`:

```ruby
gem 'getstream-ruby'
```

## Initialize the client

```ruby
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:

```ruby
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](https://getstream.io/moderation/docs/ruby/configuration/policies/) for details.

## Check content

```ruby
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)

The check returns a recommendation for your code to enforce. Stream adds flagged and removed content to the review queue:

```mermaid
flowchart LR
  content[User content] --> check[Moderation check]
  check --> rec{recommended_action}
  rec -->|keep| keep[Your app keeps it]
  rec -->|flag| queue[Review queue]
  rec -->|remove| removed[Your app removes it]
  removed -.->|for audit and appeals| queue
```

```ruby
case response.data.recommended_action
when "keep"
  # Content is safe, no action needed
when "flag"
  # Content is suspicious; Stream has queued it for review
  puts "Flagged for review: #{response.data.item}"
when "remove"
  # Content violates policies, remove it
  puts "Content removed: #{response.data.item}"
end
```

## What's next

- [Review queue](https://getstream.io/moderation/docs/ruby/content-moderation/review-queue/): Query and act on flagged content.
- [Webhooks](https://getstream.io/moderation/docs/ruby/content-moderation/webhooks/): Get review queue events delivered to your backend.
- [Client configuration](https://getstream.io/moderation/docs/ruby/guides/client-configuration/): HTTP defaults, timeouts, and connection pooling.

## FAQ

**Which engines can check content?**

LLM and NLP text engines, plus image, video and audio moderation. Start with the [LLM text engine](https://getstream.io/moderation/docs/ruby/engines/ai-llm-text/).

**Do messages sent from my server get moderated?**

Content sent to the Check API is always moderated. Chat messages sent from the server skip moderation by default; set `force_moderation` to `true` to include them. The flag is server-side only and ignored when sent from a client-side SDK. See [chat moderation](https://getstream.io/moderation/docs/ruby/integrations/stream-chat/#server-side-integration).

**Can tenants manage their own moderation?**

Yes, for chat. Tenants manage their own policies, with client-side access restricted to their team, and team blocklists need a feature flag from support. See [multitenancy](https://getstream.io/moderation/docs/ruby/configuration/multitenancy/).

**Can I build my own review dashboard?**

Yes, on the same APIs Stream's dashboard uses. The [dashboard guide](https://getstream.io/moderation/docs/ruby/guides/build-moderation-dashboard/) walks through it.

---

For the most recent version of this documentation, visit [https://getstream.io/moderation/docs/ruby/](https://getstream.io/moderation/docs/ruby/).