Atlas Developers
Dashboard

HTTP API · 1.0

The control-plane API

Everything the Atlas dashboard does, it does through this API. Create groups, publish templates, start and stop servers, read player analytics, manage who on your team can do what — over ordinary JSON on HTTPS.

JSON everywhereRequests and responses, one error shape
Permission per callEvery endpoint names the one it needs
Live streamsConsole and activity over SSE
Shell
# Every server in a network, with live player counts.
curl "https://dashboard.atlasgg.com/v1/networks/$NETWORK/servers" \
  -H "authorization: Bearer $ATLAS_TOKEN"

Get started

Base URL and conventions

Base URL
https://dashboard.atlasgg.com/v1
Content type
application/json
Version
In the path (/v1), never a header
Timestamps
Unix milliseconds, or RFC 3339 where named *_at

The API is served from the dashboard's own hostname, which is why the base URL reads the way it does. Everything documented here lives under /v1.

Every endpoint on this page is scoped to one network and takes its id as the first path segment after /networks/. Network ids are UUIDs; list the ones your token reaches with GET /v1/networks.

This documents the network API, and nothing else.

The plane also serves the routes the dashboard needs to run itself — signing in, registration, billing. Those are internal to the application, are not supported for outside use, and are deliberately absent here.

The network id always comes from the path, never from a body.

No endpoint accepts a network id as a payload field. Authorization is resolved from the path against your credential before a handler runs, so there is no request shape in which the two could disagree.

Get started

Authentication

Send an account API key as a bearer token on every request. Tokens look like atlas_<id>_<secret> and carry the whole account — every network it owns.

A key is the credential this API is designed around. It has no expiry to refresh, no cookie jar to keep, and can be revoked on its own without disturbing anyone's dashboard session.

API keys are not self-serve yet.

Bearer authentication is fully implemented and enforced, but nothing currently issues a key — no endpoint, no CLI command, no dashboard screen. Ask us for one until that changes.

The dashboard authenticates differently, with a session cookie its sign-in flow sets. Those sign-in routes exist but are internal to the application: they are not part of this API and are not documented here.

Shell
BASE="https://dashboard.atlasgg.com/v1"

# One header, no state, on every request.
curl "$BASE/networks" \
  -H "authorization: Bearer $ATLAS_TOKEN"

# Then work inside a network by its id.
curl "$BASE/networks/$NETWORK/overview" \
  -H "authorization: Bearer $ATLAS_TOKEN"

Keep the token out of your shell history and out of source control. It reaches every network the account owns.

Get started

Errors

Every failure is JSON with exactly one field. There is no error code enum and no nested detail object — the string is written to be shown to a person.

JSON403
{ "error": "your role does not allow this (templates.edit)" }
StatusMeansWhat to doNotes
400Invalid requestFix the body or queryThe message names the field or rule
401Not authenticatedSign in or send a tokenCarries no detail, on purpose
403Missing permissionGrant the named permissionNames the exact permission
404Out of reach or absentCheck the idAlso returned for networks you cannot see
409Conflicts with current stateRe-read, then retrye.g. deleting a role people hold
413Too largeSplit or shrinkUploads and the text editor
500Server errorRetry, then reportBody is always internal error
404 and 403 mean different things, deliberately.

A network you cannot reach answers 404 — confirming it exists would leak that it exists. A network you are inside, for an action your role does not allow, answers 403 and names the permission, because you can act on that.

401 is deliberately uninformative. An unknown key, a revoked key, an expired key and a suspended account are one response. Distinguishing them tells an attacker which of their guesses was closest.

Get started

Permissions

Access is a role, and a role is a set of permissions plus an optional confinement to particular groups and templates. Every network-scoped endpoint on this page names the single permission it requires.

Acting implies seeing: templates.edit grants templates.view, and console.send grants console.view. You never need to list both.

