Content generated with AI — it may contain mistakes.

The agent

Collected data

Every event the agent sends, which side sends it, when, and the fields it carries — plus how events are queued, spooled and delivered.

The agent reports raw facts and leaves the interpretation to the ingest: hostnames are normalised, countries looked up and sessions stitched to presence on the other side, so a fix never waits for every server to update. This page lists everything it sends. What it never sends is on Privacy.

Sent by uses P for a proxy, B for a backend and S for a standalone server. Every event also carries the time it happened and, when it is about a player, the player's UUID.

Server lifecycle

These are sent whatever the modules say, as long as the server is linked and not paused.

EventSent byWhenData
server.startP B SWhen the agent starts collecting: on start once linked, right after linking, and after being resumed.Platform and its version, Minecraft version (none on a proxy), Java version, agent version, role, online mode, port, max players.
server.stopP B SOn a clean shutdown, after every open session and stay is closed.—
server.heartbeatP B SEvery heartbeat interval (60 s by default).Players online.
proxy.serversPOn start and whenever the proxy's server list changes (checked every heartbeat).Each registered server's name and host:port address.

Network sessions

Sent by the proxy, or by a standalone server. A backend does not open sessions. Module: Sessions.

EventWhenData
session.startA player connects (on Velocity after login, on Paper when they join).A session id, username, IP address, hostname exactly as the client typed it, protocol version, whether they are a Bedrock player, and their LuckPerms primary group.
session.clientWhen the client's brand or language first becomes known or changes.Client brand (Velocity; Paper 1.19.4 and newer) and/or language, such as es_es.
session.switchA player moves to another backend. Proxy only.The server they left (none on the first connection) and the one they joined, by the proxy's names.
session.endA player disconnects, or the server shuts down.How it ended: quit, kick or shutdown.
  • Protocol version. On Velocity, the client's own. On a standalone Paper server, ViaVersion's answer when it is installed (Paper would report its own version for every client), otherwise Paper's.
  • Bedrock. Asked of Floodgate when it is installed; otherwise a UUID of the form 00000000-0000-0000-… counts as Bedrock.
  • Kick. A kick by a plugin or staff, and on Velocity a login from the same account elsewhere.
  • Players already online when the agent starts collecting — after a link or a resume — get their session opened then.

Presence on a server

Sent by backends and standalone servers. Modules: Sessions for joins and leaves, AFK for AFK.

EventWhenData
server.joinA player joins this server.—
server.leaveA player leaves it, or it shuts down.How it ended (quit, kick, shutdown) and the stay's activity: chat messages, commands, deaths, and player kills.
afk.startA player has done nothing for the AFK time (300 s by default).—
afk.endThey move, look around, chat, run a command or interact again — or leave while AFK.—

The activity counters are counts only. A chat message cancelled by another plugin is not counted; a kill counts only when the killer is another player.

Performance

EventSent byWhenData
server.metricsP B SEvery metrics interval (60 s by default). Module: Performance.TPS (average and lowest), MSPT (average, p95 and highest), CPU of the process and of the machine, heap used and maximum, players, entities, loaded chunks.

A proxy sends only CPU, heap and players. What each server platform can measure is on Servers and performance.

Integrations

Each one is used only when its plugin is installed. See Integrations.

EventSent byModuleData
punishment.issueP B SPunishmentsThe punished player, the plugin, its entry id, the kind (ban, mute, kick, warn), the staff member's UUID (none for the console), the reason, the duration (none when permanent) and whether it is an IP ban.
punishment.revokeP B SPunishmentsThe player, plugin, entry id, kind and who lifted it.
vote.castWhoever runs NuVotifierVotesThe voting site as Votifier names it, the username that voted, and the player's UUID when they are online on that server.
rank.addP B SRanksThe group, and when it expires (none when permanent). Also sent when a temporary group's expiry changes.
rank.removeP B SRanksThe group.
player.placeholdersB SPlaceholdersThe values of the placeholders listed in config.yml, just before the player's server.leave.

Economy

Paper and Spigot only. Module: Economy. How the sources are found and why each change is counted once is on Economy.

EventSent byWhenData
economy.flowB SOnce a minute, one per player, currency and reason that moved.Currency, reason, number of changes, total gained, total spent, the balance after the last change (when the source knows it), and the window's length.
economy.balanceB SOn join and quit, and every 10 minutes for ExyliaLib currencies.One player's balance in one currency.
economy.supplyB SWhenever a plugin reports it through the API.Currency, storage scope, the sum of every balance, and how many accounts hold money.

Custom events

EventSent byModuleData
customWherever a plugin calls the APICustom eventsThe event's name and up to 16 properties. See the API.

How events travel

Queued in memory

Recording an event only puts it in a queue; the game thread never waits on disk or network. An event whose module is off, or any event while the server is unlinked or paused, is dropped here. Past 100,000 waiting events new ones are dropped, with one warning, until the queue drains.

Written to the spool

Every send interval (10 s by default), or as soon as 500 events are waiting, the queue becomes one or more batches of at most 5,000 events and 1 MiB, compressed and written to data/spool/<batchId>.json.gz before the first attempt.

Delivered, oldest first

One background thread sends the spool in order and deletes each batch once the ingest accepts it. A retried batch is byte-for-byte the same and is stored only once.

What happens on each answer:

AnswerWhat the agent does
AcceptedDeletes the batch. If the dashboard's settings changed, fetches them.
MalformedLogs it, deletes the batch: it can never succeed.
Token revokedDeletes its credentials, its queue and its spool, and goes back to unlinked.
Workspace suspendedKeeps everything and tries again every 15 minutes.
Another server holds the tokenKeeps everything, logs it once, tries again every minute.
Batch too largeSplits it in two and sends each half.
Rate limited, server error, unreachableKeeps everything and waits: 5 seconds, doubling up to 5 minutes, ±20%, and never less than the ingest asks.

The spool is capped at 50 MiB. When it is full the oldest batch is dropped with a warning — that only happens after the ingest has been out of reach for a long time.

On shutdown the agent closes every open session and stay, sends server.stop, and tries for up to 3 seconds to deliver what is left. Whatever does not make it stays in the spool and goes out on the next start.

The ingest also corrects clocks: when a batch's send time differs from the ingest's by more than two seconds, every timestamp in it is shifted by the difference. It drops, one by one, events it cannot use: an unknown type, a player event without a player, a time before 2025 or more than an hour ahead, or data that breaks the limits above.

Something missing on this page? Tell us on Discord