Discord Bot Permissions & Security
Give your own Discord roles specific bot abilities, one at a time. Every ability, the presets, who can configure the bot, and why your API key is the ceiling no Discord role can exceed.
Two gates, and the key is the ceiling
Every command passes through two independent checks, and both must allow it.
1. Your Discord roles. Which abilities has this member been granted, through the Discord roles they hold? You set this with /permissions.
2. Your API key. Does the GameGrid API key you linked with /setup carry the scope that ability needs?
The second one is not a second thing to grant. It is a limit. Everything the bot does is signed with that one key, so a Discord role can only ever grant a subset of what your API key already allows - never a superset, and never more. If your key does not carry servers:lifecycle, then no Discord role restarts a server through this bot: not a role holding every ability there is, and not the Discord server owner.
The two failures read differently, on purpose, because they have different fixes. A refusal that names an ability - "You need Restart a server (server.restart)" - is your Discord roles, and someone with /permissions can fix it. A refusal that names a scope - "it needs the servers:lifecycle API scope, and the key linked here does not carry it" - is the key, and no Discord role can fix that at all. Mint a key with the missing scope and re-run /setup.
When an ability is blocked by both, the bot names the key. Granting the role would change nothing while the key still cannot back the request, and sending you to the role editor would cost you an afternoon.
Run /permissions key to see exactly what your key allows and which abilities it therefore blocks. Run /permissions refresh-key after minting a new one.
Your roles, your abilities
The bot binds abilities to your own Discord roles, whatever you called them. There is no fixed ladder to place them on: if your server has Verified, Minecraft Player, Veteran and WDCGamegrid Helper, you grant abilities to those, by name, from the role picker Discord already gives you. You never type a role ID.
Pick a role and give it exactly what it should have:
/permissions grant role:@Helpers capability:server.restart
/permissions grant role:@Helpers capability:console.read
/permissions revoke role:@Helpers capability:settings.writeThat is the thing a single access level could not say. @Helpers can bounce a stuck server and cannot change its difficulty, because restarting and changing settings are two abilities rather than one rung.
Several roles add up. A member holding Verified and Minecraft Player and Regular can do everything any of those three grants - the union, not the highest one. A role never takes away what another role gave, and the order your roles appear in on Discord's settings page makes no difference here. That order decides display colour and who can manage whom; it does not decide what the bot lets you do.
There are deliberately no denials. To take an ability away, revoke it from the role that grants it -
/permissions role role:@YourRoleshows you which abilities each role carries, so you can always see why someone can do something.
Every ability
A Discord role holds a set of abilities. There are 55 abilities, and every command requires one of them. A role you have never configured holds none โ every role starts with nothing, including @everyone.
Grant them one at a time with /permissions grant, or start from a preset and adjust. The In preset from column names the lowest preset that includes an ability.
Servers
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
server.view | List servers and read one server's details, status and live stats. | servers:read | member | No |
server.update.check | Ask whether a server has a game update available. | servers:read | member | No |
server.start | Bring a stopped server up. | servers:lifecycle | moderator | No |
server.stop | Shut a running server down. Disconnects every player on it. | servers:lifecycle | moderator | Yes |
server.restart | Restart a server. Disconnects every player on it. | servers:lifecycle | moderator | Yes |
server.autorestart.read | See how often the server restarts itself. | servers:read | member | No |
server.autorestart.write | Change how often the server restarts itself. | servers:write | moderator | Yes |
Settings
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
settings.read | Read setting values, types, allowed values and defaults. | settings:read | member | No |
settings.write | Change a server setting. Usually needs a restart to take effect. | settings:write | moderator | Yes |
Console & logs
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
console.read | Read recent console output. Credentials and player IPs are redacted first. | console:read | operator | No |
console.exec | Send a command to the game server and read its reply. | console:write | operator | Yes |
logs.read | Read the game process log, and mirror it into a Discord channel. | logs:read | member | No |
Players & files
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
players.read | Read the ban, whitelist, admin and other player lists. | players:read | member | No |
files.read | Browse the server's files. | files:read | member | No |
map.read | Open the live map, see who is online and where, and read the leaderboard. | map:read | member | No |
In-game
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
ingame.read | See who is online and in what state, and read the kill feed, on games that report them. | ingame:read | member | No |
ingame.message | Put an on-screen message in front of every player, on games that support it. | ingame:message | operator | No |
Metrics
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
metrics.read | Server history: players online, uptime, crashes and restarts, busiest hours, top places (no player names). | metrics:read | operator | No |
metrics.players.read | Staff only: shows every player's statistics by name. | player_metrics:read | operator | No |
metrics.season | Close the current stats season and start the next. Nothing is deleted. | metrics:admin | admin | No |
metrics.players.alts | Show the possible alternative accounts of a player, by name and reason (a hint, never proof). Always private; never an address. | player_metrics:alts | moderator | No |
metrics.players.watch | Add players to, or take them off, the On Watch list (you are told when they connect). | player_metrics:write | moderator | No |
leaderboards.manage | Choose which leaderboards are posted, where and when, and post them now. Only boards the server owner allows are posted. | leaderboards:write | moderator | No |
Backups
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
backups.read | List backups and read the backup schedule and quota. | backups:read | member | No |
backups.create | Take a backup now. | backups:create | moderator | No |
backups.restore | Restore a backup OVER THE LIVE WORLD. Everything since that backup is lost. | backups:restore | moderator | Yes |
backups.delete | Permanently delete a backup. | backups:write | moderator | Yes |
Mods
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
mods.read | List installed mods and search the mod marketplace. | mods:read | member | No |
mods.write | Install, uninstall, enable and disable mods. | mods:write | moderator | Yes |
Windrose Plus
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
windrose.read | Read Windrose Plus status and configuration. | windrose:admin | member | No |
windrose.write | Change Windrose Plus settings and enable or disable the mod layer. | windrose:admin | moderator | Yes |
Events & presets
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
events.read | List config presets, scheduled events, event status and event logs. | config_events:read | member | No |
events.write | Create, update, delete and cancel presets and scheduled events. | config_events:write | moderator | Yes |
events.control | Apply an event immediately, or revert an active one. Changes live server config. | config_events:control | moderator | Yes |
Scheduled commands
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
schedules.read | List command schedules, the command catalog and execution history. | command_schedules:read | member | No |
schedules.write | Create, edit, delete, enable and disable scheduled commands. | command_schedules:write | operator | Yes |
schedules.control | Run a scheduled command immediately. | command_schedules:control | operator | Yes |
Economy
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
economy.wallet | See your own coin balance and your own transaction history. | economy:read | member | No |
economy.shop.browse | Browse shop items and prices. | economy:read | member | No |
economy.buy | Buy a shop item with your own in-game currency. | economy:write | member | No |
economy.kits.browse | Browse the kits on a server, their prices and what is inside them. | economy:read | member | No |
economy.kits.claim | Claim a kit with your own in-game currency. | economy:write | member | No |
economy.daily | Claim your daily currency bonus. | economy:write | member | No |
economy.link | Link or unlink your own Discord account to your in-game character. | economy:write | member | No |
Economy admin
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
economy.admin.award | Give a player currency out of nothing. | economy:admin | moderator | Yes |
economy.admin.refund | Reverse a purchase and return the currency. | economy:admin | moderator | Yes |
economy.admin.shop | Add, edit and remove shop items and their prices. | economy:admin | moderator | Yes |
economy.admin.earn | Configure how players earn currency, and the economy's own settings. | economy:admin | moderator | Yes |
economy.admin.stats | Read guild-wide wallet totals, spend and revenue. | economy:admin | moderator | No |
economy.admin.links | See who is linked to which character, and remove someone else's link. | economy:admin | moderator | Yes |
Chat bridge
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
chat.link | Link or unlink a Discord channel to in-game chat. | console:read | moderator | Yes |
Account & billing
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
account.read | Read the GameGrid account and organization behind this Discord. | account:read | admin | No |
billing.read | Read the billing overview. Read-only; never charges anything. | billing:read | admin | No |
tickets.read | List and read the account's GameGrid support tickets. | tickets:read | admin | No |
Bot administration
| Ability | What it allows | API scope it needs | In preset from | Destructive |
|---|---|---|---|---|
bot.permissions.manage | Grant and revoke capabilities on Discord roles with /permissions. | none - a bot-side decision | admin | Yes |
Destructive abilities are opt-in
Destructive abilities stop a server, overwrite data, change configuration, or move currency. None is granted by default, and none can be given to @everyone - the bot refuses outright.
These 20 are destructive:
| Ability | Why it counts as destructive |
|---|---|
server.stop | Shut a running server down. Disconnects every player on it. |
server.restart | Restart a server. Disconnects every player on it. |
server.autorestart.write | Change how often the server restarts itself. |
settings.write | Change a server setting. Usually needs a restart to take effect. |
console.exec | Send a command to the game server and read its reply. |
backups.restore | Restore a backup OVER THE LIVE WORLD. Everything since that backup is lost. |
backups.delete | Permanently delete a backup. |
mods.write | Install, uninstall, enable and disable mods. |
windrose.write | Change Windrose Plus settings and enable or disable the mod layer. |
events.write | Create, update, delete and cancel presets and scheduled events. |
events.control | Apply an event immediately, or revert an active one. Changes live server config. |
schedules.write | Create, edit, delete, enable and disable scheduled commands. |
schedules.control | Run a scheduled command immediately. |
economy.admin.award | Give a player currency out of nothing. |
economy.admin.refund | Reverse a purchase and return the currency. |
economy.admin.shop | Add, edit and remove shop items and their prices. |
economy.admin.earn | Configure how players earn currency, and the economy's own settings. |
economy.admin.links | See who is linked to which character, and remove someone else's link. |
chat.link | Link or unlink a Discord channel to in-game chat. |
bot.permissions.manage | Grant and revoke capabilities on Discord roles with /permissions. |
Grant these deliberately, to a named role, and check with
/permissions role role:@YourRoleafterwards./permissions listshows how many destructive abilities each role holds.
Presets, and adjusting from there
A preset is a ready-made set you can then adjust one ability at a time. It is a starting point, not a ceiling.
| Preset | Abilities | What it is for |
|---|---|---|
nothing | 0 | No bot access at all. The default for every role. |
member | 21 | Look, but do not touch: view servers and settings, read logs, browse and buy in the shop. No destructive action. |
operator | 28 | Member, plus the console, scheduled commands, messaging every player in game, and server and player statistics (/metrics). |
moderator | 50 | Operator, plus start/stop/restart, the auto-restart schedule, settings, backups, mods, Windrose Plus, events, the chat bridge, economy administration, setting up leaderboards (/leaderboard setup and post), and possible alternative accounts and On Watch (/metrics alts and watch). |
admin | 55 | Everything, including the account holder's own billing and support tickets, and managing bot permissions. |
/permissions preset role:@Verified preset:member
/permissions preset role:@Admin preset:moderator
/permissions grant role:@Helpers capability:server.restartA preset is stored as the literal list of abilities it contains at the moment you apply it. It does not silently widen when the bot gains a new ability later - you would grant that one yourself, or re-apply the preset. There is no wildcard ability and no *, for the same reason there is none in the API scope list: a wildcard grows every time the product does, and nobody re-reads what they agreed to.
What @everyone can hold
@everyone is a real Discord role, and every member holds it - including anyone who joins from a public invite, now or in future. The bot treats it specially:
| You try to | The bot does |
|---|---|
/permissions grant a destructive ability to @everyone | Refuses, and says why |
/permissions grant an account or billing ability to @everyone | Refuses, and says why |
/permissions grant an ability that starts above the member preset to @everyone, such as the /metrics abilities | Refuses, and says why. You can still give them to a role you name |
/permissions preset role:@everyone preset:moderator | Applies only the part that is safe for @everyone, and names every ability it left out |
| Grant a read-only ability, or the player-side shop abilities | Allowed, with a reminder that this applies to every current and future member |
A reasonable choice for a public community is /permissions preset role:@everyone preset:member, which lets anyone check whether the server is up and use the shop, and nothing else. Leaving @everyone with nothing is also fine - that is the default.
Who can configure the bot
Configuration is not an ability you can grant yourself into. Linking the API key and pointing the bot at channels stays with two people; handing out abilities can now be delegated, and nothing else can.
| Action | Who can do it |
|---|---|
/setup, first time | The Discord server owner, or anyone with Discord's Manage Server permission |
/setup, to re-link a different key | The Discord server owner, or the person who ran `/setup` originally, while they still hold Manage Server - nobody else |
/config view and /config role | The same two people, or anyone holding bot.permissions.manage |
Every other /config subcommand, including reset | The same two people: the original setup user, or the Discord server owner |
/economy-setup and /economy-config | The same two people, or anyone holding economy.admin.earn |
/permissions grant, revoke, preset, clear | The same two people, or anyone holding bot.permissions.manage |
/permissions me and /permissions catalogue | Anyone. Finding out what you may do, and what there is to ask for, does not itself need permission |
bot.permissions.manage is the one piece of this you can delegate: it lets a head admin hand out abilities without ever seeing your API key. It does not lift the ceiling. Someone holding it cannot grant themselves - or anyone else - an ability your API key cannot back, because the key is checked before any Discord role is consulted. It is also limited to what the holder has: someone who passes only through bot.permissions.manage can give a role, take from a role, apply as a preset or clear only abilities they hold themselves, and never bot.permissions.manage itself. The server owner and the person who ran /setup (with Manage Server) are not limited this way.
This split is deliberate. /setup writes the credential every other command spends, so it cannot be something an ability reaches.
It also means the person who first ran /setup matters. They administer the bot only while they still hold Manage Server: if they lose it, or leave your Discord server and come back, they are an ordinary member, and the server owner can still re-run /setup and take over.
What re-running /setup does
Re-running /setup with a new key is how you rotate the bot's credentials. Verification happens before anything is stored, so a key that fails to verify leaves the working one in place - a fumbled rotation cannot take your bot offline.
A re-link with a key from the same GameGrid account keeps your configuration. A key from a different account clears it. Every role grant, every channel-to-server binding and every live console or log mirror is deleted when the new key belongs to a different account. Your log, alert and command channels and your default server survive either way.
The bot compares the account the new key belongs to with the account of the key it replaces. Rotating a key, or making a new key with more scopes, on the account that is already linked keeps everything, and the reply says so. A key from a different account clears everything, because a different account has a different set of servers and the old grants are not assumed to still be appropriate. If the bot cannot tell which account a key belongs to, it clears too: for example on a Discord server whose link was made before the bot recorded the account, when the old key has since been revoked or has expired. The entry in your log channel says "kept (same GameGrid account)" or "cleared".
If you are not sure which case applies, plan for the clearing one:
1. Run /permissions list and screenshot it, so you have every role's abilities, and /config view for your channel bindings.
2. Run /config live-list and note any live mirrors.
3. Run /setup with the new key.
4. If the reply says they were cleared, re-apply the role grants with /permissions preset and /permissions grant, re-bind channels with /config channel-server, and restart mirrors with /config live-console or /config live-logs.
5. Revoke the old key in the panel.
How your API key is protected
The key you give /setup is verified against the API before it is stored, then encrypted at rest. It is never written to a log file, never shown in a command reply, and never displayed by /config view. Only the /setup reply names it, and then only by its 8-character key id, the part that is safe to display anywhere.
The bot cannot do anything your key cannot do. If you want the bot to be able to read the console but never restart a server, create its key without servers:lifecycle - then no Discord role, no matter how it is configured, can restart anything through the bot.
Give the bot its own key, not one you also use for scripts. When you rotate or revoke it, only the bot is affected, and the audit trail tells you which integration made a call.
A related habit: check GET /account/audit if you ever want to see what the bot has actually been calling. Per-server restriction of a key is enforced by the platform but is not offered on the create form, so ask support if you want the bot's key limited to one community's servers.
Console output is redacted
Console and log output that the bot shows - through /console, /command and the live channel mirrors - is filtered before it is posted. Credentials and network addresses are replaced with [REDACTED], including a setting whose name merely contains a word like password, token, secret or api key (for example a telnet password or an admin password line), and a password typed after the word with a space. The same filter is applied to what the log channel records about a command, so a password typed into /command is not kept. The bot also never pings anyone from a mirrored line.
| Redacted | Examples |
|---|---|
| Password-like values | password=, rcon_password:, admin password=, server-password: |
| Secret-like values | token=, api_key:, auth=, secret= |
| Recognised keys and tokens, even with no label | A GameGrid API key, a Discord bot token or the token in a Discord webhook link, a Stripe, GitHub, Google, AWS, OpenAI, Slack or Tailscale key: shown as [api-key]; a private key: [private-key]. This covers the live log mirror |
| IP addresses | Both IPv4 and IPv6 |
The setting name is kept and only the value is replaced, so a line still reads rcon_password=[REDACTED] and you can see that the setting exists.
If you see
[REDACTED]or[ip-hidden]where a player's IP address would be in a join message, that is working as intended, not a bug. Player IP addresses are never shown to server owners: GameGrid masks them as[ip-hidden]in the panel console, command replies, the Customer API and downloaded logs as well, so there is no unmasked copy to look up.
One deliberate gap: /preset view redacts credential-looking values but not IP addresses, because a game version number like 1.20.4.1 matches the shape of an IPv4 address and would otherwise be hidden.
Channel and visibility controls
Discord permissions still apply on top of everything above. The bot can only read and post in channels its own Discord role allows, so the ordinary way to limit who sees what is to put the bot in a private channel.
Beyond that:
- `/config command-channel` restricts
/command- and only/command- to a single channel. Other commands are unaffected, including/console. - Reply visibility is fixed per command, not configurable. Anything that could leak a credential or a private balance replies privately:
/console,/command,/balance,/buy,/daily,/link,/my-transactions,/account,/billing,/tickets,/backups restore,/settings set, every/settings tablechange and/settings table show-password,/economy-links, every `/command-schedule` subcommand, every/presetand/eventsubcommand and every/configsubcommand. Status and lifecycle commands reply publicly so the channel can see who restarted the server. - Live mirrors post to whichever channel you point them at. Anyone who can read that channel sees the console, subject to the redaction above. Point them at a private channel.
- The log channel records who ran what. Set it with
/config log-channeland give your admins read access to it. Every/configchange and every command that changes something in GameGrid is recorded there.
Removing the bot
Two options, and they do different things.
`/config reset` clears the bot's configuration for your Discord server - the stored key, role grants, channel bindings and live mirrors - while leaving the bot in the server. Use it to start clean. It asks for confirmation first, and only the setup user or the server owner can confirm.
Removing the bot from your Discord server deletes its configuration for that server automatically.
Neither touches your API key. Revoke the key in the panel as well if you are removing the bot for good - see API Key Management.