СПРАВКА ДЛЯ ИНТЕГРАЦИЙ
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 (ракета) или balloon (МВШ, воздушные шары). Координаты сопоставляются с названиями из текста по справочнику и сами по себе не подтверждают событие. Записи без надёжной точки всё равно остаются в 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=7Параметр days задаёт период от 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": "…"}}
}
При успехе API вернёт {"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 для инструкций по безопасности в реальном времени;
направляй пользователя к официальным экстренным и местным каналам.
Кэширование и ограничения
- Если часто опрашиваете API, учитывайте HTTP
429и делайте паузу перед повторным запросом. - Для live-обновлений используйте
bootstrapи SSE вместо частых запросов. - Координат может не быть, уровень может оказаться неизвестным, хранилище может временно не отвечать.
- Количество сообщений, точек и репостов не равно числу объектов и не подтверждает угрозу.