Wardog Servers API
Los datos detrás de este sitio están disponibles como una API JSON gratuita de solo lectura: cada servidor de WARDOGS que lista el navegador del juego, actualizado aproximadamente cada minuto, más el historial de jugadores para gráficas y el historial por servidor según su código de unión.
Resumen
La URL base es https://api.wardogservers.com. Todas las respuestas son JSON y las lecturas no necesitan clave de API.
El contrato completo se publica como un documento OpenAPI 3.1 en https://api.wardogservers.com/openapi.json ↗. Ese documento es la fuente de verdad; esta página es el resumen legible.
- El recolector consulta el navegador de servidores del juego en cada región aproximadamente una vez por minuto. El intervalo actual se indica en cada respuesta como meta.refreshSeconds.
- Las solicitudes desde el navegador solo se aceptan desde wardogservers.com. Llama a la API desde tu propio servidor, bot o script, no desde una página web en otro dominio.
- Los parámetros de consulta desconocidos, duplicados o mal formados se rechazan con un 400 en lugar de ignorarse, así que una errata falla de forma visible en lugar de devolver todo silenciosamente.
Inicio rápido
Tres solicitudes cubren la mayoría de los usos: los totales ahora mismo, los servidores con más jugadores que coinciden con un filtro y un servidor por su id de instancia.
# Totales ahora mismo
curl https://api.wardogservers.com/v1/stats
# Servidores de la comunidad en Europa Occidental con plazas libres, los más concurridos primero
curl "https://api.wardogservers.com/v1/servers?region=eu-west&type=community&hideFull=true&limit=10"
# Un servidor por id de instancia
curl https://api.wardogservers.com/v1/servers/$ID Una respuesta recortada de /v1/stats tiene este aspecto:
{
"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
Todos los endpoints de lectura aceptan GET y HEAD, respetan If-None-Match y usan la estructura de respuesta que se describe más abajo.
| Endpoint | Devuelve |
|---|---|
GET /v1/servers | La lista de servidores con filtros, orden y paginación. |
GET /v1/servers/{id} | Un servidor con los campos de detalle adicionales: atributos en bruto, build, nivel y límites de dinero. |
GET /v1/snapshot | Todos los servidores del snapshot actual, ordenados por id de instancia, sin filtros ni paginación. Para clientes que guardan la lista completa y filtran localmente. |
GET /v1/regions | Número de servidores y jugadores por región, y si cada región fue solicitada y observada en la última consulta. |
GET /v1/stats | Totales: servidores y jugadores en línea, divididos en oficiales y de la comunidad. |
GET /v1/history/players | Series temporales de jugadores y servidores para gráficos. |
GET /v1/history/heatmap | Media de una métrica por día de la semana y hora en UTC durante los últimos 28 días. |
GET /v1/history/peaks | Picos de jugadores históricos y diarios, en total y por tipo de servidor. |
GET /v1/history/servers | Servidores que el recolector ha registrado, por código de unión, los vistos más recientemente primero. Sirve para encontrar un servidor que ahora mismo está desconectado. |
GET /v1/history/servers/ranking | Servidores clasificados por tiempo activo por jugadores: media de jugadores en el último día, semana o mes, contando el tiempo desconectado como cero. |
GET /v1/history/servers/{serverId} | Jugadores, pico, capacidad, proporción de tiempo activo y mapa por intervalo para un servidor, por código de unión. |
GET /v1/history/servers/{serverId}/events | Registro de cambios de un servidor, los más recientes primero: conexión, desconexión, reinicio y cambios de build, mapa, modificadores y límites. |
GET /readyz | 200 mientras haya un snapshot reciente disponible, 503 cuando falta o está obsoleto. |
GET /openapi.json | El documento OpenAPI 3.1. |
Filtrar la lista de servidores
Todos los parámetros de /v1/servers son opcionales. Los valores distinguen mayúsculas y minúsculas excepto q.
| Parámetro | Valores | Significado |
|---|---|---|
q | texto, hasta 200 caracteres | Búsqueda sin distinguir mayúsculas y minúsculas en id de instancia, código de unión, nombre, región, número de servidor, mapa y modo. |
region | eu-west,eu-central | Uno o más ids de región, separados por comas. /v1/regions tiene la lista actual. |
type | all · official · community, por defecto all | Servidores oficiales, servidores de la comunidad o ambos. |
hideEmpty | true · false | Descarta los servidores con cero jugadores. |
hideFull | true · false | Descarta los servidores al máximo de su capacidad, incluidos los 0/0. |
passwordProtected | true · false | Solo servidores con contraseña o solo abiertos. Omite el parámetro para ambos. |
sort | -players · players · name · region | -players es el orden por más jugadores primero y es el valor por defecto. |
limit | 1–500, por defecto 100 | Tamaño de página. |
offset | 0–100000, por defecto 0 | Desplazamiento basado en cero dentro del resultado filtrado y ordenado. |
Estructura de la respuesta
Toda respuesta correcta incluye data y meta. El endpoint de lista añade paginación; los endpoints de historial añaden un objeto history que describe la ventana, el grupo, la métrica y el tamaño del bucket.
Comprueba meta.stale antes de presentar los números como actuales. Es true cuando la recolección se ha pausado o el snapshot es más antiguo que refreshSeconds más 60 segundos. Las respuestas obsoletas también se envían con Cache-Control: no-store y X-Data-Stale: true.
| Campo | Significado |
|---|---|
meta.fetchedAt | Cuándo obtuvo el recolector este snapshot. |
meta.snapshotId | Identificador del snapshot; cambia cada vez que llegan datos nuevos. También se envía como la cabecera X-Snapshot-Id. |
meta.refreshSeconds | Con qué frecuencia consulta el recolector. No consultes más rápido que esto. |
meta.stale | Es true cuando los datos no deben presentarse como en vivo. |
meta.requestedRegions | Regiones que el recolector pidió al juego. |
meta.observedRegions | Regiones que devolvieron al menos un servidor en este snapshot. |
El objeto de servidor
Esta es la forma resumida que devuelven /v1/servers y /v1/snapshot. /v1/servers/{id} devuelve los mismos campos más atributos, build, nivel y dinero.
{
"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"]
} | Campo | Significado |
|---|---|
id | Id de instancia del juego en vivo. Cambia cuando el servidor se reinicia, así que no lo uses como clave permanente. |
serverId | Código de unión del juego como string: un número decimal con los ceros iniciales conservados en los servidores oficiales, o un UUID en los servidores de la comunidad desde el parche 0.11 del juego. Null cuando aún no se ha recogido. |
serverIdUpdatedAt | Cuándo se consultó el código de unión por última vez. Null siempre que serverId sea null. |
name | Official #N para los servidores oficiales; si no, el nombre decodificado del servidor. Puede estar vacío. |
nativeName | El nombre del servidor en bruto, tal como lo reporta el juego. |
type | official o community. |
region | Id de región, por ejemplo eu-west. |
players · maxPlayers · reservedPlayers | Número de jugadores actuales, máximos y reservados. |
passwordProtected | Si hace falta contraseña para unirse. |
serverNumber | El número de servidor oficial; 0 para los servidores de la comunidad. |
map | Variante de mapa y mapa base. Cualquiera de los dos puede ser null. |
mode | Nombres de la experiencia y el modo de juego, más los valores raw y modifiers de la cadena experience, en el orden de origen. |
rulesets | standard, hardcore o infantry-only, derivado de los modifiers. Exactamente ["standard"] cuando no se reconoce ninguno. |
Historial
/v1/history/players devuelve una serie columnar: un array con los tiempos de inicio de cada bucket en segundos Unix y un array de valores por clave de grupo, alineados por índice. Un valor null es un bucket en el que no se registró nada, normalmente porque el recolector estaba en pausa. Muestra un hueco; no interpoles.
Los buckets se registran una vez por snapshot desde el momento en que se activó el historial, sin relleno retroactivo. Los buckets de un minuto se conservan 7 días, los de cinco minutos 90 días y los de una hora indefinidamente.
| Parámetro | Valores | Significado |
|---|---|---|
window | 24h · 7d · 30d · 90d · 1y, por defecto 24h | Ventana que termina ahora. El paso del bucket es de 60 s para 24h, 300 s para 7d, 3600 s para 30d y 90d, y 21600 s para 1y. |
group | total · type · region · regionType · map · ruleset, por defecto total | Una serie por clave: total; official y community; region; region|type; variante de mapa; o ruleset principal. |
metric | players · servers · full · empty · capacity · free, por defecto players | players, servers, full (al máximo de capacidad), empty, capacity (suma de maxPlayers) o free (capacity menos players). Cada valor es la media de los snapshots del 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": { "…": "…" }
} Para metric=players la respuesta también incluye un objeto peak con el snapshot más alto de cada bucket. El endpoint heatmap calcula la media de una métrica por día de la semana y hora en UTC durante los últimos 28 días completos, opcionalmente para una región. Peaks reporta el número de jugadores más alto de un solo snapshot, en total y por tipo, histórico y para cada uno de los últimos 30 días UTC.
Historial por servidor
El historial por servidor se indexa por el código de unión, que se conserva entre reinicios y cambios de mapa, a diferencia del id de instancia. /v1/history/servers/{serverId} devuelve arrays alineados: la media de jugadores y el máximo de un solo sondeo mientras el servidor estaba listado, su límite de jugadores, la proporción de sondeos del intervalo en los que apareció (su tiempo activo, de 0 a 1) y el mapa al final del intervalo, de modo que los valores consecutivos de mapa dan la rotación. El registro empieza la primera vez que se ve un código, sin datos retroactivos, y hasta entonces la ruta responde 404.
| Parámetro | Valores | Significado |
|---|---|---|
window | 24h · 7d · 30d · 90d, por defecto 24h | 24h y 7d usan intervalos de cinco minutos conservados 7 días; 30d y 90d usan intervalos horarios conservados 90 días. |
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 deriva un registro de cambios a partir de sondeos consecutivos, los más recientes primero: tracking_started, online, offline, restart (la instancia cambió sin hueco), build (changelist), map (variante, mundo o cielo), modifiers y limits (rangos de nivel y dinero, contraseña y límite de jugadores). Cada evento lleva at, kind y los objetos before y after con solo los campos que definen ese tipo, null cuando no hay estado anterior o posterior. limit acepta de 1 a 500 y por defecto es 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 lista los servidores registrados, los vistos más recientemente primero. q coincide con un código de unión de forma exacta o con un último nombre conocido sin distinguir mayúsculas, así que encuentra un servidor que ahora mismo está desconectado; los servidores en vivo ya llevan su serverId en /v1/servers.
| Parámetro | Valores | Significado |
|---|---|---|
q | texto, hasta 200 caracteres | Un código de unión, coincidencia exacta, o un último nombre conocido, sin distinguir mayúsculas. |
type | all · official · community, por defecto all | Servidores oficiales, servidores de la comunidad o ambos. |
limit | 1–100, por defecto 20 | Cuántos servidores devolver. |
Caché y sondeo
Toda respuesta incluye un ETag. Envíalo de vuelta como If-None-Match, y un snapshot sin cambios responde con 304 sin cuerpo, lo que apenas cuesta nada en ningún lado. El patrón previsto es una consulta por minuto con If-None-Match.
const res = await fetch('https://api.wardogservers.com/v1/snapshot', {
headers: lastEtag ? { 'if-none-match': lastEtag } : {}
});
if (res.status === 304) return; // Nada cambió desde la última consulta
lastEtag = res.headers.get('etag');
const { data, meta } = await res.json();
if (meta.stale) console.warn('stale'); // El recolector va con retraso; sigue mostrando los últimos datos conocidos Las respuestas nuevas se cachean en el edge durante 15 segundos, así que las ráfagas de solicitudes idénticas salen baratas. Hoy no hay un límite de frecuencia estricto, pero consultar más rápido que meta.refreshSeconds no puede devolver datos más nuevos y podría limitarse en el futuro. Si necesitas la lista completa, obtén /v1/snapshot una vez y filtra localmente en lugar de paginar por /v1/servers.
Errores
Los errores son JSON con un code estable y un message legible para humanos. El message puede cambiar; compara por el code.
{
"error": {
"code": "bad_request",
"message": "An unsupported query parameter was supplied."
}
} | Estado | Cuándo |
|---|---|
400 | Parámetro de consulta desconocido, duplicado o no válido, o un id que no es un UUID. |
401 | Se requería una clave de API y faltaba o era incorrecta. No se devuelve en las lecturas mientras el acceso público esté activado. |
404 | No hay ningún servidor con ese id en la instantánea actual, no hay historial para ese código de unión, o la ruta no existe. |
405 | Un método distinto de GET o HEAD. |
503 | No hay ningún snapshot utilizable. Reinténtalo pasado un minuto o cuando /readyz devuelva 200. |
Condiciones de uso
La API es gratuita para proyectos de la comunidad: bots de Discord, overlays, paneles, investigación. Da crédito a Wardog Servers con un enlace donde muestres los datos públicamente, y no los presentes como datos oficiales de BULKHEAD o Team17.
La API de lectura está versionada bajo /v1. Pueden añadirse campos nuevos dentro de una versión, así que tolera las claves que no reconozcas. Los cambios incompatibles se publicarán como una nueva versión y se anunciarán antes en esta página.
Preguntas, un proyecto para presumir o un campo que necesites: Discord @xcausxn.