Public API, version 1

API documentation

Live server data for Plutonium, IW4x, CoD4x, AlterWare, Aurora, Horizon and the rest, as plain JSON over HTTPS. No key, no signup. Built for Discord bots, dashboards and community tools.

Base URL

https://gameserve.rs/api/v1
Auth
None
Format
JSON
Methods
GET
CORS
Any origin

Quick start

Every endpoint is a plain GET request that returns JSON. Two to start with:

Active Black Ops 2 Zombies servers with at least one player.

bash
curl "https://gameserve.rs/api/v1/servers?game=T6ZM&min_players=1"

Every server run by one community, by name.

bash
curl "https://gameserve.rs/api/v1/servers?search=HGM"

Endpoints

Open a row for its parameters, an example request and an example response.

Additional endpoints

Same response envelope, no required parameters.

  • GET/api/v1/gamesList all supported games
  • GET/api/v1/platformsList all platforms with details
  • GET/api/v1/mapsGet top maps per game
  • GET/api/v1/modesGet popular game modes
  • GET/api/v1/countriesServer stats by country
  • GET/api/v1/stats/historyHistorical player counts
  • GET/api/v1/stats/peaksPeak player records
  • GET/api/v1/milestonesRecent achievements

Game tags

Pass these codes to the game parameter.

Zombies

  • T4ZMWorld at War Zombies
  • T5ZMBlack Ops Zombies
  • T6ZMBlack Ops 2 Zombies

Multiplayer

  • IW3Call of Duty 4
  • IW4Modern Warfare 2
  • IW5Modern Warfare 3
  • IW6Ghosts
  • T4World at War
  • T5Black Ops
  • T6Black Ops 2
  • T7Black Ops 3
  • H2MMW2 Remastered MP

Code examples

Three working starting points. Nothing here needs a key.

JavaScript / TypeScript

Pull the live zombies list and split it by community.

JavaScript / TypeScript
// Fetch all [HGM] and NamelessNoobs zombies servers
async function getZombiesServers() {
const response = await fetch(
'https://gameserve.rs/api/v1/servers?zombies=true&min_players=1'
);
const { data } = await response.json();
// Filter for specific communities
const hgmServers = data.servers.filter(s =>
s.name.includes('[HGM]')
);
const nnServers = data.servers.filter(s =>
s.name.toLowerCase().includes('namelessnoobs')
);
console.log('=== [HGM] Servers ===');
hgmServers.forEach(server => {
console.log(`${server.name}`);
console.log(` Map: ${server.map.display} | Round: ${server.zombiesRound}`);
console.log(` Players: ${server.players.current}/${server.players.max}`);
});
console.log('\n=== NamelessNoobs Servers ===');
nnServers.forEach(server => {
console.log(`${server.name}`);
console.log(` Map: ${server.map.display}`);
console.log(` Players: ${server.players.current}/${server.players.max}`);
});
}
getZombiesServers();

Python

Print the five busiest servers with a fill-rate label.

Python
import requests
def get_trending_servers():
"""Get the busiest servers right now"""
response = requests.get('https://gameserve.rs/api/v1/trending', params={
'limit': 5
})
data = response.json()
print("Trending servers\n")
for server in data['data']['servers']:
fill_rate = server['fillRate']
status = "[FULL]" if fill_rate > 80 else "[BUSY]" if fill_rate > 50 else "[OPEN]"
print(f"{status} {server['name']}")
print(f" Map: {server['map']['display']}")
print(f" Players: {server['players']['current']}/{server['players']['max']} ({fill_rate:.1f}% full)")
if server.get('zombiesRound'):
print(f" Round: {server['zombiesRound']}")
print()
get_trending_servers()

Discord.js bot

A slash command that posts active zombies servers as an embed.

Discord.js
const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
module.exports = {
data: new SlashCommandBuilder()
.setName('zombies')
.setDescription('Show active zombies servers'),
async execute(interaction) {
await interaction.deferReply();
const res = await fetch(
'https://gameserve.rs/api/v1/servers?zombies=true&min_players=1&limit=5'
);
const { data } = await res.json();
const embed = new EmbedBuilder()
.setTitle('Active Zombies Servers')
.setColor(0xd946ef)
.setTimestamp();
for (const server of data.servers) {
const round = server.zombiesRound ? `Round ${server.zombiesRound}` : '';
embed.addFields({
name: server.name,
value: [
`🗺️ ${server.map.display}`,
`👥 ${server.players.current}/${server.players.max} players`,
round,
`\`connect ${server.address}\``
].filter(Boolean).join('\n'),
inline: true
});
}
embed.setFooter({ text: 'Data from GameServe.rs API' });
return interaction.editReply({ embeds: [embed] });
}
};

Usage notes

Rate limits and caching

  • No enforced rate limit today. Keep requests reasonable and cache on your side.
  • Cache lifetimes vary by endpoint: 30 seconds for live server data, 60 to 300 seconds for aggregates, 3600 seconds for reference data such as /games and /platforms.
  • Always read the Cache-Control header rather than assuming a TTL.

CORS

Requests are allowed from any origin. Every endpoint returns:

Access-Control-Allow-Origin: *

Data freshness

Master servers are re-polled every 30 to 60 seconds depending on the client, so player counts and maps track what the in-game browser shows. Clients queried over UDP update fastest; Plutonium is on the slower end.

Questions or feature requests? Ask in the HGMServers Discord.