Naar de inhoud
Ontwikkelaars

Wardog Servers API

De gegevens achter deze site zijn beschikbaar als een gratis, alleen-lezen JSON-API: elke WARDOGS-server die de serverbrowser in het spel toont, ongeveer elke minuut ververst, plus spelersgeschiedenis voor grafieken en geschiedenis per server via de joincode.

Overzicht

De basis-URL is https://api.wardogservers.com. Elke response is JSON en voor lezen is geen API-sleutel nodig.

Het volledige contract is gepubliceerd als OpenAPI 3.1-document op https://api.wardogservers.com/openapi.json ↗. Dat document is de bron van waarheid; deze pagina is de leesbare samenvatting.

  • De collector polt de in-game serverbrowser in elke regio ongeveer eens per minuut. Het huidige interval wordt in elke response gemeld als meta.refreshSeconds.
  • Browserverzoeken worden alleen geaccepteerd vanaf wardogservers.com. Roep de API aan vanaf je eigen server, bot of script, niet vanaf een webpagina op een ander domein.
  • Onbekende, dubbele of ongeldige queryparameters worden afgewezen met een 400 in plaats van genegeerd, zodat een typefout luid faalt in plaats van stilletjes alles terug te geven.

Snel starten

Drie verzoeken dekken de meeste toepassingen: de totalen op dit moment, de drukste servers die aan een filter voldoen, en één server via het instantie-id.

# Totalen op dit moment
curl https://api.wardogservers.com/v1/stats

# Communityservers in West-Europa met ruimte om te joinen, drukste eerst
curl "https://api.wardogservers.com/v1/servers?region=eu-west&type=community&hideFull=true&limit=10"

# Eén server via het instantie-id
curl https://api.wardogservers.com/v1/servers/$ID

Een ingekorte response van /v1/stats ziet er zo uit:

{
  "data": {
    "serverCount": 3544,
    "playerCount": 252109,
    "officialServerCount": 2765,
    "communityServerCount": 779
  },
  "meta": {
    "fetchedAt": "2026-09-13T12:54:57.302Z",
    "snapshotId": "95635cb938811a34…",
    "refreshSeconds": 60,
    "stale": false,
    "requestedRegions": ["asia-east", "asia-southeast", "…"],
    "observedRegions": ["asia-east", "asia-west", "…"]
  }
}

Endpoints

Elk leesendpoint accepteert GET en HEAD, respecteert If-None-Match en gebruikt de hieronder beschreven response-envelope.

EndpointRetourneert
GET /v1/serversDe serverlijst met filters, sortering en paginering.
GET /v1/servers/{id}Eén server met de extra detailvelden: ruwe attributes, build, level en cash-limieten.
GET /v1/snapshotElke server in de huidige snapshot, gesorteerd op instantie-id, zonder filters of paginering. Voor clients die de hele lijst bijhouden en lokaal filteren.
GET /v1/regionsServer- en spelersaantallen per regio, en of elke regio is opgevraagd en waargenomen in de laatste poll.
GET /v1/statsTotalen: servers en spelers online, opgesplitst in official en community.
GET /v1/history/playersSpelers- en servertijdreeksen voor grafieken.
GET /v1/history/heatmapGemiddelde van een metric per UTC-weekdag en -uur over de laatste 28 dagen.
GET /v1/history/peaksSpelerspieken aller tijden en per dag, in totaal en per servertype.
GET /v1/history/serversServers die de collector heeft vastgelegd, per joincode, meest recent gezien eerst. Vindt een server die nu offline is.
GET /v1/history/servers/rankingServers gerangschikt op uptime maal spelers: gemiddeld aantal spelers over de laatste dag, week of maand, waarbij offline tijd als nul telt.
GET /v1/history/servers/{serverId}Spelers, piek, capaciteit, uptime-aandeel en map per interval voor één server, per joincode.
GET /v1/history/servers/{serverId}/eventsWijzigingslog van één server, nieuwste eerst: online, offline, herstart en wijzigingen van build, map, modifiers en limieten.
GET /readyz200 zolang er een verse snapshot beschikbaar is, 503 wanneer die ontbreekt of verouderd is.
GET /openapi.jsonHet OpenAPI 3.1-document.

De serverlijst filteren

Elke parameter op /v1/servers is optioneel. Waarden zijn hoofdlettergevoelig, behalve q.