PermissionAllows
Templates
templates.viewRead templates, their files and versions
templates.editChange files, publish versions, change assignment
templates.createCreate a template
templates.deleteDelete a template and the servers running it
Groups
groups.viewRead groups and their scaling settings
groups.editChange scaling, placement and template assignment
groups.createCreate a group
groups.deleteDelete a group
Servers
servers.viewRead servers, the overview, and archived logs
servers.controlStart, stop, restart and delete servers
Console
console.viewRead the live console stream
console.sendSend commands to a server
Players
players.viewRead analytics, player records, and player activity
players.forgetErase a player's identity
Nodes
nodes.viewRead nodes and their capacity
nodes.manageEnrol, rename, retire, target groups, force agent updates
Backups
backups.viewList backups and policies
backups.createTake a backup, set a schedule
backups.restoreOverwrite a live world with an archive
backups.deleteDelete a backup
Settings & people
settings.viewRead module and analytics settings
settings.editChange module and analytics settings
members.manageInvite, remove, and define roles
npcs.manageSwitch the NPC module on, target groups, and read the NPCs
Confinement is explicit, never inferred.

A role either reaches every group and template, or names the ones it reaches. "All" is a stored flag rather than an empty list, so removing the last named group narrows a role to nothing instead of silently widening it to the whole network.

backups.restore is separate from backups.create because the two differ in what they destroy: one costs storage, the other costs the world. members.manage is withheld from both built-in roles for the same reason — an owner should grant the permission that hands out permissions deliberately, not inherit it from a default.

Infrastructure

Networks

get/v1/networksany credential

Every network the credential can reach. For a session that includes networks another account invited you into; for an API key it is only the account's own.

get/v1/networks/{network_id}/overviewservers.view

The dashboard home in one call: server and node counts, players online, group health, and licence state.

Infrastructure

Servers

Servers are created by the controller from a group's scaling rules, not by a POST. You influence how many exist by editing the group; you act on individual ones here.

get/v1/networks/{network_id}/serversservers.view

Every server, with its group, node, state, player count and uptime. A role confined to particular groups sees only those.

post/v1/networks/{network_id}/servers/{server_id}/stopservers.control

Stops a server. Drains by default, so players are moved before it goes down.

Body
FieldTypeDescription
drainbooleanMove players off first. Defaults to true; false stops immediately.
post/v1/networks/{network_id}/servers/{server_id}/startservers.control

Starts a stopped persistent server. Servers in dynamic groups are destroyed when they stop and cannot be started again — the controller creates a replacement instead.

post/v1/networks/{network_id}/servers/{server_id}/restartservers.control

Stops and starts in one request.

delete/v1/networks/{network_id}/servers/{server_id}servers.control

Tears the server down. Whether its data directory is destroyed follows the owning group's persistencestatic keeps the world, dynamic discards it — and is never taken from the request.

Infrastructure

Groups

A group is a fleet of interchangeable servers plus the rules for how many should exist. Editing a group is how you scale.

get/v1/networks/{network_id}/groupsgroups.view

Every group with its scaling settings and current server count.

post/v1/networks/{network_id}/groupsgroups.create
Body
FieldTypeDescription
namestringRequired. Lowercase identifier, unique in the network.
display_namestringShown in the dashboard. Defaults to the name.
kindstringgame or proxy.
persistencestringdynamic wipes the working directory on stop; static keeps it.
slots_per_serverintegerRequired. Player capacity per server.
max_memory_mbintegerRequired. Memory ceiling per server.
min_serversintegerAlways keep at least this many running.
max_serversintegerCeiling. Defaults to unlimited.
base_portintegerFirst port to allocate from.
placement_strategystringHow the controller picks a node.
templatesstring[]Template names to assign at creation.
patch/v1/networks/{network_id}/groups/{group}groups.edit

Partial update — every field is optional and only what you send changes.

