API портала обновлений
Портал обновлений предоставляет небольшой публичный JSON API, с помощью которого вы можете опрашивать статус, загружать записи changelog, отслеживать roadmap и проверять известные проблемы из ваших собственных систем. Аутентификация не требуется. API возвращает текст только на английском языке; языковой префикс в пути игнорируется.
Base URL
https://updates.foura.ai
Статус сервисов
GET /api/v1/status
Возвращает текущий рабочий статус каждого сервиса FourA, а также активные и недавние инциденты. Кэшируется на стороне сервера на 15 секунд, поэтому более частый polling возвращает тот же результат.
curl https://updates.foura.ai/api/v1/status
{
"overall": "operational",
"services": [
{
"slug": "api",
"name": "API",
"description": "...",
"status": "operational",
"daily": [
{ "date": "2026-05-19", "status": "operational", "major_outage_minutes": 0, "partial_outage_minutes": 0, "degraded_minutes": 0, "internal_degraded_minutes": 0 }
]
}
],
"active_incidents": [],
"recent_incidents": [
{ "id": "...", "service_slug": "api", "service_name": "API", "impact": "minor", "started_at": "...", "resolved_at": "..." }
]
}
| Поле верхнего уровня | Тип | Описание |
|---|---|---|
overall |
string | operational, если все сервисы работают нормально, иначе одно из значений статуса сервиса |
services |
array | По одной записи на каждый отслеживаемый сервис с slug, name, description, текущим status и историей daily (до 90 дней) |
active_incidents |
array | Инциденты, открытые в данный момент |
recent_incidents |
array | Устраненные инциденты за последние 14 дней |
Значения status сервиса: operational, degraded, partial_outage, major_outage, maintenance.
Значения impact инцидента: minor (снижение производительности), major (частичный сбой), critical (сбой сервиса).
Паттерн опроса
Используйте этот endpoint для интеграции статуса FourA в собственный дашборд или систему оповещений.
Если данные о статусе не удается получить, endpoint возвращает 502 с {"error": "Monitor unreachable"}. Считайте это неизвестным статусом, а не критической ошибкой, и повторите попытку при следующем опросе.
import requests
def check_foura():
r = requests.get("https://updates.foura.ai/api/v1/status", timeout=5)
r.raise_for_status() # raises on the 502 "Monitor unreachable" answer: retry next poll
data = r.json()
if data["overall"] != "operational":
# Page on-call, post to Slack, flip a feature flag, etc.
for svc in data["services"]:
if svc["status"] != "operational":
print(f"{svc['name']}: {svc['status']}")
return data
Устаревший GET /api/status возвращает 410 Gone и перенаправляет клиентов сюда.
Changelog
GET /api/changelog
Возвращает опубликованные записи changelog в обратном хронологическом порядке.
curl "https://updates.foura.ai/api/changelog?limit=20"
Параметры запроса:
| Parameter | Type | Default | Description |
|---|---|---|---|
page |
integer | 1 | Номер страницы (индексация с 1) |
limit |
integer | 20 | Количество записей на страницу (максимум 50) |
category |
string | - | Фильтрация по new, improved или fixed |
{
"entries": [
{
"id": 42,
"title": "...",
"body": "Markdown body",
"category": "new",
"tags": "[\"api\",\"dashboard\"]",
"published": 1,
"published_at": "2026-05-19T12:00:00Z",
"created_at": "2026-05-19 11:42:08",
"updated_at": "2026-05-19 11:44:31"
}
],
"total": 137,
"page": 1,
"limit": 20
}
| Поле | Тип | Описание |
|---|---|---|
id |
integer | ID записи |
title |
string | Заголовок записи |
body |
string | Тело в формате Markdown |
category |
string | new, improved или fixed |
tags |
string | Массив JSON, закодированный как строка. Распарсите его перед использованием: json.loads(entry["tags"]). |
published |
integer | Здесь всегда 1. Этот endpoint возвращает только опубликованные записи. |
published_at |
string | ISO 8601 с суффиксом Z |
created_at |
string | YYYY-MM-DD HH:MM:SS, UTC, без маркера часового пояса |
updated_at |
string | Тот же формат, что и у created_at |
Два формата меток времени различаются намеренно: published_at представляет собой дату публикации и содержит часовой пояс, тогда как created_at и updated_at являются метками времени хранения. Оба находятся в UTC. Парсер, ожидающий единый формат для всех трех, завершится с ошибкой на двух других.
RSS
Полный список изменений (30 последних записей) также публикуется в виде RSS по адресу:
https://updates.foura.ai/rss
Поддерживается подписка через Feedly, Miniflux, Thunderbird или любой другой ридер. Содержимое фида совпадает с текстом changelog, включая Markdown, преобразованный в HTML.
Roadmap
GET /api/roadmap
Возвращает все опубликованные элементы roadmap, отсортированные по количеству голосов, затем по времени создания.
curl https://updates.foura.ai/api/roadmap
{
"items": [
{
"id": 12,
"title": "...",
"description": "...",
"status": "planned",
"category": "developer-experience",
"votes": 23,
"target_date": "Q3 2026",
"completed_at": null,
"created_at": "2026-03-30 09:32:47"
}
]
}
Значения status элемента: planned, in_progress, done, cancelled. Доска на updates.foura.ai/roadmap отображает три колонки, поэтому элемент со значением cancelled передается через этот endpoint и не появляется на странице.
category представляет собой slug в нижнем регистре, а не отображаемую на странице метку. Используемые сейчас slugs: api, infrastructure, developer-experience, dashboard, billing, analytics, authentication. Список может расширяться, так как новый элемент может содержать новый slug.
target_date содержит произвольный текст ("Q3 2026"), а не дату. Поле completed_at имеет значение null до момента релиза элемента, затем ISO 8601 с суффиксом Z (2026-09-01T10:15:30.000Z), аналогично формату published_at в записи changelog. В created_at используется формат YYYY-MM-DD HH:MM:SS в UTC. Эти два формата различаются внутри одного объекта, поэтому парсите каждое поле отдельно.
Голосование
POST /api/roadmap/:id/vote
Переключает голос за отдельный элемент roadmap. Голоса анонимны и привязаны к IP вызывающей стороны, а также к первым 50 символам ее User-Agent. Повторный вызов удаляет голос. Для неизвестного или неопубликованного элемента возвращается 404 {"error": "Not found"}.
curl -X POST https://updates.foura.ai/api/roadmap/12/vote
{ "votes": 24, "voted": true }
voted сообщает состояние после вызова: true, если ваш голос был добавлен, false, если он был удален.
Endpoints дорожной карты, GET /api/roadmap и этот, ограничены 30 requests в минуту на исходный IP. При превышении возвращается {"error": "Too many votes, slow down"}.
Known Issues
GET /api/issues
Возвращает проблемы, отслеживаемые службой поддержки FourA.
curl "https://updates.foura.ai/api/issues?tab=open"
Параметры запроса:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
tab |
string | open |
open для активных проблем, resolved для решенных/закрытых |
{
"issues": [
{
"id": 5,
"title": "...",
"body": "Markdown description",
"severity": "medium",
"status": "investigating",
"service_id": 3,
"resolution": "",
"opened_at": "2026-05-18T09:00:00Z",
"resolved_at": null,
"service_name": "API"
}
]
}
| Поле | Тип | Описание |
|---|---|---|
id |
integer | ID инцидента |
title |
string | Краткая сводка |
body |
string | Описание в формате Markdown |
severity |
string | low, medium, high или critical |
status |
string | open, investigating, resolved или closed |
service_id |
integer or null | Числовой ID затронутого сервиса. null, если проблема не связана с конкретным сервисом. |
service_name |
string or null | Отображаемое имя сервиса, полученное автоматически. Используйте его вместо самостоятельного сопоставления service_id. |
resolution |
string | Способ исправления. Пустая строка, пока инцидент открыт. |
opened_at |
string | ISO 8601 с суффиксом Z |
resolved_at |
string or null | ISO 8601 с суффиксом Z, null пока открыт |
service_id является числовым внешним ключом, а не слагом со страницы статуса. Сопоставляйте инциденты с сервисами по service_name.
Payload инцидента содержит фиксированный список полей и не включает метку времени изменения. Сортируйте или определяйте возраст инцидента по opened_at и resolved_at. Из трех публичных коллекций только записи changelog возвращают created_at и updated_at.
Вкладка resolved возвращает 30 последних решенных инцидентов и ограничивается этим. Вкладка open возвращает их все.
Примечания
- Все endpoints публичны и не требуют API key. Для endpoint дорожной карты действует ограничение в 30 requests в минуту на исходный IP; у остальных на данный момент нет собственного rate limit, поэтому опрашивайте статус не чаще, чем позволяет его 15-секундный кэш.
- Ответы возвращаются в формате JSON по HTTPS. Roadmap и issues не принимают параметров пагинации. Единственное ограничение это
?tab=resolvedдля инцидентов, возвращающее 30 строк. - Для получения changelog в виде обычного текста или чистого HTML используйте ленту
/rssвместо/api/changelog.
См. также
- Service Status: Просмотр тех же данных в браузере
- Changelog: Просмотр записей с фильтрами и пагинацией
- Roadmap: Голосование за предложения в UI
- Known Issues: Просмотр открытых и решенных инцидентов
- Updates Portal: Обзор раздела