ParameterWaardenBetekenis
qtekst, tot 200 tekensHoofdletterongevoelig zoeken in instantie-id, joincode, naam, regio, servernummer, map en modus.
regioneu-west,eu-centralEen of meer regio-id's, kommagescheiden. /v1/regions bevat de huidige lijst.
typeall · official · community, standaard allOfficiële servers, communityservers, of beide.
hideEmptytrue · falseServers met nul spelers weglaten.
hideFulltrue · falseServers op volle capaciteit weglaten, inclusief 0/0.
passwordProtectedtrue · falseAlleen vergrendelde of alleen open servers. Weglaten voor beide.
sort-players · players · name · region-players is drukste eerst en de standaardwaarde.
limit1–500, standaard 100Paginagrootte.
offset0–100000, standaard 0Nulgebaseerde offset in het gefilterde, gesorteerde resultaat.

Response-envelope

Elke geslaagde response bevat data en meta. Het lijstendpoint voegt paginering toe; historie-endpoints voegen een history-object toe dat het venster, de groep, de metric en de bucketgrootte beschrijft.

Controleer meta.stale voordat je cijfers als actueel presenteert. Dit is true wanneer het verzamelen is gepauzeerd of de snapshot ouder is dan refreshSeconds plus 60 seconden. Verouderde responses worden ook verstuurd met Cache-Control: no-store en X-Data-Stale: true.

VeldBetekenis
meta.fetchedAtWanneer de collector deze snapshot heeft opgehaald.
meta.snapshotIdIdentifier van de snapshot; verandert zodra nieuwe data binnenkomt. Wordt ook verstuurd als de X-Snapshot-Id header.
meta.refreshSecondsHoe vaak de collector polt. Pol niet sneller dan dit.
meta.staleTrue wanneer de data niet als live moet worden gepresenteerd.
meta.requestedRegionsRegio's die de collector bij de game heeft opgevraagd.
meta.observedRegionsRegio's die in deze snapshot minstens één server opleverden.

Het server-object

Dit is de samenvattingsvorm die wordt geretourneerd door /v1/servers en /v1/snapshot. /v1/servers/{id} retourneert dezelfde velden plus attributes, build, level en cash.

{
  "id": "001ab36e-9985-4a9c-8dff-9dc137826dfe",
  "serverId": "756872",
  "serverIdUpdatedAt": "2026-09-13T11:14:32.995Z",
  "name": "Official #4",
  "nativeName": "f14859cce268",
  "type": "official",
  "region": "eu-south",
  "players": 100,
  "maxPlayers": 100,
  "reservedPlayers": 0,
  "passwordProtected": false,
  "serverNumber": 4,
  "map": { "variant": "Bakurani", "base": "Europe" },
  "mode": { "experience": "Bakurani_KOTH_01", "gameMode": "GM_Session_C", "modifiers": [] },
  "rulesets": ["standard"]
}
VeldBetekenis
idLive-instantie-id van de game. Dit verandert wanneer de server herstart, dus gebruik het niet als permanente sleutel.
serverIdIn-game joincode als string: een decimaal getal met behoud van voorloopnullen voor officiële servers, of sinds gamepatch 0.11 een UUID voor communityservers. Null wanneer nog niet verzameld.
serverIdUpdatedAtWanneer de joincode voor het laatst is opgezocht. Null wanneer serverId null is.
nameOfficial #N voor officiële servers, anders de gedecodeerde servernaam. Kan leeg zijn.
nativeNameDe ruwe servernaam zoals de game die meldt.
typeofficial of community.
regionRegio-id, bijvoorbeeld eu-west.
players · maxPlayers · reservedPlayersHuidig, maximaal en gereserveerd aantal spelers.
passwordProtectedOf een wachtwoord nodig is om te joinen.
serverNumberHet officiële servernummer; 0 voor communityservers.
mapMapvariant en basismap. Beide kunnen null zijn.
modeExperience- en spelmodusnamen, plus de ruwe + modifiers uit de experience-string, in bronvolgorde.
rulesetsstandard, hardcore of infantry-only, afgeleid van de modifiers. Precies ["standard"] wanneer er geen wordt herkend.

Geschiedenis