Body (all optional)
FieldTypeDescription
enabledbooleanA disabled group scales to zero and stays there.
min_serversintegerFloor.
max_serversintegerCeiling.
min_non_fullintegerKeep this many servers with room on them.
scale_up_fill_percentintegerFullness that triggers another server.
max_idleintegerEmpty servers to keep before scaling down.
idle_timeout_secondsintegerHow long empty counts as idle.
cooldown_secondsintegerMinimum gap between scaling actions.
startup_timeout_secondsintegerGive up on a server that never reports ready.
max_lifetime_secondsintegerRecycle servers older than this.
slots_per_serverintegerCapacity per server.
max_memory_mbintegerMemory ceiling per server.
max_cpu_permilleintegerCPU ceiling, in thousandths of a core.
max_per_nodeintegerCap servers of this group on one node.
allowed_node_idsuuid[]Restrict placement to these nodes.
kindstringgame or proxy.
persistencestringdynamic or static.
placementstringPlacement mode.
placement_strategystringNode-selection strategy.
base_portintegerFirst port to allocate from.
delete/v1/networks/{network_id}/groups/{group}groups.delete

Deletes the group and tears down its servers.

put/v1/networks/{network_id}/groups/{group}/templatesgroups.edit

Replaces the group's template assignment wholesale.

Body
FieldTypeDescription
templatesstring[]Template names, in the order they apply.

Infrastructure

Nodes

Nodes are the machines that run servers. They join by presenting an enrolment token to the agent installer; there is no endpoint that creates one directly.

get/v1/networks/{network_id}/nodesnodes.view

Every node with its capacity, agent version, address and last heartbeat.

post/v1/networks/{network_id}/nodes/enrollmentnodes.manage

Mints a single-use enrolment token and returns the install command for a new machine.

patch/v1/networks/{network_id}/nodes/{node_id}nodes.manage
Body
FieldTypeDescription
namestringNew display name.
put/v1/networks/{network_id}/nodes/{node_id}/groupsnodes.manage

Controls which groups may be placed on this node. Its own path rather than more fields on the PATCH above, because renaming is cosmetic and this moves workloads.

Body
FieldTypeDescription
restrict_groupsbooleanfalse accepts any group.
allowed_groupsstring[]Group names, when restricted.
post/v1/networks/{network_id}/nodes/{node_id}/agent-updatenodes.manage

Asks the node's agent to update itself now rather than on its next scheduled check.

delete/v1/networks/{network_id}/nodes/{node_id}nodes.manage

Retires the node: drains its servers, then removes it from placement.

Content

Templates

A template is the file set a server starts from. Files are content-addressed: you upload bytes, get a sha256, then publish a version that binds hashes to paths. Publishing affects servers created afterwards; running servers keep the files they started with.

get/v1/networks/{network_id}/templatestemplates.view

Every template with its files, versions and group assignment.

post/v1/networks/{network_id}/templatestemplates.create
Body
FieldTypeDescription
namestringRequired. Unique in the network.
runtime_presetstringSets the image and server type, e.g. paper-latest.
container_imagestringCustom image, when no preset applies.
auto_assignbooleanAttach to every group except those excluded.
get/v1/networks/{network_id}/templates/{template}templates.view

One template: files with sizes and hashes, version history, and which groups it reaches.

patch/v1/networks/{network_id}/templates/{template}templates.edit
Body (all optional)
FieldTypeDescription
auto_assignbooleanSwitch between assign-list and exclude-list.
assigned_groupsstring[]Groups to attach to, when not auto-assigning.
excluded_groupsstring[]Groups to skip, when auto-assigning.
runtime_presetstringChange the preset.
container_imagestringChange the custom image.
delete/v1/networks/{network_id}/templates/{template}templates.delete

Deletes the template and every server running one of its versions.

Files

post/v1/networks/{network_id}/templates/{template}/files?path=templates.edit

Uploads one file as a raw body — content-type: application/octet-stream, not multipart. Returns the sha256 to reference when publishing. Any file type is accepted here; the size limit and your storage quota apply.

