Skip to main content
Server Manager lets staff control live Roblox servers from the dashboard: see who is online, kick, ban, mute, message, broadcast, or shut a server down. It works as a command queue, and your game server speaks to it with a guild API key.

How the queue works

Dashboard (staff clicks Kick)        Your Roblox server (API key)
        |                                     |
        |  enqueues a command                 |  1. heartbeat: report state + players
        v                                     |  2. poll: fetch pending commands
   server_commands  <----------------- poll --+  3. run each command in-game
        |                                     |  4. ack: report the result
        +------------------ ack --------------+
Only these three endpoints accept a guild API key. The dashboard side, listing servers and enqueuing a command (/guilds/:guildId/servers...), requires a logged-in dashboard session with the server_manager permission and is not callable with an API key.
These endpoints use camelCase field names, like the rest of the plugin protocol.

Heartbeat

Report a live server and its current player list. Send this on a short loop, for example every 5 seconds. It both keeps the server marked online and feeds the player list shown in the dashboard.
POST /roblox/servers/heartbeat
guildId
string
required
Must match your API key’s guild.
serverId
string
required
The Roblox game.JobId.
placeId
string
required
universeId
string
gameName
string
playerCount
number
required
maxPlayers
number
required
serverAge
number
Seconds since the server started.
fps
number
players
object[]
required
The current players.
curl "https://api.technified.xyz/api/v1/roblox/servers/heartbeat" \
  -H "X-API-Key: $TECHNIFIED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "guildId": "'$GUILD_ID'",
    "serverId": "abc123-...",
    "placeId": "987654321",
    "gameName": "My Game",
    "playerCount": 2,
    "maxPlayers": 50,
    "serverAge": 3600,
    "players": [
      { "robloxId": "261", "username": "Shedletsky", "joinTime": 1746712900 }
    ]
  }'
{ "status": "success", "code": 200, "data": { "success": true } }
Players missing from a heartbeat are treated as having left and are removed from the server’s live list.

Poll for commands

Fetch the pending commands queued for this server. The response also includes broadcast commands targeted at every server. Polled commands are marked as delivered, so poll on a short loop.
GET /roblox/servers/:serverId/commands
serverId
string
required
The same game.JobId you heartbeat with.
data.commands
object[]
Up to 20 pending commands, oldest first.
{
  "status": "success",
  "code": 200,
  "data": {
    "commands": [
      {
        "id": 17,
        "type": "kick",
        "targetRobloxId": "261",
        "targetUsername": "Shedletsky",
        "parameters": { "reason": "Breaking rules" },
        "issuedByDiscordId": "123456789012345678",
        "issuedByUsername": "Builderman"
      }
    ]
  }
}

Command types

TypeScopeCommon parameters
kickPlayerreason
banPlayerreason, duration
mutePlayerreason, duration
messagePlayermessage
teleportPlayerdestination data
broadcastServermessage
shutdownServernone
Player commands carry a targetRobloxId. Server-level commands like broadcast and shutdown do not. A broadcast is queued for every server at once.

Acknowledge a command

After running a command, report the outcome. This moves the command to acknowledged so it is not retried, and surfaces the result in the dashboard.
POST /roblox/servers/:serverId/commands/:commandId/ack
serverId
string
required
commandId
number
required
The id from the poll response.
success
boolean
required
result
string
A short human-readable result, for example “Kicked Shedletsky”.
error
string
An error message when success is false.
curl "https://api.technified.xyz/api/v1/roblox/servers/abc123-.../commands/17/ack" \
  -H "X-API-Key: $TECHNIFIED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "success": true, "result": "Kicked Shedletsky" }'
If you run the Adonis plugin or Technified Admin, this whole loop is already implemented. You only need these endpoints when building a custom admin system.