
API Scopes and Permissions
The full scope vocabulary for the Customer API - all 59 scopes, what each one grants, and how to choose least-privilege scopes for each key.
How scopes work
Every API key carries a list of scopes. A scope is permission to call a particular kind of endpoint, and the key can call nothing it was not granted. You choose the list when you create the key in the panel, and it cannot be widened afterwards - to change what a key can do, create a new one.
Three rules decide everything else:
- There is no hierarchy.
files:writedoes not implyfiles:read.backups:writedoes not implybackups:createorbackups:restore. If a key needs to both read and write something, grant both scopes. - There is no wildcard. There is no
*scope and no "all access" option. Selecting everything in the panel writes all 59 scope names out explicitly, so what a key can do is always visible in its own record. - Scopes are matched exactly, and they are case-sensitive.
Servers:Readis notservers:read.
A scope on its own is not enough. The key also has an owner, and the owner must still hold the underlying account permission. If someone loses a role, every key they created stops being able to do the thing that role allowed, within about a minute - even though the scope is still written on the key. The two failures look different on purpose:
| Response | Meaning | How to fix it |
|---|---|---|
403 insufficient_scope | The key was never granted this scope. | Create a new key with the scope included. |
403 permission_revoked | The key has the scope, but its owner no longer holds the account permission behind it. | Restore the owner's role. |
You never have to guess what a key holds. GET /account/keys/current returns the calling key's own scopes and needs no scope of its own, so even a key with a mistyped scope list can still ask what it can do.
The 59 scopes
This is the complete vocabulary. GET /api/public/v1/meta/scopes returns the same list as JSON and needs no API key, so a client can always check it against a live server.
Account, billing and keys
| Scope | What it grants |
|---|---|
account:read | Read your account, organization, entitlements, roles and legal status. |
account:write | Reserved. Grants nothing today - the endpoint it was made for was withdrawn. It stays in the catalogue so existing keys that hold it are not reported as holding an unknown scope. |
billing:read | Read your billing summary and the plan list. Read-only; nothing in the API can charge you. |
keys:read | List your organization's API keys. Metadata only - a key secret is never returned. |
keys:revoke | Let a key revoke itself. It cannot revoke any other key. |
audit:read | Read a rolling 24-hour trail of API calls made with your keys, plus panel actions on your servers. |
Servers and lifecycle
| Scope | What it grants |
|---|---|
servers:read | List and read servers, status, real-time stats, capabilities and lifecycle history. |
servers:write | Rename a server; change auto-restart, restart schedule and resource limits. |
servers:lifecycle | Start, stop, restart and kill a server. |
metrics:read | Read current metrics, resource limits and diagnostics, and Metrics server history: uptime, players online, busiest hours, seasons and places (no player names). |
metrics:admin | Start a new stats season, and read player identifiers (Steam ID and similar) on player profiles. Only works on a key created by the account owner or an administrator. |
maintenance:execute | Verify, reinstall, wipe, delete savegames and update. Four of those five also require a typed confirmation. |
Console, logs and files
| Scope | What it grants |
|---|---|
console:read | Read console history and open a console stream. Players' chat lines are left out unless the key may also read chat (player_metrics:chat). |
console:write | Send console commands, and clear console history. |
logs:read | List, tail, download and stream log files. Players' chat lines are left out unless the key may also read chat (player_metrics:chat). |
files:read | List, read and download files; read FTP and SFTP connection details. |
files:write | Write, upload, delete, rename, copy, move, create folders, archive and extract; reset the FTP password; turn SFTP on or off. Resetting the FTP password also needs the settings:write scope on the key, and a key owner who can change the server's settings, because the new password opens every file of the server, its passwords included. |
Settings, players, backups and mods
| Scope | What it grants |
|---|---|
settings:read | Read the settings schema, current values, change history, drift and the world list; validate a proposed change. |
settings:write | Write settings, roll back a change, switch worlds, and show one password of a table setting (such as a user group's). |
players:read | Read the contents of a player list, and the catalogue of lists a game declares. |
players:write | Add and remove player-list entries - bans, whitelist, ops, and any other list your game defines. |
backups:read | List backups; read your quota, schedule and restore-job status. A backup is downloaded only in the customer panel, never through the API. |
backups:create | Take a backup now. Uploading a backup is done in the customer panel; the API has no upload. |
backups:write | Delete and re-label backups; set or remove the backup schedule. |
backups:restore | Restore a backup over live data. Separate from backups:write because it destroys the current state. |
mods:read | List installed mods and search the marketplaces. |
mods:write | Install, uninstall, enable, disable and reorder mods. |
Webhooks, bundles, tickets and Windrose Plus
| Scope | What it grants |
|---|---|
webhooks:read | List webhooks and their delivery history. The full URL of a webhook is shown only to a key with webhooks:manage; a key with only this scope sees the address and /[hidden]. |
webhooks:write | Create and delete webhooks. |
webhooks:manage | Update, test and redeliver webhooks. Not covered by webhooks:write - see the note below. |
bundles:read | Read your server bundles, their slot usage and the servers assigned to them. |
bundles:write | Rename a bundle. |
tickets:read | List and read support tickets and their messages. |
tickets:write | Open a support ticket and reply to one. |
windrose:admin | Manage Windrose Plus: enable, disable, change config, turn UE4SS back on after GameGrid paused it (once a day per server), and read the RCON password in clear text. Treat any key holding this scope as a credential in its own right. |
Economy and scheduled events
| Scope | What it grants |
|---|---|
economy:read | Read wallets, the shop, transactions and Discord-to-player links. |
economy:write | Buy shop items, start and confirm a Discord link, unlink, and send chat through the bridge. |
economy:admin | Manage shop items, award currency, refund, manage links, configure auto-earn and manage linked-server groups. |
Player data
| Scope | What it grants |
|---|---|
player_metrics:read | Read per-player statistics: rankings, profiles by name, sessions, travel and places; the On Watch list and the alerts (watched player connected and kill spree; possible-alternative-account alerts also need player_metrics:alts, and chat-keyword alerts player_metrics:chat, on a key created by the account owner or an administrator). Never addresses or fingerprints. Player identifiers need metrics:admin as well; player CSV downloads need a key created by the account owner or an administrator. |
player_metrics:write | Change the Player access settings: what your players may see, such as live positions on share links (only on a key created by the account owner or an administrator). Also put players On Watch or take them off, and set a player's owner note. |
player_metrics:alts | Read a player's possible alternative accounts (names, reason, confidence) and the countries they connected from, and mark a link "Not the same person". Never addresses or fingerprints; every read is recorded in your audit log. Only the account owner or an administrator can put it on a key; never in the bot preset or the read-only preset. |
player_metrics:chat | Read chat text: stored chat and command text (kept 180 days) in the activity timeline and a player's chat, and live in-game chat (GET /servers/{id}/economy/chat, GET /servers/{id}/dayz/chat, so the Discord chat bridge too). Works only on a key created by the account owner or an administrator; never in the bot preset or the read-only preset. Without it the timeline shows that a message was sent, not what it said, the live chat routes answer insufficient_scope, and console and log reads (console:read, logs:read), log files read with files:read, and the stored output of scheduled commands and Event Manager logs leave out players' chat lines. |
leaderboards:write | Set up and post leaderboards: create and configure boards, read what is due and report posts. Boards name players only where the owner made them public; no player data otherwise. In the Discord bot preset. |
players_self:read | For your Discord bot's /my: read a linked player's own statistics, only the sections you shared in Player access, never another player's data. In the Discord bot preset; not in the read-only preset. |
players_self:write | For your Discord bot's /my: hide a linked player from public leaderboards, set their mention opt-in, and create or revoke their personal API token. Needs the manage permission on the server, both when the key is created and every time it is used, so a key made by a read-only user cannot carry it. In the Discord bot preset. |
Live map
| Scope | What it grants |
|---|---|
map:read | Read map tiles, player positions, entities, regions, land claims, fog, history and the leaderboard โ for the layers the game actually has. |
The live map is read-only over the API, so there is no map write scope. One that appeared in this list and granted nothing would be worse than an absent one โ you would tick it, expect to act on the map, and get nothing back. It goes in when the write routes do.
There is no scope for resetting a region, and there will not be one. Resetting destroys everything players built in a 512 x 512 block area. It stays in the panel, where it is gated on a backup that has to finish first, an owner-only permission, and a dialog naming who has a land claim there. None of that survives being reduced to a key in a script.
Read `map/capabilities` before calling anything else. Games differ: 7 Days to Die has regions, land claims and cell actions; Valheim has fog, history and a leaderboard. The flag set is the same everywhere and only the values change, so a flag that is false is a layer the game does not have, not one we have not built.
In-game
| Scope | What it grants |
|---|---|
ingame:read | Read what is happening inside the game, for games that report it: who is online and in what state, the kill feed, player connects and disconnects, and in-game chat. |
ingame:message | Send an on-screen message to every player in the game, for games that support it. |
These are separate from players:read and console:write on purpose. players:read is player counts and lists such as bans and the whitelist; ingame:read is live activity, including chat. ingame:message puts text in front of every player, so a key that only watches a server never needs it. A game without these layers answers 501 capability_unsupported.
Event configuration
| Scope | What it grants |
|---|---|
config_events:read | List and read config presets, scheduled events, event status and event logs. |
config_events:write | Create, update and delete presets; schedule, update and cancel events. |
config_events:control | Start an event immediately, end an active one, or cancel a running one. |
Command schedules
| Scope | What it grants |
|---|---|
command_schedules:read | List and read command schedules, the command catalog, and execution logs. |
command_schedules:write | Create, update and delete command schedules; toggle enable/disable. |
command_schedules:control | Run a scheduled command immediately (the "Run Now" button). |
In-game events
| Scope | What it grants |
|---|---|
game_events:read | List and read in-game events, their runs, their results, and any prizes that are owed and unpaid. |
game_events:write | Create, update and delete in-game event definitions, including what they pay. |
game_events:control | Start an in-game event now, close a running one early, and retry prizes that could not be paid. Starting an event that pays rewards creates currency. |
An in-game event is a named, time-boxed, announced window over a running server that we open and close for you, and which produces a result. It is not the same thing as config_events:*, which is a scheduled settings change - "double loot this weekend" has no area and no scoreboard, so it cannot have a winner and cannot pay anybody. A game without events answers 501 capability_unsupported.
Vault
| Scope | What it grants |
|---|---|
vault:read | List your Vault saves and their details, see which saves fit a server, and follow a load. Downloading a save also needs a key whose owner is the account owner or an administrator. |
vault:write | Save a server or a backup to your Vault, load a save onto a server, and delete saves. Deleting is permanent. |
Both work on your account's Vault, so a key restricted to particular servers cannot use the routes that belong to the whole account (403 api_key_server_restricted). Saving a server also needs its owner to hold the right to change the server's settings, and loading a save the right to control the server (403 insufficient_permission otherwise). Neither scope is in the Discord bot's key preset: the bot has no Vault commands. See Your Vault.
Six splits that surprise people
Most scopes do what their name says. These six do not divide where you would expect, and each one has produced a confusing 403 for somebody - or, in the last case, spent money:
- `game_events:control` can create currency, and `game_events:write` cannot. Writing an event only describes it. Starting one that pays rewards mints coins into player wallets when it pays: they are created at that moment and taken from no other wallet. The most an event can ever pay is shown before it is started (
GET .../game-events/{id}/preflight,max_this_event_can_pay) and the platform refuses to pay past it - but that ceiling is set by whoever wrote the event, so treatcontrolas spending authority and grant it on its own key. A prize won by a player whose in-game account is not yet linked to a wallet comes back asheldwith a claim date - owed, not lost - and is paid on the original claim the moment that player links, so it can never be paid twice. - `webhooks:write` cannot update, test or redeliver a webhook. It covers create and delete only;
PATCH,POST /testandPOST /redeliverall needwebhooks:manage. A key that manages webhooks wants all three ofwebhooks:read,webhooks:writeandwebhooks:manage. - `servers:read` and `players:read` split the player endpoints between them. Reading the current player count (
GET /servers/{id}/players) and the list catalogue under/players/listsareservers:read. Reading a specific list's contents (GET /servers/{id}/players/lists/{listKey}) and the discovery routeGET /servers/{id}/player-listsareplayers:read. Anything that inspects player lists should hold both. - `servers:write` does not cover player-list writes. Adding or removing a ban, whitelist or op entry needs
players:write. - `metrics:read` does not cover changing resource limits. Reading them is
metrics:read; thePUTisservers:write. - `console:read` does not cover clearing history. Clearing is a write - it needs
console:write.
Scopes that do not exist
If you went looking for one of these, here is what to use instead.
| You expected | Reality |
|---|---|
keys:write, keys:create, keys:rotate | Deliberately absent. Creating, rotating and revoking keys happens in the panel, signed in as you. That way a leaked key cannot mint itself a broader or longer-lived successor. The single exception is keys:revoke, which lets a key switch itself off. |
* or "all scopes" | No wildcard exists. Selecting everything writes all 59 names explicitly. |
logs:write | Logs are read-only over the API. |
jobs:read, jobs:write | The job endpoints use servers:read and servers:write. |
metrics:write | Changing limits is servers:write. |
discovery:read | Discovery uses servers:read and players:read. |
meta:read | The /meta/* endpoints need no key at all. |
| A per-player scope | No player-level permission exists anywhere on the platform. |
Choosing scopes for a key
Grant the smallest set that lets the job finish, and give each job its own key. A key that only reads status cannot be turned into one that wipes a server, and when something goes wrong you can revoke one integration without breaking the rest.
| Job | Scopes |
|---|---|
| A status page or wall display | servers:read |
| An uptime monitor that restarts on failure | servers:read, servers:lifecycle |
| A nightly backup script | servers:read, backups:create, backups:read |
| A log shipper | servers:read, logs:read |
| A settings-management script | servers:read, settings:read, settings:write |
| A moderation tool that manages bans | servers:read, players:read, players:write |
| A webhook receiver you also manage over the API | webhooks:read, webhooks:write, webhooks:manage |
| The GameGrid Discord Bot, fully featured | Every scope its commands use - see Discord Bot Setup Guide for the exact list |
Two scopes deserve their own key with nothing else on it:
maintenance:execute, which can wipe and reinstall, andbackups:restore, which overwrites live data.windrose:adminbelongs in the same category, because it can read an RCON password in clear text.
If you are unsure what a running integration actually uses, call GET /account/keys/current with its key and compare the scopes it holds against what it needs. GET /account/audit shows what it has been calling for the last 24 hours, including calls that were rejected.