Query
NameTypeDescription
pathstringDestination inside the server directory, e.g. plugins/Essentials.jar.
get/v1/networks/{network_id}/templates/{template}/file?path=templates.view

Reads a text file as a string. Restricted to text extensions — cfg conf csv env ini json lang list md properties sh toml txt xml yaml yml — and to files of 1 MB or less. Anything else answers 400.

put/v1/networks/{network_id}/templates/{template}/file?path=templates.edit

Writes a text file and publishes a new version in the same call. Creates the file when nothing is at that path, so this is also how you add one without uploading. .json content is parsed and rejected if invalid.

Body
FieldTypeDescription
contentstringThe whole file. 1 MB maximum.
delete/v1/networks/{network_id}/templates/{template}/file?path=templates.edit

Removes a file from the template and publishes a new version.

Versions

post/v1/networks/{network_id}/templates/{template}/versionstemplates.edit

Publishes a version. The files list is the complete manifest, not a delta: anything omitted is gone from the new version.

Body
FieldTypeDescription
filesobject[]Required. Each { "sha256": "…", "path": "…" }.
directoriesstring[]Empty directories to create.
environmentobjectEnvironment variables for the container.
java_argsstring[]Command arguments.
container_imagestringOverride the image for this version.
A template describes new servers, and only new servers.

Provisioning writes the manifest's files into the working directory without wiping it, so a static server keeps the data its plugins wrote. Files the manifest names are replaced; files it does not name are left alone — including files a previous version installed and this one dropped.

Content

Backups

Archives of a persistent server's working directory. Backups apply to static groups; a dynamic server has no world worth keeping.

get/v1/networks/{network_id}/backupsbackups.view

Every backup with its size, server, and creation time, plus the per-group policies.

post/v1/networks/{network_id}/servers/{server_id}/backupsbackups.create

Takes a backup now. Returns a job; the archive appears in the list when it finishes.

put/v1/networks/{network_id}/backups/policies/{group_id}backups.create
Body
FieldTypeDescription
enabledbooleanWhether the schedule runs.
interval_minutesintegerHow often to back up.
retain_countintegerHow many to keep before the oldest is dropped.
post/v1/networks/{network_id}/servers/{server_id}/restore/{backup_id}backups.restore

Replaces the server's working directory with the archive. The current data is kept until the restored server starts cleanly, and put back if it does not.

delete/v1/networks/{network_id}/backups/{backup_id}backups.delete

Deletes the archive and frees the storage it counted against.

People

Players & analytics

Namespaced under analytics/ rather than hung off /players/{uuid}, so a player whose uuid happened to read as a word could never shadow a collection route.

get/v1/networks/{network_id}/analytics/overviewplayers.view

Headline figures: unique players, sessions, countries, retention and playtime distribution.

get/v1/networks/{network_id}/analytics/series?range=players.view
Query
NameTypeDescription
rangestringWindow to report over, e.g. 7d.
get/v1/networks/{network_id}/analytics/playersplayers.view
Query
NameTypeDescription
searchstringMatch on username.
limitintegerPage size.
offsetintegerRows to skip.
get/v1/networks/{network_id}/analytics/players/{player_uuid}players.view

One player: sessions, playtime, countries seen, and which servers they visited.

delete/v1/networks/{network_id}/analytics/players/{player_uuid}players.forget

Erases the player's identity while leaving the aggregate counts intact. Its own permission because it is the one player action that cannot be undone.

get/v1/networks/{network_id}/analytics/settingssettings.view

What is collected and how long it is kept.

put/v1/networks/{network_id}/analytics/settingssettings.edit

Changes collection and retention.

Live

Console & events

Two Server-Sent Event streams. Both are ordinary GETs that stay open and emit data: frames of JSON; use EventSource in a browser, or read the body as a stream anywhere else.

get/v1/networks/{network_id}/servers/{server_id}/consoleconsole.view

