status, а для общего списка — также complete.
Отсутствующий или устаревший отчёт сам по себе не вызывает HTTP-ошибку: API может вернуть HTTP
200, а состояние конкретного сервера передать в JSON.Что входит в счётчики
Сервис считает сообщения в настроенных основных общих каналах Discord. Учитываются все авторы, включая ботов, без фильтра по ролям. API публикует счётчики, названия и идентификаторы серверов и каналов; тексты сообщений и данные авторов не возвращаются. Удалённые, недоступные и ещё не проиндексированные Discord сообщения не учитываются. После переиндексации счётчики могут измениться. Поэтому значение отражает сохранённый отчёт, а не поток событий в реальном времени.Два формата ответа
Объект сервера имеет одинаковую схему в обоих форматах и для всех периодов. В общем списке серверы идут в порядке номеров; сортировка рейтинга на сайте этот порядок не меняет.
Общие метаданные
Подробные примеры календарных границ приведены на странице «Периоды и даты».
Один сервер
Условный пример месячного ответа без собранного отчёта. Название, идентификатор и значения приведены для иллюстрации схемы:Общий список
В дополнение к метаданным периода общий ответ содержит:
Например, если один сервер имеет
status: "ok" и 1 200 сообщений, а другой — status: "stale" и 800 сообщений, общий итог составит 1 200, readyServers — 1, а complete — false. Это условный пример, показывающий правило агрегации.
Объект Server
error описывает ошибку отчёта внутри успешного ответа. Это поле следует читать вместе со status. Не рассчитывайте на закрытый перечень кодов ошибок сбора: такой перечень в контракте API не задан.
Объект Channel
Условный пример одного канала:
channels описывает учтённые каналы, а не полный список каналов Discord-сервера. Пустой массив при отсутствии отчёта не доказывает, что на сервере нет каналов или сообщений.
Статусы отчёта
При обработке ответа сначала проверьте HTTP-статус, затем
server.status или статусы элементов servers. Одной проверки response.ok недостаточно для вывода о полноте статистики.
null и ноль
totalMessages: 0 — числовое значение счётчика. totalMessages: null — пригодного отчёта нет. Эти состояния нельзя объединять: подмена null нулём создаст ложное падение активности и исказит сравнение серверов.
Пример отображения
- Нет хотя бы одного дневного отчёта сервера —
totalMessages: null; частичная сумма не выдаётся за весь период. - Все дни есть, но хотя бы один отчёт устарел — сумма сохраняется со статусом
stale. generatedAtсоставного периода — самое раннее время формирования входящих отчётов.
Свежесть данных
Смотрите наstatus и generatedAt вместе. generatedAt обозначает время формирования отчёта, а не время последнего сообщения или последнего обращения к API. Для архивных дневных снимков старая дата формирования сама по себе не означает неисправность: API сохраняет завершённые дни.
refreshMinutes задаёт паузу между проходами сборщика. Сам сбор также занимает время, а серверы могут иметь разные generatedAt. Вызов API не запускает немедленное обновление статистики.
Не выводите одинаковое время обновления для всего списка на основании одного сервера. Время формирования принадлежит конкретному отчёту.
Иконки и баннеры
ПоляiconUrl и bannerUrl содержат текущие метаданные сервера, даже при запросе архивного периода или при отсутствии отчёта. Это не исторические изображения на дату статистики.
Для получения изображений без статистики используйте
GET /api/discord-icons. Метод возвращает JSON со ссылками на Discord CDN. У объектов в этом ответе есть только поля number, name, guildId, iconUrl и bannerUrl; счётчики и статусы отчётов не требуются.
Иконка и баннер обновляются сборщиком вместе. В старых метаданных без баннера bannerUrl остаётся null до обновления. Если метаданные недоступны или повреждены, метод иконок может ответить HTTP 200 с iconUrl: null; сам HTTP-запрос не запускает обновление из Discord.