Concepts
Honesty metrics

Honesty metrics

This is the moat. Most hosts hide performance behind a marketing dashboard with reassuring green bars. TrueTick exposes the real server health — TPS, MSPT, player count — over the same API your tooling uses, measured directly from the running server. When there's no data, you get an honest empty state, not a fabricated number.

What you get

GET /v1/servers/{id}/metrics (scope servers:read) returns:

FieldMeaning
tpsTicks per second. 20 is healthy. Sustained dips below ~18 mean the server is struggling
msptMilliseconds per tick — how long the average tick takes. Under 50 ms keeps you at 20 TPS
playersCurrent online player count
livetrue when these are fresh RCON measurements; false/empty when there's no live data
cpuPercentContainer CPU usage
memUsedMb, memLimitMbMemory in use vs the allocated limit
seriesA recent ring of samples (for sparklines / trend)
const m = await client.servers.metrics("my-smp");
console.log(`TPS ${m.tps} · MSPT ${m.mspt} · ${m.players} players (live: ${m.live})`);
curl -H "x-api-key: $TRUETICK_API_KEY" \
  "https://api.truetick.gg/v1/servers/my-smp/metrics"

How it's measured

A poller queries the running server over RCON (/tps, /mspt, list) on an interval, keeps the latest values plus a short series ring, and gates them behind a staleness check. TPS/MSPT are whatever the server itself reports — Paper/Purpur expose them natively; on Forge/NeoForge we fall back to the loader's tps command.

Honest empty states

The single most important rule: TrueTick never invents metrics.

  • A hibernated / stopped server has no live tick loop, so live is false and there's no TPS to report — you'll see an honest empty/live:false state, not a stale "20 TPS."
  • If the poller's data is stale (server unreachable, just woke, between polls), the API reports it as not-live rather than serving cached-but-false numbers.
  • Vanilla and Fabric don't expose a TPS command the same way; rather than fake it, the API returns an honest empty TPS with a type-specific note. (Memory and player count still report.)

When you read live: false, that's the system being honest — there genuinely is no live tick data right now. Treat it as "no signal," not "zero performance."

Using the metrics

Because the numbers are real, you can build real automation on them:

  • Autoscaling / alerting agents — read TPS to decide whether to restart, warn, or migrate load.
  • Health gates in CI — after deploying a plugin to an ephemeral server, assert TPS stayed at 20 under your test load before promoting.
  • Public status — surface the same honest numbers your players would see.

TrueTick can also push Discord alerts when a server's TPS drops (configurable per server via the alert-webhook endpoint), so you don't have to poll for incidents.

// A trivial health gate
const m = await client.servers.metrics("ci-test");
if (m.live && m.tps < 19) {
  throw new Error(`Performance regression: TPS ${m.tps} (mspt ${m.mspt})`);
}