Live console output. Each frame is { "stdout": true, "line": "…", "at": 1754140000000 }stdout false means stderr, at is Unix milliseconds.

post/v1/networks/{network_id}/servers/{server_id}/consoleconsole.send

Sends one command. The same path as the stream with a different method, because the input half is a small POST and only the output half is a stream.

Body
FieldTypeDescription
commandstringSent as typed, without a leading slash.
get/v1/networks/{network_id}/eventsservers.view

The network activity feed: servers coming up and failing, and players arriving and leaving. Opens with a short backfill, then streams. Every frame carries kind, which says which shape it is.

Player frames additionally require players.view. A role with servers.view alone receives the same stream with the player half absent rather than an error.

JSONevent frames
// kind: "server"
{ "kind": "server", "event_id": "…", "state": "ready",
  "server_name": "lobby-2", "group": "lobby", "node": "dfw001",
  "source": "controller_scale", "reason": "", "at": 1754140000000 }

// kind: "player" — needs players.view
{ "kind": "player", "event_id": "…", "action": "left",
  "username": "Notch", "country": "SE",
  "duration_seconds": 240, "ended_reason": "quit",
  "at": 1754140000000 }

One session produces two player frames sharing an event_id. Key on event_id plus action, or the departure looks like a repeat of the arrival.

People

Members & roles

A member is someone from another account granted access to your network. They keep their own login; membership is a cross-account grant rather than a shared password.

get/v1/networks/{network_id}/membersmembers.manage

Members, pending invitations, and the roles available to assign.

post/v1/networks/{network_id}/invitesmembers.manage

Emails an invitation. If the address has no Atlas account, the link leads to registration and admits them on completion.

Body
FieldTypeDescription
emailstringWho to invite.
role_iduuidRole they get on accepting.
delete/v1/networks/{network_id}/invites/{invite_id}members.manage

Revokes a pending invitation.

patch/v1/networks/{network_id}/members/{member_id}members.manage

Changes someone's role.

Body
FieldTypeDescription
role_iduuidThe role to move them to.
delete/v1/networks/{network_id}/members/{member_id}members.manage

Removes someone from the network.

post/v1/networks/{network_id}/leaveany credential

Leaves a network you were invited to. Separate from removal so that "remove a member" can refuse to act on yourself without also making it impossible to leave.

Roles

post/v1/networks/{network_id}/rolesmembers.manage
Body
FieldTypeDescription
namestringShown wherever the role is assigned.
permissionsstring[]Names from the permission table, e.g. console.view.
all_groupsbooleanReach every group. When false, group_ids is the allowlist.
all_templatesbooleanReach every template. When false, template_ids is the allowlist.
group_idsuuid[]Groups this role reaches.
template_idsuuid[]Templates this role reaches.
patch/v1/networks/{network_id}/roles/{role_id}members.manage

Replaces the role's definition. Same body as creation.

delete/v1/networks/{network_id}/roles/{role_id}members.manage

Deletes a custom role. Answers 409 if anyone still holds it, and refuses on the built-in roles, which can be edited but not removed.

You cannot grant what you do not hold.

A non-owner defining or assigning a role may only include permissions they have themselves, and nobody may change their own role or remove themselves. Otherwise members.manage would quietly be a route to every other permission.

The recipient accepts through the link in their email, which the dashboard handles. There is no endpoint here for that half of the flow — it belongs to signing in, not to managing a network.

Reference

Modules

Optional features, each a GET to read the configuration and a PUT to replace it.

get/v1/networks/{network_id}/modules/proxy-syncsettings.view

Whether Atlas writes the proxy's server list, and which groups it covers.

put/v1/networks/{network_id}/modules/proxy-syncsettings.edit
Body
FieldTypeDescription
target_groupsstring[]Proxy groups to write into. Empty means all.
join_behaviourstringWhere players land on connecting.
join_groupstringThe group they land in, when pinned.
get/v1/networks/{network_id}/modules/game-commandssettings.view

