Public API · v1

HGMServers API

A free, read-only HTTP API for the HGMServers Call of Duty network — live server state, player statistics, credits and the 24/7 demo stream. No key, no account, no rate limit worth worrying about.

Everything is a GET and everything is JSON. There is nothing to authenticate with, because there is nothing here that is not already public on the site. Please cache what you read and poll no faster than you need: the figures behind these routes change on the order of a minute, not a second.
These are the only supported routes. The rest of this application's surface exists, answers, and is not documented — it is internal, it is authenticated, and it changes without notice. Building against anything outside /api/v1 is not supported and will break.

Endpoints

GET/api/v1/servers

Every live game server, with player counts

The whole network in one call: server id (address and port), display name, which Call of Duty title it runs, and how full it is. This is the endpoint behind the site's own server browser.

{
  "servers": [
    {
      "id": "51.222.244.179:5078",
      "name": "[HGM] Zombies | Der Riese [US]",
      "game": "WaW",
      "players": 4,
      "maxPlayers": 4
    }
  ]
}

GET/api/v1/stats

Network totals: players online, slots, accounts tracked

Aggregates across every server. `totaltrackedclients` counts every account ever seen, not current players — it is a lifetime figure and grows monotonically.

{
  "data": {
    "totalconnectedclients": 19,
    "totalclientslots": 1434,
    "totaltrackedclients": 1624267,
    "totalrecentclients_value": 2877,
    "maxconcurrentclients_value": 147,
    "maxconcurrentclients_alltime": 308
  }
}

GET/api/v1/kills

Total kills recorded across the network

A single lifetime counter, summed over every tracked match on every server.

{ "kills": 144054820 }

GET/api/v1/playtime

Total time played across the network

The same figure three ways: raw seconds, whole hours, and a human-readable string. Use `seconds` for arithmetic — `display` is formatted for people and its shape may change.

{
  "seconds": 4910545433,
  "hours": 1364040,
  "display": "155y 260d"
}

GET/api/v1/credits

Credits leaderboard, or one player's rank

Paged, highest first. Pass `name` to get that player's row and rank instead of a page. `credits` is a PRE-FORMATTED STRING with dot separators, not a number — parse it if you need to do arithmetic.

ParameterMeaning
pageoptional1-based page of the leaderboard. Defaults to the first.
nameoptionalA player name. Returns that player rather than a page.
{
  "data": [
    { "rank": 1, "name": "KalaSlave",    "credits": "$3.561.465" },
    { "rank": 2, "name": "Rastaboy-115", "credits": "$3.311.654" }
  ]
}

GET/api/v1/credits/all

One player's credits and rank in every game

Needs `name` or `clientid`; without one it answers `{"error":"Missing name or clientid"}`. `clientid` is the IW4MAdmin client id and is the reliable key — names are not unique and players change them.

ParameterMeaning
nameoptionalThe player's name. Give this or clientid.
clientidoptionalIW4MAdmin client id. Preferred: unique and stable.
{ "error": "Missing name or clientid" }

GET/api/v1/credits-block

Casino totals: spent, earned and won

Lifetime aggregates for the whole network, in credits. These are the figures the front page shows.

{
  "Spent": 19776399,
  "Earned": 41990421,
  "Won": 131651853
}

GET/api/v1/detections

Proxy and VPN detections on record

A lifetime count of connections flagged by the proxy check. Not a ban count and not a cheat count — a detection is a signal, not a verdict.

{ "total": 54280 }

GET/api/v1/discord-presence

Members currently online in the Discord

Read from Discord on the site's behalf and cached, so it is safe to poll without a Discord token of your own.

{ "online": 507 }

GET/api/v1/stream/status

What the 24/7 demo stream is playing

Live state of the automated stream: the demo on screen, what plays next, and whether Twitch and YouTube are broadcasting. `online: false` means the streaming machine could not be reached, and every other field will be absent. PROGRESS IS SECONDS, NOT TIMESTAMPS: add the time elapsed since `readAtEpochMs` to `elapsedS` to interpolate a progress bar. `baseName` is the demo's own filename and can be downloaded from the demos page.

{
  "online": true,
  "nowPlaying": {
    "mapLabel": "Hotel",
    "gametype": "Domination",
    "baseName": "dom_mp_hotel_4_30_2026_6_30",
    "elapsedS": 782,
    "plannedS": 780,
    "readAtEpochMs": 1788249456325
  },
  "rotation": ["t6mp", "t6zm", "t5mp"],
  "gameId": "t5mp",
  "twitch":  { "live": true, "viewers": 2 },
  "youtube": { "live": true, "broadcastId": "MTmrlNKecc8" }
}