СПРАВКА ДЛЯ ИНТЕГРАЦИЙ

API карты тревог

К карте Статистика Изменения
Публичный API. Запросы выполняются к тому же домену, на котором открыта эта страница. Авторизация не требуется; ответы — JSON в UTF-8, кроме live-потока SSE. Это справочная лента по открытым публикациям, а не официальное оповещение.

Сообщения и точки на карте

GET/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-обновления

GET/api/alerts/bootstrap?hours=24

Возвращает snapshot с тем же форматом, что и /api/alerts, и числовой cursor. Сначала получите этот снимок, затем подключитесь к потоку:

GET/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.

Статистика

GET/api/alerts/stats?days=7

days — от 2 до 31, по умолчанию 7. Ответ содержит текущие суммы по уровню и типу угрозы, дневной и почасовой ряды, состояние outbox/Valkey и доступные сведения о runtime. Счётчик аудитории — приблизительная оценка активных вкладок, не уникальных людей.

Качество и обратная связь

GET/api/alerts/quality-history?channel_username=kupolrussia&post_id=123

Показывает до 20 последних автоматических проверок одной публикации. Необязательный before — курсор для следующей страницы.

POST/api/alerts/feedback

Принимает замечание о неверной локации. Не передавайте персональные данные, токены или другие секреты.

{
  "channel_username": "kupolrussia",
  "post_id": 123,
  "reason": "incorrect_location",
  "snapshot": {"reported_location": {"name": "…"}}
}

Успешный ответ: {"id": 1, "status": "pending", "submitted_at": "…"}. Снимок сохраняется вместе с замечанием, поэтому публикацию можно проверить в исходном контексте.

Статусы аэропортов

GET/api/airport-status

Полный список аэропортов из локального каталога с текущим operational_status. Каждый аэропорт присутствует, даже если для него ещё нет публикации: в этом случае статус open с источником default_open.

GET/api/airport-status/closed

Только аэропорты со статусом closed.

GET/api/airport-status?icao=UUDD,UUWW

Выборка по одному или нескольким ICAO. Допустимы запятая, пробел или повторяющийся параметр icao=UUDD&icao=UUWW; максимум 100 кодов. Неизвестные коды возвращаются отдельно в not_found_icao, не скрывая найденные аэропорты.

GET/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.
  • Обрабатывайте отсутствие координат, неизвестный уровень и временную недоступность хранилища.
  • Не интерпретируйте количество сообщений, точек или репостов как количество объектов либо подтверждённые данные об угрозе.