СПРАВКА ДЛЯ ИНТЕГРАЦИЙ
API карты тревог
Сообщения и точки на карте
/api/alerts?hours=24&limit=500&include_cancelled=trueВозвращает ленту сообщений за период. hours: от 1 до 168, по умолчанию 24; limit: от 1 до 2000, по умолчанию 500. Укажите include_cancelled=false, чтобы исключить зелёные сообщения об отбое.
{
"generated_at": "2026-09-20T10:00:00+00:00",
"hours": 24,
"count": 1,
"items": [{
"channel_username": "kupolrussia",
"post_id": 123,
"message_url": "https://t.me/...",
"published_at": "2026-09-20T09:50:00+00:00",
"text": "…",
"alert_level": "red",
"threat_type": "uav",
"locations": [{"name": "…", "latitude": 50.6, "longitude": 36.6, "method": "settlement_catalog"}]
}],
"inferred_tracks": []
}
Уровни: red — под атакой, yellow — опасность, green — отбой. Тип угрозы: uav или missile. Координаты — сопоставление названия в тексте со справочником, а не подтверждение события; запись без надёжной точки остаётся в items.
Актуальный режим и live-обновления
/api/alerts/bootstrap?hours=24Возвращает snapshot с тем же форматом, что и /api/alerts, и числовой cursor. Сначала получите этот снимок, затем подключитесь к потоку:
/api/alerts/stream?since=<cursor>const initial = await fetch("/api/alerts/bootstrap?hours=24").then((r) => r.json());
const stream = new EventSource(`/api/alerts/stream?since=${initial.cursor}`);
Поток использует text/event-stream. Обычное событие содержит event_id, время и изменённое сообщение; комментарий : heartbeat поддерживает соединение. Событие gap означает, что курсор слишком стар: получите новый bootstrap.
Статистика
/api/alerts/stats?days=7days — от 2 до 31, по умолчанию 7. Ответ содержит текущие суммы по уровню и типу угрозы, дневной и почасовой ряды, состояние outbox/Valkey и доступные сведения о runtime. Счётчик аудитории — приблизительная оценка активных вкладок, не уникальных людей.
Качество и обратная связь
/api/alerts/quality-history?channel_username=kupolrussia&post_id=123Показывает до 20 последних автоматических проверок одной публикации. Необязательный before — курсор для следующей страницы.
/api/alerts/feedbackПринимает замечание о неверной локации. Не передавайте персональные данные, токены или другие секреты.
{
"channel_username": "kupolrussia",
"post_id": 123,
"reason": "incorrect_location",
"snapshot": {"reported_location": {"name": "…"}}
}
Успешный ответ: {"id": 1, "status": "pending", "submitted_at": "…"}. Снимок сохраняется вместе с замечанием, поэтому публикацию можно проверить в исходном контексте.
Статусы аэропортов
/api/airport-statusПолный список аэропортов из локального каталога с текущим operational_status. Каждый аэропорт присутствует, даже если для него ещё нет публикации: в этом случае статус open с источником default_open.
/api/airport-status/closedТолько аэропорты со статусом closed.
/api/airport-status?icao=UUDD,UUWWВыборка по одному или нескольким ICAO. Допустимы запятая, пробел или повторяющийся параметр icao=UUDD&icao=UUWW; максимум 100 кодов. Неизвестные коды возвращаются отдельно в not_found_icao, не скрывая найденные аэропорты.
/api/airport-mapКартографический вариант того же каталога с координатами. У каждого элемента есть ICAO/IATA, название и operational_status со значением open, restricted или closed. Этот статус не следует выводить из тревожных сообщений.
Для ИИ-агентов
Этот prompt можно передать агенту вместе с базовым URL текущего сайта. Он предписывает опираться на поля API, не выдавать оценки за подтверждённые факты и не подменять официальные каналы.
Ты работаешь с публичным API карты тревог. Это справочная лента
открытых публикаций, а не официальное оповещение и не подтверждение события.
1. Для актуального состояния вызови GET /api/alerts/bootstrap?hours=24.
Используй snapshot.items, сохрани cursor.
2. Для обновлений подключись к GET /api/alerts/stream?since=<cursor>.
При событии gap получи новый bootstrap; не пытайся восстановить пропуск
из догадок.
3. Передавай alert_level буквально: red = «под атакой», yellow = «опасность»,
green = «отбой». Не повышай и не понижай уровень самостоятельно.
4. Показывай место только если у записи есть latitude и longitude. Поля
locations и inferred_tracks — ориентиры из текста, не телеметрия.
Не называй inferred_tracks подтверждённой траекторией.
5. Для ответа о публикации сохраняй channel_username, published_at и
message_url. Различай исходные источники и объединённые репосты.
6. При неопределённости, отсутствии данных или HTTP 429/5xx прямо сообщи
об этом. Не выдумывай координаты, время, тип угрозы или отмену.
7. Не отправляй персональные данные, токены или секреты в feedback. Для
замечания об ошибочной локации используй POST /api/alerts/feedback.
8. Не используй API для инструкций по безопасности в реальном времени;
направляй пользователя к официальным экстренным и местным каналам.
Кэширование и ограничения
- При частых опросах учитывайте HTTP
429и повторяйте запрос с паузой. - Для live-интерфейса используйте
bootstrapи SSE, а не частый polling. - Обрабатывайте отсутствие координат, неизвестный уровень и временную недоступность хранилища.
- Не интерпретируйте количество сообщений, точек или репостов как количество объектов либо подтверждённые данные об угрозе.