Skip to main content
API Scopes and Permissions - visual guide

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:write does not imply files:read. backups:write does not imply backups:create or backups: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:Read is not servers: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:

ResponseMeaningHow to fix it
403 insufficient_scopeThe key was never granted this scope.Create a new key with the scope included.
403 permission_revokedThe 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

ScopeWhat it grants
account:readRead your account, organization, entitlements, roles and legal status.
account:writeReserved. 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:readRead your billing summary and the plan list. Read-only; nothing in the API can charge you.
keys:readList your organization's API keys. Metadata only - a key secret is never returned.
keys:revokeLet a key revoke itself. It cannot revoke any other key.
audit:readRead a rolling 24-hour trail of API calls made with your keys, plus panel actions on your servers.

Servers and lifecycle

ScopeWhat it grants
servers:readList and read servers, status, real-time stats, capabilities and lifecycle history.
servers:writeRename a server; change auto-restart, restart schedule and resource limits.
servers:lifecycleStart, stop, restart and kill a server.
metrics:readRead current metrics, resource limits and diagnostics, and Metrics server history: uptime, players online, busiest hours, seasons and places (no player names).
metrics:adminStart 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:executeVerify, reinstall, wipe, delete savegames and update. Four of those five also require a typed confirmation.

Console, logs and files

ScopeWhat it grants
console:readRead console history and open a console stream. Players' chat lines are left out unless the key may also read chat (player_metrics:chat).
console:writeSend console commands, and clear console history.
logs:readList, tail, download and stream log files. Players' chat lines are left out unless the key may also read chat (player_metrics:chat).
files:readList, read and download files; read FTP and SFTP connection details.
files:writeWrite, 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

ScopeWhat it grants
settings:readRead the settings schema, current values, change history, drift and the world list; validate a proposed change.
settings:writeWrite settings, roll back a change, switch worlds, and show one password of a table setting (such as a user group's).
players:readRead the contents of a player list, and the catalogue of lists a game declares.
players:writeAdd and remove player-list entries - bans, whitelist, ops, and any other list your game defines.
backups:readList backups; read your quota, schedule and restore-job status. A backup is downloaded only in the customer panel, never through the API.
backups:createTake a backup now. Uploading a backup is done in the customer panel; the API has no upload.
backups:writeDelete and re-label backups; set or remove the backup schedule.
backups:restoreRestore a backup over live data. Separate from backups:write because it destroys the current state.
mods:readList installed mods and search the marketplaces.
mods:writeInstall, uninstall, enable, disable and reorder mods.

Webhooks, bundles, tickets and Windrose Plus

ScopeWhat it grants
webhooks:readList 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:writeCreate and delete webhooks.
webhooks:manageUpdate, test and redeliver webhooks. Not covered by webhooks:write - see the note below.
bundles:readRead your server bundles, their slot usage and the servers assigned to them.
bundles:writeRename a bundle.
tickets:readList and read support tickets and their messages.
tickets:writeOpen a support ticket and reply to one.
windrose:adminManage 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

ScopeWhat it grants
economy:readRead wallets, the shop, transactions and Discord-to-player links.
economy:writeBuy shop items, start and confirm a Discord link, unlink, and send chat through the bridge.
economy:adminManage shop items, award currency, refund, manage links, configure auto-earn and manage linked-server groups.

Player data

ScopeWhat it grants
player_metrics:readRead 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:writeChange 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:altsRead 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:chatRead 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:writeSet 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:readFor 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:writeFor 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

ScopeWhat it grants
map:readRead 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

ScopeWhat it grants
ingame:readRead 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:messageSend 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

ScopeWhat it grants
config_events:readList and read config presets, scheduled events, event status and event logs.
config_events:writeCreate, update and delete presets; schedule, update and cancel events.
config_events:controlStart an event immediately, end an active one, or cancel a running one.

Command schedules

ScopeWhat it grants
command_schedules:readList and read command schedules, the command catalog, and execution logs.
command_schedules:writeCreate, update and delete command schedules; toggle enable/disable.
command_schedules:controlRun a scheduled command immediately (the "Run Now" button).

In-game events

ScopeWhat it grants
game_events:readList and read in-game events, their runs, their results, and any prizes that are owed and unpaid.
game_events:writeCreate, update and delete in-game event definitions, including what they pay.
game_events:controlStart 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

ScopeWhat it grants
vault:readList 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:writeSave 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 treat control as 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 as held with 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 /test and POST /redeliver all need webhooks:manage. A key that manages webhooks wants all three of webhooks:read, webhooks:write and webhooks: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/lists are servers:read. Reading a specific list's contents (GET /servers/{id}/players/lists/{listKey}) and the discovery route GET /servers/{id}/player-lists are players: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; the PUT is servers: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 expectedReality
keys:write, keys:create, keys:rotateDeliberately 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:writeLogs are read-only over the API.
jobs:read, jobs:writeThe job endpoints use servers:read and servers:write.
metrics:writeChanging limits is servers:write.
discovery:readDiscovery uses servers:read and players:read.
meta:readThe /meta/* endpoints need no key at all.
A per-player scopeNo 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.

JobScopes
A status page or wall displayservers:read
An uptime monitor that restarts on failureservers:read, servers:lifecycle
A nightly backup scriptservers:read, backups:create, backups:read
A log shipperservers:read, logs:read
A settings-management scriptservers:read, settings:read, settings:write
A moderation tool that manages bansservers:read, players:read, players:write
A webhook receiver you also manage over the APIwebhooks:read, webhooks:write, webhooks:manage
The GameGrid Discord Bot, fully featuredEvery 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, and backups:restore, which overwrites live data. windrose:admin belongs 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.