Chat moderation for Unity games. The rules, handled.

Stores, consoles and regulators expect games with chat to moderate it. Chat Guard does it for you: it checks every message before other players see it, in about 300 ms, and tells trash talk from real abuse.

Free for 10,000 messages every 30 days.Sign in with Google or GitHub, no card needed.

Global chatExample
  1. nova: gg, that last round was close

    Decision: allow212 ms

  2. brakk: ez game, your team is trash lol

    Decision: allowinsult 0.27264 ms

  3. slayer_x: you're a worthless idiot, uninstall

    Decision: hideinsult 0.98287 ms

  4. mira: anyone trading an ice sword? paying 2k gold

    Decision: allow241 ms

  5. g0ldshop: cheap accounts with all skins, $20 paypal, dm me

    Decision: hidetrading 0.99305 ms

  6. slayer_x: you're a worthless idiot, uninstall

    Decision: hiderepeat3 ms

  7. slayer_x: I know where you live

    Decision: blockthreat 0.99298 ms

  8. nova: anyway, rematch?

    Decision: allow198 ms

4 of 8 lines are kept from other players.

What “handled” means

Stores, consoles and laws each put it their own way, but most of what they ask of chat comes down to a few things. Here they are, and what Chat Guard does for each.

Rules for player chat
Stop abuse before other players see it
Every message is checked before your game shows it, for insults, threats, hate, sexual content, spam and real-money trading, and your game gets one clear answer: allow, flag, hide or block.
Keep chat right for your age rating
Send each channel's age rating, like 12+ or 18+ (channel.age_rating), and sexual content is judged against it.
Be able to explain every decision
Every decision is logged for 90 days with its scores, severity and action. On paid plans you can also keep the message text for review, for a period you set.
Put a wrong call right, quickly
Report a wrong call from your game with one request (POST /v1/feedback). It shows up next to the decision in your dashboard, and a threshold or rule change fixes it from the next message.
Protect players' personal data
Message text isn't stored by default, only a hash of it. Export or erase a player's data from the dashboard, and a data processing agreement comes with every plan.

Chat Guard does the moderation work. Your game still decides what to show, and it still needs its own report and mute buttons for players. The details on player data are in our privacy notes and data processing agreement.

Fast enough for live chat. Precise enough to trust.

A fresh check takes about 300 ms; repeats and your own block rules answer in a few milliseconds. Each message is judged with the lines before it, its channel and its age rating, so banter about the match and an attack on a player get different answers.

One message, checkedExample · team chat, 16+
  1. brakk: ez game, your team is trash lol
  2. nova: gg, that was close

slayer_x: you're a worthless idiot, uninstall

  • Insult0.98
  • Threat0.02
  • Hate0.03
  • Sexual0.02
  • Spam0.02
  • Trading0.01
Severity
1.72 of 3
Aimed at
another player
Answered in
287 ms

hideInsults hide at 0.80 by default, so other players never see this line.

The responseExample · POST /v1/moderate
{
  "action": "hide",
  "severity": 1.72,
  "verdicts": {
    "insult": { "p": 0.98 },
    "threat": { "p": 0.02 },
    "hate": { "p": 0.03 },
    "sexual": { "p": 0.02 },
    "spam": { "p": 0.02 },
    "trading": { "p": 0.01 }
  },
  "target": {
    "choice": "other_user",
    "confidence": 0.84
  },
  "latency_ms": 287
}

It reads leetspeak, look-alike letters and stretched words for what they are, and it works in English, Spanish, Portuguese, German, Russian, Polish, Turkish and Serbian, each with its own word lists and slang.

Change the rules without shipping a build

Thresholds and rules live in your dashboard, not in your game. Save a change and the next message uses it: no new build, no store review, no waiting for players to update.

Thresholds · InsultExample
0.80

Drag to choose the score at which an insult is hidden. Flagging stays at 0.55, the default.

  • ez game, your team is trash0.27allow
  • you play like a potato0.62flag
  • honestly you're kind of useless0.74flag
  • you're a worthless idiot, uninstall0.98hide

Hide at 0.80: 1 hidden, 2 flagged, 1 allowed.

In the dashboard, a saved change applies from the next message.

Thresholds
How strict to be, per category: the score at which a message is flagged, hidden or blocked.
Block and allow rules
Words and patterns that are always blocked, or always fine for a category, like “kill” in a shooter.
House rules in plain words
Context rules the model reads with every message, like “Trash talk about the match is fine; personal attacks are not.”
Test before you save
Try a change on real messages in the dashboard first. Tests are free and never logged.

Thresholds are on every plan; custom rules come with Indie and up.

Works with the multiplayer setup you already have

Call Chat Guard before you show a message. In Unity that's a few lines with our package; any other server sends one HTTP request.

ChatServer.cs
using ChatGuard.Core;
using ChatGuard.Unity;

// Settings come from Assets/Resources/ChatGuardConfig.asset,
// or from code: ChatGuardSdk.Configure(apiKey, baseUrl);
void OnPlayerMessage(string playerId, string text)
{
    ChatGuardSdk.Moderate(text, playerId, result =>
    {
        if (result.ShouldDeliver)   // allow or flag
            ShowInChat(playerId, text);
        else if (result.Action == ModerationAction.Hide)
            ShowToSenderOnly(playerId, text);   // others never see it
        else                        // block
            TellSender(playerId, "Message not delivered");
    });
}

In Package Manager, choose Add package from git URL and paste:

