API MonWave
Открытые данные мониторинга в JSON: игры, серверы, статистика и виджеты для сайтов. Без регистрации и без ключа. Владельцам серверов — отдельное API с личным ключом: голоса игроков и награда за голос.
Адрес API
https://monwave.ru/api/v1
Старая форма адреса https://monwave.ru/api?endpoint=servers&game=cs2 тоже работает.
Методы
| Метод | Что отдаёт |
|---|---|
GET /games | Все игры: slug, названия, число серверов, ссылка на раздел |
GET /servers?game=cs2 | Серверы игры по рейтингу. page — страница, limit — сколько на странице (1–100, по умолчанию 25). Поля: id, name, address, players, max_players, map, country, rating, url. Недоступные сейчас серверы тоже в списке — в конце |
GET /servers/{id} | Один сервер: то же плюс средний онлайн, доля ответов на опросы (uptime, %), дата добавления и last_offline — с какого момента сервер недоступен (null — сервер онлайн) |
GET /servers/lookup?address=203.0.113.10:27015 | Тот же ответ, но по адресу сервера (IP или домен с портом) — если не знаете номер сервера на monwave |
GET /stats | Всего серверов, игр и игроков онлайн. С ?game=cs2 — по одной игре: серверы, игроки, среднее число игроков на сервере и наибольший онлайн одного сервера — сейчас |
GET /widget/{id} | Картинка-виджет сервера (SVG). theme=light — светлая, format=html — HTML-версия для iframe. Вместо номера можно адрес: /widget?ip=203.0.113.10:27015 |
Серверы из чёрного списка в ответы и виджеты не попадают.
Пример ответа
GET /api/v1/servers?game=cs2&limit=1
{"data": [{"id": 12345, "name": "Мой сервер", "address": "203.0.113.10:27015", "game": "cs2",
"players": 18, "max_players": 32, "map": "de_mirage", "country": "RU", "rating": 54,
"url": "https://monwave.ru/cs2/servers/203.0.113.10:27015"}],
"meta": {"game": "cs2", "page": 1, "limit": 1, "total": 862, "pages": 862}}Нужно больше: запросы с параметрами по каждому методу — в конструкторе запросов.
Примеры
const res = await fetch("https://monwave.ru/api/v1/servers?game=cs2&limit=25");
if (!res.ok) throw new Error(`monwave: ${res.status}`); // 429/503 — повторить позже
const json = await res.json();
console.log(`Серверов: ${json.meta.total}`);
json.data.forEach(s => console.log(`${s.name} — ${s.players}/${s.max_players}`));import requests
r = requests.get("https://monwave.ru/api/v1/servers",
params={"game": "cs2", "limit": 25}, timeout=10)
r.raise_for_status() # 429/503 — повторите через r.headers["Retry-After"] секунд
data = r.json()
print("Серверов:", data["meta"]["total"])
for s in data["data"]:
print(s["name"], "—", s["players"], "/", s["max_players"])<?php
$data = json_decode(file_get_contents('https://monwave.ru/api/v1/servers?game=cs2&limit=25'), true);
echo 'Серверов: ' . $data['meta']['total'] . "\n";
foreach ($data['data'] as $s) {
echo $s['name'] . ' — ' . $s['players'] . '/' . $s['max_players'] . "\n";
}Виджет сервера для сайта
Онлайн, карта и статус сервера — картинкой или блоком. Вместо 12345 — номер сервера: он есть в ответах /servers и /servers/lookup и на странице сервера в блоке виджета.
<a href="https://monwave.ru" target="_blank"><img src="https://monwave.ru/api/widget/12345" width="320" height="120" alt="MonWave"></a>
<iframe src="https://monwave.ru/api/widget/12345?format=html&theme=light" width="340" height="140" frameborder="0"></iframe>
Лимиты и ошибки
Частота. Не больше 10 запросов в секунду с одного IP, короткий всплеск — до 20. Больше — ответ 429 с заголовком
Retry-After.Кэш. Данные меняются раз в 10–15 минут: кэшируйте ответы у себя хотя бы на минуту и не опрашивайте чаще.
| Код | Что значит |
|---|---|
| 200 | Всё хорошо |
| 400 | Не хватает параметра — например, game у /servers |
| 404 | Нет такого метода, игры или сервера |
| 405 | Публичные методы — только GET |
| 429 | Слишком часто — подождите столько секунд, сколько в заголовке Retry-After |
| 503 | Сайт под высокой нагрузкой — повторите позже (Retry-After, обычно 30 секунд) |
API для владельцев серверов
Личный ключ сервера выдаётся только его подтверждённому владельцу
- Голосовал ли игрок за сутки — и «забрать голос», чтобы выдать награду ровно один раз
- Новые голоса по порядку — для Discord-бота или сайта сервера
- Данные своего сервера и счётчики голосов