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.
| Endpoint | Retourneert |
|---|---|
GET /v1/servers | De 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/snapshot | Elke 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/regions | Server- en spelersaantallen per regio, en of elke regio is opgevraagd en waargenomen in de laatste poll. |
GET /v1/stats | Totalen: servers en spelers online, opgesplitst in official en community. |
GET /v1/history/players | Spelers- en servertijdreeksen voor grafieken. |
GET /v1/history/heatmap | Gemiddelde van een metric per UTC-weekdag en -uur over de laatste 28 dagen. |
GET /v1/history/peaks | Spelerspieken aller tijden en per dag, in totaal en per servertype. |
GET /v1/history/servers | Servers die de collector heeft vastgelegd, per joincode, meest recent gezien eerst. Vindt een server die nu offline is. |
GET /v1/history/servers/ranking | Servers 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}/events | Wijzigingslog van één server, nieuwste eerst: online, offline, herstart en wijzigingen van build, map, modifiers en limieten. |
GET /readyz | 200 zolang er een verse snapshot beschikbaar is, 503 wanneer die ontbreekt of verouderd is. |
GET /openapi.json | Het OpenAPI 3.1-document. |
De serverlijst filteren
Elke parameter op /v1/servers is optioneel. Waarden zijn hoofdlettergevoelig, behalve q.
| Parameter | Waarden | Betekenis |
|---|---|---|
q | tekst, tot 200 tekens | Hoofdletterongevoelig zoeken in instantie-id, joincode, naam, regio, servernummer, map en modus. |
region | eu-west,eu-central | Een of meer regio-id's, kommagescheiden. /v1/regions bevat de huidige lijst. |
type | all · official · community, standaard all | Officiële servers, communityservers, of beide. |
hideEmpty | true · false | Servers met nul spelers weglaten. |
hideFull | true · false | Servers op volle capaciteit weglaten, inclusief 0/0. |
passwordProtected | true · false | Alleen vergrendelde of alleen open servers. Weglaten voor beide. |
sort | -players · players · name · region | -players is drukste eerst en de standaardwaarde. |
limit | 1–500, standaard 100 | Paginagrootte. |
offset | 0–100000, standaard 0 | Nulgebaseerde 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.
| Veld | Betekenis |
|---|---|
meta.fetchedAt | Wanneer de collector deze snapshot heeft opgehaald. |
meta.snapshotId | Identifier van de snapshot; verandert zodra nieuwe data binnenkomt. Wordt ook verstuurd als de X-Snapshot-Id header. |
meta.refreshSeconds | Hoe vaak de collector polt. Pol niet sneller dan dit. |
meta.stale | True wanneer de data niet als live moet worden gepresenteerd. |
meta.requestedRegions | Regio's die de collector bij de game heeft opgevraagd. |
meta.observedRegions | Regio'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"]
} | Veld | Betekenis |
|---|---|
id | Live-instantie-id van de game. Dit verandert wanneer de server herstart, dus gebruik het niet als permanente sleutel. |
serverId | In-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. |
serverIdUpdatedAt | Wanneer de joincode voor het laatst is opgezocht. Null wanneer serverId null is. |
name | Official #N voor officiële servers, anders de gedecodeerde servernaam. Kan leeg zijn. |
nativeName | De ruwe servernaam zoals de game die meldt. |
type | official of community. |
region | Regio-id, bijvoorbeeld eu-west. |
players · maxPlayers · reservedPlayers | Huidig, maximaal en gereserveerd aantal spelers. |
passwordProtected | Of een wachtwoord nodig is om te joinen. |
serverNumber | Het officiële servernummer; 0 voor communityservers. |
map | Mapvariant en basismap. Beide kunnen null zijn. |
mode | Experience- en spelmodusnamen, plus de ruwe + modifiers uit de experience-string, in bronvolgorde. |
rulesets | standard, 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.
| Parameter | Waarden | Betekenis |
|---|---|---|
window | 24h · 7d · 30d · 90d · 1y, standaard 24h | Venster 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. |
group | total · type · region · regionType · map · ruleset, standaard total | Eén reeks per sleutel: totaal; official en community; regio; region|type; mapvariant; of primaire ruleset. |
metric | players · servers · full · empty · capacity · free, standaard players | players, 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.
| Parameter | Waarden | Betekenis |
|---|---|---|
window | 24h · 7d · 30d · 90d, standaard 24h | 24h 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.
| Parameter | Waarden | Betekenis |
|---|---|---|
q | tekst, tot 200 tekens | Een joincode, exact overeenkomend, of een laatst bekende naam, hoofdletterongevoelig. |
type | all · official · community, standaard all | Officiële servers, communityservers, of beide. |
limit | 1–100, standaard 20 | Hoeveel 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."
}
} | Status | Wanneer |
|---|---|
400 | Onbekende, dubbele of ongeldige queryparameter, of een id dat geen UUID is. |
401 | Er was een API-sleutel vereist en die ontbrak of was onjuist. Wordt niet geretourneerd voor lezen zolang publieke toegang aanstaat. |
404 | Geen server met dat id in de huidige snapshot, geen geschiedenis voor die joincode, of een onbekende route. |
405 | Een andere methode dan GET of HEAD. |
503 | Geen 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.