https://github.com/chatguard-dev/chat-guard-unity.git
Prefer no code?
Add the Chat Guard Hook component to a GameObject and connect its events to your chat UI.
Free test keys
Test keys for the Editor and CI never count toward your plan, up to 1,000 requests a day per organization.
Where to call it8 setups
  • Netcode for GameObjects: Check the message in your ServerRpc, then send it on with a ClientRpc.
  • Mirror: The same pattern with [Command] and [ClientRpc].
  • FishNet: The same pattern with [ServerRpc] and [ObserversRpc].
  • Photon Fusion: Check on the state authority before the message is replicated.
  • Nakama: Call Chat Guard over HTTP from a before hook on ChannelMessageSend; return null to drop the message.
  • Colyseus: Call Chat Guard over HTTP in your room's onMessage handler, before you broadcast the message.
  • Photon PUN, Photon Chat and other setups without a game server: Run the small example relay from the package, which keeps your key off players' devices, or call from the game with a publishable key.
  • Any other server: One HTTP request per message. The dashboard has examples for C#, TypeScript, Python, Go and Java, and every field is in the API reference.

Start free. Pay when your game gets chatty.

Each plan is a number of chat messages we check for you every 30 days. We've turned those numbers into players, so you can see where your game fits.

Quiet game

Co-op or competitive. Most talk happens on voice. About 10 chat messages per player a day.

Chatty game

Social, roleplay or MMO-style. Text chat is the hangout. About 33 messages per player a day.

How we count

A plan's messages, divided by 30 days and by messages per player, then rounded.

Free

For building, testing and a playtest.

$0 a month

10,000

messages every 30 days

About 333 a day.

Daily players it fits

Quiet game
about 30
Chatty game
about 10

Over 10,000? Chat keeps working. A basic word filter takes over until your 30-day window frees up.

Indie

Suits most indie studios.

$29 a month

150,000

messages every 30 days

About 5,000 a day.

Daily players it fits

Quiet game
about 500
Chatty game
about 150

Game took off? Extra messages cost $0.25 per 1,000.

  • All languages
  • Custom allow, block and context rules
  • Evidence logs, up to 90 days
  • No evidence export
  • Email support

Studio

For games with a busy daily crowd.

$199 a month

1,000,000

messages every 30 days

About 33,000 a day.

Daily players it fits

Quiet game
about 3,300
Chatty game
about 1,000

Game took off? Extra messages cost $0.25 per 1,000.

  • All languages
  • Custom allow, block and context rules
  • Evidence logs, up to 365 days
  • Evidence export
  • Priority support

Enterprise

Customby contract

Bigger than Studio, or need a contract? We agree the volume with you. You get everything in Studio, and extra messages are priced in your contract.

Which plan fits?

Tell us roughly how many people play each day and how much they chat. We'll do the maths.

Your numbersAn estimate, not a quote

People who play on a given day. Type a number or use the slider.

How chatty is your game?

Quiet: co-op or competitive, most talk is on voice. Chatty: social, roleplay or MMO-style, text chat is the hangout.

About 300,000messages a month

1,000 players × 10 a day × 30 days

Indie fits. $29 + $37.50 extra = about $66.50 a month.

Cost at this volumeUSD a month
  1. Free10,000 checked by the model

    Word filter above 10,000
  2. Indie150,000 included + 150,000 extra

    $66.50, cheapest
  3. Studio1,000,000 included

    $199
  4. Enterprisecustom volume

    Priced with youTalk to us

Picked on price alone. Need evidence export or priority support? That's Studio at any volume.

Sign in to upgrade

Every organization starts on Free and upgrades in the dashboard.

Only messages our model checks count, so your real number may be lower.

If you go overIndie and Studio

We keep going.

Extra messages are $0.25 per 1,000, added to your bill automatically. No cap, no cut-off. A good problem to have.

What extra messages cost
10,000 extra messages$2.50
100,000 extra messages$25
500,000 extra messages$125

What counts? Only messages our model checks. Messages your block rules catch, test keys and retries of the same request are free.

Indie or Studio? Indie plus extra costs less than Studio up to about 830,000 messages a month. Above that, Studio is cheaper.

Nothing here fits?

Write to support@chatguard.dev and we'll work something out.

Payments and invoices are handled by Polar.sh, our merchant of record.Upgrades start right away. Downgrades and cancellations take effect at the end of the current period.A data processing agreement (DPA) is available on every plan.

Questions studios ask first

Answers5 questions
What do allow, flag, hide and block mean?
They tell your game what to do with the message. Allow: show it. Flag: show it and mark it for your team to review. Hide: only the sender sees it, so they don't learn they were caught. Block: nobody sees it, and the sender is told.
Do I need my own game server?
No. If you have a server or host (Netcode for GameObjects, Mirror, FishNet, Photon Fusion, Nakama, Colyseus), call Chat Guard there. If you don't, run the small example relay from the package, or call Chat Guard straight from the game with a publishable key. A check made on a player's device can be skipped by a modified client, so a server or relay is the safer place.
Can each game or region have its own rules?
Yes. Every project has its own thresholds, rules and keys. Make one project per game, or one per region or age rating when their rules differ.
Where does message text go?
To our API in Amsterdam, and to our model provider in the United States for the check itself. Chat Guard keeps only a hash of it unless you turn on evidence logs. Every sub-processor is listed in the privacy notes.
What if Chat Guard can't be reached?
Chat keeps working. A built-in word filter answers instead, and the response says so (degraded: true). The filter is simpler than the model, so you might hide rather than block while it answers.

Add moderation to your game with one call

Install the package, create a key and call it before you show a message. Free for 10,000 messages every 30 days.