Stores, consoles and regulators expect games with chat to moderate it. Chat Guard 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.No card needed.
Global chatExample
nova: gg, that last round was close
checkingDecision: allow212 ms
brakk: ez game, too easy lol
checkingDecision: allowinsult 0.19264 ms
slayer_x: you're a worthless idiot, uninstall
checkingDecision: hideinsult 0.98287 ms
mira: anyone trading an ice sword? paying 2k gold
checkingDecision: allowspam 0.41241 ms
g0ldshop: cheap accounts with all skins, $20 paypal, dm me
checkingDecision: hidetrading 0.99305 ms
slayer_x: you're a worthless idiot, uninstall
checkingDecision: hiderepeat3 ms
slayer_x: I know where you live
checkingDecision: blockseverity 2.82298 ms
nova: anyway, rematch?
checkingDecision: allow198 ms
nova: gg, that last round was close
brakk: ez game, too easy lol
mira: anyone trading an ice sword? paying 2k gold
nova: anyway, rematch?
4 of 8 lines are kept from other players.
What stores, consoles and laws ask of chat
They each put it their own way, but most of it comes down to a few things. Here they are, and what Chat Guard does for each.
Rules for player chatwhat Chat Guard does
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 with its scores, severity and action for 90 days, or longer while you keep its message text. On paid plans you can keep that text for review, for a period you set.
Put a wrong call right, quickly
Report a wrong call from your server or support tools 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 · global chat, 16+
nova: gg, that last round was close
brakk: ez game, too easy lol
slayer_x: you're a worthless idiot, uninstall
Insult0.98
Threat0.03
Hate0.03
Sexual0.02
Spam0.04
Trading0.01
Severity
1.79 of 3
Aimed at
another player
Answered in
287 ms
hideInsults hide at 0.80 by default, so other players never see this line.
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
Drag to choose the score at which an insult is hidden. Flagging stays at 0.55, the default.
ez game, too easy lol0.06allow
you play like a potato0.75flag
you're awful at this game0.87hide
you're a worthless idiot, uninstall0.99hide
Hide at 0.80: 2 hidden, 1 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.csUnity 2021.3.42 LTS and newer
using ChatGuard;using ChatGuard.Core;// Set up once with your key: ChatGuardSdk.Configure(apiKey);// (or a config asset at Assets/Resources/ChatGuardConfig.asset)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"); });}
using System.Collections;using ChatGuard;using ChatGuard.Core;IEnumerator SendChat(string playerId, string text){ ModerationOperation op = ChatGuardSdk.Moderate(text, playerId); yield return op; // waits for the answer; op.Cancel() aborts it ModerationResult result = op.Result; if (result == null) // canceled yield break; 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");}
using ChatGuard;using ChatGuard.Core;// Moderate returns an operation you can await directly.async void OnPlayerMessage(string playerId, string text){ ModerationResult result = await ChatGuardSdk.Moderate(text, playerId); 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:
Add the Chat Guard Hook component to a GameObject and connect its events to your chat UI. It sends the player id you set after login (SetPlayerId, which a UnityEvent can call), or a random id per installation if you don't.
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 an [Rpc(SendTo.Server)] method, then send it on with RPCs only the server may call (InvokePermission, Netcode 2.7 and newer). On older versions, use [ServerRpc] and [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, and throw an error 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 GitHub, 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, each billing month on paid plans and every 30 days on Free. 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
Free
For building, testing and a playtest.
$0/ month$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
101001k10k
Over 10,000? Chat keeps working. A basic word filter takes over until your 30-day window frees up.
Every organization starts on Free and upgrades in the dashboard.
Only messages our model checks count, so your real number may be lower.
Extra messagesIndie and Studio
Go over your plan?We keep going.
Extra messages are $0.25 per 1,000, counted per billing month and 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 that reuse the same request_id within 10 minutes 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.
Paid plans' included messages reset each billing month; Free counts a rolling 30 days. Upgrades start right away, and downgrades and cancellations at the end of the current period.A data processing agreement (DPA) is available on every plan.
Questions studios ask first
Answers6 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 GitHub, 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. In Unity, the package answers with its built-in word filter, and the result says so (degraded: true). The filter is simpler than the model, so you might hide rather than block while it answers. Over HTTP, your code decides: the examples give up after about 2 seconds and fall back to your own policy.
Who do I ask about plans?
Questions about plans? Write to sales@chatguard.dev. Already using Chat Guard? Write to support@chatguard.dev about your account or billing. For help with your integration, ask in #help on our Discord, or email us on a paid plan.
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.