{"openapi":"3.1.0","info":{"title":"HGMServers Public API","description":"The public, read-only API for the HGMServers Call of Duty network — live server state, player statistics, kills, playtime and credits.\n\nNo key and no account: every route here answers an anonymous GET. 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.\n\nThese are the only documented routes. The rest of this application's surface is internal, authenticated, and subject to change without notice — building against it is not supported.\n","license":{"name":"Free to use, attribution appreciated","url":"https://hgmserve.rs/about"},"version":"v1"},"servers":[{"url":"https://hgmserve.rs","description":"Generated server url"}],"tags":[{"name":"Analytics","description":"First-party visitor statistics"},{"name":"Public API v1","description":"Stable interface for external consumers"},{"name":"External","description":"Figures read from third parties on the site's behalf"}],"paths":{"/api/v1/log-view":{"post":{"tags":["Analytics"],"summary":"Record a page view or a page being left","operationId":"logView","requestBody":{"content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.analytics.AnalyticsController.Recorded"}}}}}}},"/api/v1/log-error":{"post":{"tags":["Analytics"],"summary":"Report a failure that happened in the browser","operationId":"report","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.analytics.ErrorReportController.Report"}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.analytics.ErrorReportController.Recorded"}}}}}}},"/api/v1/tme-stats":{"get":{"tags":["External"],"summary":"Player counts from the TME network's IW4MAdmin","operationId":"tmeStats","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.external.TmeStats.Stats"}}}}}}},"/api/v1/stream/status":{"get":{"tags":["External"],"summary":"What the 24/7 demo stream is playing","operationId":"status","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.stream.StreamStatus"}}}}}}},"/api/v1/stats":{"get":{"tags":["Public API v1"],"summary":"Connected players, slots and tracked accounts","operationId":"stats","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.api.v1.StatsV1Controller.StatsResponse"}}}}}}},"/api/v1/servers":{"get":{"tags":["Public API v1"],"summary":"Player counts per live server","operationId":"servers","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.api.v1.ServersV1Controller.ServerList"}}}}}}},"/api/v1/playtime":{"get":{"tags":["Public API v1"],"summary":"Total time played across all servers","operationId":"playtime","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.api.v1.PlaytimeV1Controller.PlaytimeResponse"}}}}}}},"/api/v1/kills":{"get":{"tags":["Public API v1"],"summary":"Total kills recorded across all servers","operationId":"kills","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.api.v1.KillsV1Controller.KillCount"}}}}}}},"/api/v1/discord-presence":{"get":{"tags":["External"],"summary":"How many members are online in the Discord","operationId":"discordPresence","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.external.ExternalDataController.Presence"}}}}}}},"/api/v1/detections":{"get":{"tags":["Public API v1"],"summary":"Number of proxy and VPN detections on record","operationId":"detections","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.api.v1.DetectionsV1Controller.DetectionCount"}}}}}}},"/api/v1/crypto-rates":{"get":{"tags":["External"],"summary":"Bitcoin, Ethereum and Solana in GBP","operationId":"cryptoRates","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.external.CryptoRates.Rates"}}}}}}},"/api/v1/credits":{"get":{"tags":["Public API v1"],"summary":"Credits leaderboard, or one player's rank","operationId":"credits","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"string"}},{"name":"name","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"A page of the board, or one player's rank","content":{"*/*":{"schema":{"oneOf":[{"$ref":"#/components/schemas/com.hgm.hgmserveserver.api.v1.CreditsV1Controller.Board"},{"$ref":"#/components/schemas/com.hgm.hgmserveserver.api.v1.CreditsV1Controller.PlayerRank"}]}}}}}}},"/api/v1/credits/all":{"get":{"tags":["Public API v1"],"summary":"Credits and global rank per game for one player","operationId":"creditsAll","parameters":[{"name":"name","in":"query","required":false,"schema":{"type":"string"}},{"name":"clientid","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.api.v1.CreditsAllV1Controller.CreditsByGame"}}}}}}},"/api/v1/credits-block":{"get":{"tags":["Public API v1"],"summary":"Aggregate credit figures for the front page","operationId":"creditsBlock","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/tools.jackson.databind.JsonNode"}}}}}}},"/api/v1/analytics-cookie":{"get":{"tags":["Analytics"],"summary":"The visitor's analytics identifier, if they have consented","operationId":"analyticsCookie","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.analytics.AnalyticsController.CookieResponse"}}}}}}}},"components":{"schemas":{"com.hgm.hgmserveserver.analytics.AnalyticsController.Recorded":{"type":"object","properties":{"success":{"type":"boolean"}}},"com.hgm.hgmserveserver.analytics.ErrorReportController.Report":{"type":"object","properties":{"type":{"type":"string"},"message":{"type":"string"},"stack":{"type":"string"},"path":{"type":"string"}}},"com.hgm.hgmserveserver.analytics.ErrorReportController.Recorded":{"type":"object","properties":{"success":{"type":"boolean"}}},"com.hgm.hgmserveserver.external.TmeStats.Stats":{"type":"object","properties":{"totalConnectedClients":{"type":"integer","format":"int32"},"totalTrackedClients":{"type":"integer","format":"int32"},"totalRecentClientsValue":{"type":"integer","format":"int32"},"maxConcurrentClientsValue":{"type":"integer","format":"int32"}}},"com.hgm.hgmserveserver.stream.StreamStatus":{"type":"object","description":"Live state of the 24/7 demo stream","properties":{"online":{"type":"boolean"},"nowPlaying":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.stream.StreamStatus.NowPlaying"},"nextUp":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.stream.StreamStatus.NextUp"},"rotation":{"type":"array","items":{"type":"string"}},"gameId":{"type":"string"},"nextGameId":{"type":"string"},"switchInS":{"type":"integer","format":"int64"},"uptimeS":{"type":"integer","format":"int64"},"twitch":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.stream.StreamStatus.Twitch"},"youtube":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.stream.StreamStatus.YouTube"}}},"com.hgm.hgmserveserver.stream.StreamStatus.NextUp":{"type":"object","properties":{"mapLabel":{"type":"string"},"baseName":{"type":"string"}}},"com.hgm.hgmserveserver.stream.StreamStatus.NowPlaying":{"type":"object","properties":{"mapLabel":{"type":"string"},"gametype":{"type":"string"},"server":{"type":"string"},"baseName":{"type":"string"},"elapsedS":{"type":"integer","format":"int64"},"remainingS":{"type":"integer","format":"int64"},"plannedS":{"type":"integer","format":"int64"},"readAtEpochMs":{"type":"integer","format":"int64"}}},"com.hgm.hgmserveserver.stream.StreamStatus.Twitch":{"type":"object","properties":{"live":{"type":"boolean"},"viewers":{"type":"integer","format":"int32"},"title":{"type":"string"},"gameName":{"type":"string"},"uptimeS":{"type":"integer","format":"int64"},"channel":{"type":"string"},"url":{"type":"string"}}},"com.hgm.hgmserveserver.stream.StreamStatus.YouTube":{"type":"object","properties":{"live":{"type":"boolean"},"broadcastId":{"type":"string"},"watchUrl":{"type":"string"},"totalViews":{"type":"integer","format":"int64"},"likes":{"type":"integer","format":"int64"},"hoursLive":{"type":"number","format":"double"}}},"com.hgm.hgmserveserver.api.v1.StatsV1Controller.Stats":{"type":"object","properties":{"totalconnectedclients":{"type":"integer","format":"int32"},"totalclientslots":{"type":"integer","format":"int32"},"totaltrackedclients":{"type":"integer","format":"int32"},"totalrecentclients_value":{"type":"integer","format":"int32"},"maxconcurrentclients_value":{"type":"integer","format":"int32"},"maxconcurrentclients_alltime":{"type":"integer","format":"int32"}}},"com.hgm.hgmserveserver.api.v1.StatsV1Controller.StatsResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.api.v1.StatsV1Controller.Stats"}}},"com.hgm.hgmserveserver.api.v1.ServersV1Controller.Server":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"game":{"type":"string"},"players":{"type":"integer","format":"int32"},"maxPlayers":{"type":"integer","format":"int32"}}},"com.hgm.hgmserveserver.api.v1.ServersV1Controller.ServerList":{"type":"object","properties":{"servers":{"type":"array","items":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.api.v1.ServersV1Controller.Server"}},"error":{"type":"string"}}},"com.hgm.hgmserveserver.api.v1.PlaytimeV1Controller.PlaytimeResponse":{"type":"object","properties":{"seconds":{"type":"integer","format":"int64"},"hours":{"type":"integer","format":"int64"},"display":{"type":"string"},"cached":{"type":"boolean"}}},"com.hgm.hgmserveserver.api.v1.KillsV1Controller.KillCount":{"type":"object","properties":{"kills":{"type":"integer","format":"int64"}}},"com.hgm.hgmserveserver.external.ExternalDataController.Presence":{"type":"object","properties":{"online":{"type":"integer","format":"int32"}}},"com.hgm.hgmserveserver.api.v1.DetectionsV1Controller.DetectionCount":{"type":"object","properties":{"total":{"type":"integer","format":"int64"}}},"com.hgm.hgmserveserver.external.CryptoRates.Rates":{"type":"object","properties":{"bitcoin":{"type":"number"},"ethereum":{"type":"number"},"solana":{"type":"number"}}},"com.hgm.hgmserveserver.api.v1.CreditsV1Controller.Board":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.api.v1.CreditsV1Controller.Row"}},"total_pages":{"type":"integer","format":"int32"}}},"com.hgm.hgmserveserver.api.v1.CreditsV1Controller.Row":{"type":"object","properties":{"rank":{"type":"integer","format":"int32"},"name":{"type":"string"},"credits":{"type":"string"}}},"com.hgm.hgmserveserver.api.v1.CreditsV1Controller.PlayerRank":{"type":"object","properties":{"rank":{"type":"integer","format":"int32"},"credits":{"type":"string"}}},"com.hgm.hgmserveserver.api.v1.CreditsAllV1Controller.CreditsByGame":{"type":"object","properties":{"creditsByGame":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/com.hgm.hgmserveserver.api.v1.CreditsAllV1Controller.GameStanding"}}}},"com.hgm.hgmserveserver.api.v1.CreditsAllV1Controller.GameStanding":{"type":"object","properties":{"credits":{"type":"string"},"rank":{"type":"integer","format":"int32"}}},"tools.jackson.databind.JsonNode":{"type":"object","properties":{"nodeType":{"type":"string","enum":["ARRAY","BINARY","BOOLEAN","MISSING","NULL","NUMBER","OBJECT","POJO","STRING"]},"string":{"type":"boolean"},"integralNumber":{"type":"boolean"},"missingNode":{"type":"boolean"},"valueNode":{"type":"boolean"},"container":{"type":"boolean"},"object":{"type":"boolean"},"pojo":{"type":"boolean"},"floatingPointNumber":{"type":"boolean"},"short":{"type":"boolean"},"int":{"type":"boolean"},"long":{"type":"boolean"},"double":{"type":"boolean"},"bigDecimal":{"type":"boolean"},"bigInteger":{"type":"boolean"},"textual":{"type":"boolean","deprecated":true},"boolean":{"type":"boolean"},"binary":{"type":"boolean"},"array":{"type":"boolean"},"empty":{"type":"boolean"},"null":{"type":"boolean"},"float":{"type":"boolean"},"number":{"type":"boolean"},"embeddedValue":{"type":"boolean"}}},"com.hgm.hgmserveserver.analytics.AnalyticsController.CookieResponse":{"type":"object","properties":{"cookieId":{"type":"string"},"isNew":{"type":"boolean"},"consented":{"type":"boolean"}}}},"securitySchemes":{"bearer":{"type":"http","description":"Ed25519-signed access token, 15 minute lifetime","scheme":"bearer","bearerFormat":"JWT"},"cookie":{"type":"apiKey","description":"Same token, as set for the browser","name":"token","in":"cookie"}}}}