Reads the in-game command module's configuration.

put/v1/networks/{network_id}/modules/game-commandssettings.edit

Replaces it.

get/v1/networks/{network_id}/modules/server-logssettings.view

Whether console output is archived when a server ends, and for how long.

put/v1/networks/{network_id}/modules/server-logssettings.edit

Replaces it.

get/v1/networks/{network_id}/modules/server-logs/archiveservers.view
Query
NameTypeDescription
groupstringOnly logs from this group.
reasonstringWhy the server ended.
searchstringMatch on server name.
sortstringOrdering.
limitintegerPage size.
offsetintegerRows to skip.
get/v1/networks/{network_id}/modules/server-logs/archive/{log_id}servers.view

The full captured output of one ended server.

NPCs

Server-selector NPCs: fake players that stand in a lobby and send people somewhere. An NPC belongs to a group rather than a server — every server in a group is built from the same template and so runs the same world, which is what makes one NPC appear on all of them.

get/v1/networks/{network_id}/modules/npcsnpcs.manage

The module's switch, its targeting, the game-kind groups available to target, and every NPC in the network.

put/v1/networks/{network_id}/modules/npcsnpcs.manage

Switches the module on or off and chooses which groups render NPCs. Reaches running servers immediately; nothing restarts.

Body
FieldTypeDescription
enabledbooleanOff hides every NPC without deleting any, so switching back on restores what you had.
target_modestringall_groups or selected.
target_groupsstring[]Group names, when selected. Names from another network select nothing.

Switched on, set to selected, and given no groups is refused with 400 — that combination is a setting that silently does nothing.

get/v1/networks/{network_id}/npcsnpcs.manage

Every NPC on its own, for callers not drawing the settings page. Each carries its group, world and coordinates, appearance, what each click does, and its routing rules.

The resolved skin texture is deliberately not returned. It is a Mojang blob that only the server plugin needs, and it is the largest thing in the row.

put/v1/networks/{network_id}/npcs/{npc_id}npcs.manage

Edits an NPC's appearance, behaviour, click actions and routing. Placement stays in game. The complete editable body contains display_name, skin_owner_name, item_in_hand, look_at_player, imitate_player, info_lines, left_click_action, right_click_action, and routing.

The routing document has its own guide, with worked examples: NPCs & routing rules.

routing.rules are evaluated in order. A rule's when.from_group_in names ingress proxy groups. lowest, highest and random take one group or a groups list and choose between them by live population; last_of returns the player to their most recently visited group among its groups. Every strategy may carry a fallback, nested at most twice. The document-level default is used when no condition matches and may be null.

The destination must be an active game group in this network. A named skin is resolved once and stored; the resolved Mojang texture is never returned by the API.

del/v1/networks/{network_id}/npcs/{npc_id}npcs.manage

Deletes one NPC and pushes the new set to running servers immediately.

NPCs are placed in game, not here.

Creating one means standing where it should go and running /atlasnpc create, because a coordinate typed by somebody who cannot see the world is a coordinate inside a wall. The command needs the Minecraft permission atlas.npc.manage, which is separate from the Atlas role permission above: one governs the person in game, the other the person on this API.

A change made in game is stored centrally and pushed straight back out, so an NPC placed on lobby-1 is standing on every other server in that group a moment later. Nothing restarts.

Reference

Endpoint index

Every network endpoint, with the permission it requires. Paths are relative to https://dashboard.atlasgg.com/v1.