/v1/history/players retourneert een kolomsgewijze reeks: één array met starttijden van buckets in Unix-seconden en één array met waarden per groepssleutel, uitgelijnd op index. Een null-waarde is een bucket waarin niets is vastgelegd, meestal omdat de collector gepauzeerd was. Toon een gat; interpoleer niet.

Buckets worden één keer per snapshot vastgelegd vanaf het moment dat geschiedenis werd ingeschakeld, zonder terugvullen. Minuutbuckets worden 7 dagen bewaard, vijfminutenbuckets 90 dagen en uurbuckets voor onbepaalde tijd.

ParameterWaardenBetekenis
window24h · 7d · 30d · 90d · 1y, standaard 24hVenster dat nu eindigt. De bucketstap is 60 s voor 24h, 300 s voor 7d, 3600 s voor 30d en 90d, en 21600 s voor 1y.
grouptotal · type · region · regionType · map · ruleset, standaard totalEén reeks per sleutel: totaal; official en community; regio; region|type; mapvariant; of primaire ruleset.
metricplayers · servers · full · empty · capacity · free, standaard playersplayers, servers, full (op capaciteit), empty, capacity (som van maxPlayers) of free (capacity minus players). Elke waarde is het gemiddelde over de snapshots in de bucket.
GET /v1/history/players?window=24h&group=type

{
  "data": {
    "t": [1789217880, 1789217940, 1789218000, "…"],
    "series": {
      "official": [248112, 248390, null, "…"],
      "community": [3902, 3911, null, "…"]
    },
    "peak": { "official": ["…"], "community": ["…"] }
  },
  "history": {
    "window": "24h", "group": "type", "metric": "players",
    "step": 60, "from": 1789217880, "to": 1789304280, "since": 1789257600
  },
  "meta": { "…": "…" }
}

Voor metric=players bevat de response ook een peak-object met de hoogste losse snapshot in elke bucket. Het heatmap-endpoint middelt een metric per UTC-weekdag en -uur over de laatste 28 volledige dagen, optioneel voor één regio. Peaks meldt het hoogste losse-snapshot-spelersaantal, in totaal en per type, aller tijden en voor elk van de laatste 30 UTC-dagen.

Geschiedenis per server

De geschiedenis per server is gekoppeld aan de joincode, die anders dan het instance-id behouden blijft bij herstarts en mapwissels. /v1/history/servers/{serverId} geeft uitgelijnde arrays terug: het gemiddelde aantal spelers en de hoogste losse peiling terwijl de server vermeld stond, de spelerslimiet, het aandeel peilingen in het interval waarin de server voorkwam (de uptime, 0 tot 1) en de map aan het einde van het interval, zodat opeenvolgende mapwaarden de rotatie geven. Het opnemen begint zodra een code voor het eerst wordt gezien, zonder terugwerkende kracht; tot die tijd antwoordt de route met 404.

ParameterWaardenBetekenis
window24h · 7d · 30d · 90d, standaard 24h24h en 7d gebruiken intervallen van vijf minuten die 7 dagen bewaard blijven; 30d en 90d gebruiken uurintervallen die 90 dagen bewaard blijven.
GET /v1/history/servers/756872?window=24h

{
  "data": {
    "server": {
      "serverId": "756872",
      "name": "Official #4",
      "type": "official",
      "region": "eu-south",
      "instanceId": "001ab36e-9985-4a9c-8dff-9dc137826dfe",
      "firstSeen": "2026-09-13T00:00:39.000Z",
      "lastSeen": "2026-09-14T11:53:22.000Z",
      "samples": 2132,
      "live": true
    },
    "t": [1789300800, 1789301100, 1789301400, "…"],
    "players": [100, 98, null, "…"],
    "peak": [100, 100, null, "…"],
    "capacity": [100, 100, null, "…"],
    "online": [1, 0.8, null, "…"],
    "map": ["Bakurani", "Bakurani", null, "…"]
  },
  "history": {
    "window": "24h", "step": 300,
    "from": 1789300800, "to": 1789387200, "since": 1789257600
  },
  "meta": { "…": "…" }
}

/v1/history/servers/{serverId}/events leidt uit opeenvolgende peilingen een wijzigingslog af, nieuwste eerst: tracking_started, online, offline, restart (instance gewisseld zonder gat), build (changelist), map (variant, wereld of lucht), modifiers en limits (level- en cashbereik, wachtwoord en spelerslimiet). Elk event bevat at, kind en before- en after-objecten met alleen de velden die dat soort definiëren, null als er geen eerdere of latere toestand is. limit accepteert 1 tot 500, standaard 100.