MethodPathRequires
get/networksany credential
get/networks/{network_id}/overviewservers.view
get/networks/{network_id}/serversservers.view
post/networks/{network_id}/servers/{server_id}/startservers.control
post/networks/{network_id}/servers/{server_id}/stopservers.control
post/networks/{network_id}/servers/{server_id}/restartservers.control
del/networks/{network_id}/servers/{server_id}servers.control
get/networks/{network_id}/groupsgroups.view
post/networks/{network_id}/groupsgroups.create
patch/networks/{network_id}/groups/{group}groups.edit
del/networks/{network_id}/groups/{group}groups.delete
put/networks/{network_id}/groups/{group}/templatesgroups.edit
get/networks/{network_id}/nodesnodes.view
post/networks/{network_id}/nodes/enrollmentnodes.manage
patch/networks/{network_id}/nodes/{node_id}nodes.manage
put/networks/{network_id}/nodes/{node_id}/groupsnodes.manage
post/networks/{network_id}/nodes/{node_id}/agent-updatenodes.manage
del/networks/{network_id}/nodes/{node_id}nodes.manage
get/networks/{network_id}/templatestemplates.view
post/networks/{network_id}/templatestemplates.create
get/networks/{network_id}/templates/{template}templates.view
patch/networks/{network_id}/templates/{template}templates.edit
del/networks/{network_id}/templates/{template}templates.delete
post/networks/{network_id}/templates/{template}/filestemplates.edit
get/networks/{network_id}/templates/{template}/filetemplates.view
put/networks/{network_id}/templates/{template}/filetemplates.edit
del/networks/{network_id}/templates/{template}/filetemplates.edit
post/networks/{network_id}/templates/{template}/versionstemplates.edit
get/networks/{network_id}/backupsbackups.view
post/networks/{network_id}/servers/{server_id}/backupsbackups.create
put/networks/{network_id}/backups/policies/{group_id}backups.create
post/networks/{network_id}/servers/{server_id}/restore/{backup_id}backups.restore
del/networks/{network_id}/backups/{backup_id}backups.delete
get/networks/{network_id}/analytics/overviewplayers.view
get/networks/{network_id}/analytics/seriesplayers.view
get/networks/{network_id}/analytics/playersplayers.view
get/networks/{network_id}/analytics/players/{player_uuid}players.view
del/networks/{network_id}/analytics/players/{player_uuid}players.forget
get/networks/{network_id}/analytics/settingssettings.view
put/networks/{network_id}/analytics/settingssettings.edit
get/networks/{network_id}/servers/{server_id}/consoleconsole.view
post/networks/{network_id}/servers/{server_id}/consoleconsole.send
get/networks/{network_id}/eventsservers.view
get/networks/{network_id}/membersmembers.manage
patch/networks/{network_id}/members/{member_id}members.manage
del/networks/{network_id}/members/{member_id}members.manage
post/networks/{network_id}/leaveany credential
post/networks/{network_id}/invitesmembers.manage
del/networks/{network_id}/invites/{invite_id}members.manage
post/networks/{network_id}/rolesmembers.manage
patch/networks/{network_id}/roles/{role_id}members.manage
del/networks/{network_id}/roles/{role_id}members.manage
get/networks/{network_id}/modules/proxy-syncsettings.view
put/networks/{network_id}/modules/proxy-syncsettings.edit
get/networks/{network_id}/modules/game-commandssettings.view
put/networks/{network_id}/modules/game-commandssettings.edit
get/networks/{network_id}/modules/server-logssettings.view
put/networks/{network_id}/modules/server-logssettings.edit
get/networks/{network_id}/modules/server-logs/archiveservers.view
get/networks/{network_id}/modules/server-logs/archive/{log_id}servers.view
get/networks/{network_id}/modules/npcsnpcs.manage
put/networks/{network_id}/modules/npcsnpcs.manage
get/networks/{network_id}/npcsnpcs.manage
put/networks/{network_id}/npcs/{npc_id}npcs.manage
del/networks/{network_id}/npcs/{npc_id}npcs.manage

The plane also serves the routes the dashboard needs for itself — signing in, registration, email verification, billing, and Stripe's callback — plus a staff-only diagnostic route that answers 404 for every customer credential. Those are internal to the application and are not part of this API.

Back to top ↑