GET /v1/history/servers/756872/events?limit=3

{
  "data": {
    "server": { "serverId": "756872", "name": "Official #4", "…": "…" },
    "events": [
      {
        "at": "2026-09-14T12:40:30.000Z",
        "kind": "map",
        "before": { "map": "Madrid", "world": "Europe", "sky": "DayEarlyFog" },
        "after": { "map": "Detroit", "world": "Europe", "sky": "DayLateGray" }
      },
      {
        "at": "2026-09-14T09:12:04.000Z",
        "kind": "restart",
        "before": { "instanceId": "001ab36e-9985-4a9c-8dff-9dc137826dfe" },
        "after": { "instanceId": "7c1e0b52-3d9a-4e1f-9b6e-2f4c8a9d0e11" }
      },
      {
        "at": "2026-09-13T00:00:39.000Z",
        "kind": "tracking_started",
        "before": null,
        "after": { "instanceId": "…", "changelist": "501228", "map": "Bakurani", "…": "…" }
      }
    ]
  },
  "history": { "limit": 3, "since": 1789257600 },
  "meta": { "…": "…" }
}

/v1/history/servers toont vastgelegde servers, meest recent gezien eerst. q komt exact overeen met een joincode of hoofdletterongevoelig met een laatst bekende naam, en vindt zo een server die nu offline is; live servers hebben hun serverId al in /v1/servers.

ParameterWaardenBetekenis
qtekst, tot 200 tekensEen joincode, exact overeenkomend, of een laatst bekende naam, hoofdletterongevoelig.
typeall · official · community, standaard allOfficiële servers, communityservers, of beide.
limit1–100, standaard 20Hoeveel servers terug te geven.

Caching en polling

Elke response bevat een ETag. Stuur die terug als If-None-Match en een ongewijzigde snapshot antwoordt met 304 zonder body, wat aan beide kanten vrijwel niets kost. Eén keer per minuut pollen met If-None-Match is het bedoelde patroon.

const res = await fetch('https://api.wardogservers.com/v1/snapshot', {
  headers: lastEtag ? { 'if-none-match': lastEtag } : {}
});
if (res.status === 304) return; // Niets veranderd sinds de laatste poll
lastEtag = res.headers.get('etag');
const { data, meta } = await res.json();
if (meta.stale) console.warn('stale'); // Collector loopt achter; blijf de laatst bekende data tonen

Verse responses worden 15 seconden gecachet aan de rand, zodat pieken van identieke verzoeken goedkoop zijn. Er is nu geen harde rate limit, maar sneller pollen dan meta.refreshSeconds kan geen nieuwere data opleveren en kan in de toekomst worden beperkt. Heb je de hele lijst nodig, haal dan eenmalig /v1/snapshot op en filter lokaal in plaats van door /v1/servers te pagineren.

Fouten

Fouten zijn JSON met een stabiele code en een leesbare boodschap. De boodschap kan veranderen; match op de code.

{
  "error": {
    "code": "bad_request",
    "message": "An unsupported query parameter was supplied."
  }
}
StatusWanneer
400Onbekende, dubbele of ongeldige queryparameter, of een id dat geen UUID is.
401Er was een API-sleutel vereist en die ontbrak of was onjuist. Wordt niet geretourneerd voor lezen zolang publieke toegang aanstaat.
404Geen server met dat id in de huidige snapshot, geen geschiedenis voor die joincode, of een onbekende route.
405Een andere methode dan GET of HEAD.
503Geen bruikbare snapshot. Probeer het na een minuut opnieuw of wanneer /readyz 200 retourneert.

Gebruiksvoorwaarden

De API is gratis voor communityprojecten: Discord-bots, overlays, dashboards, onderzoek. Vermeld Wardog Servers met een link waar je de data publiekelijk toont, en presenteer het niet als officiële data van BULKHEAD of Team17.

De lees-API is geversioneerd onder /v1. Er kunnen binnen een versie nieuwe velden worden toegevoegd, dus tolereer sleutels die je niet herkent. Breaking changes verschijnen als nieuwe versie en worden eerst op deze pagina aangekondigd.

Vragen, een project om te laten zien, of een veld dat je nodig hebt: Discord @xcausxn.