API portalu aktualizacji
Portal Updates udostępnia małe, publiczne API JSON, które umożliwia sprawdzanie statusu, pobieranie wpisów changelog, śledzenie roadmapy i weryfikację znanych problemów bezpośrednio z Twoich systemów. Uwierzytelnianie nie jest wymagane. API zwraca wyłącznie tekst w języku angielskim; prefiks języka w ścieżce jest ignorowany.
Base URL
https://updates.foura.ai
Status usługi
GET /api/v1/status
Zwraca aktualny status operacyjny każdej usługi FourA oraz aktywne i niedawne incydenty. Odpowiedź jest buforowana po stronie serwera przez 15 sekund, więc częstsze odpytywanie zwraca ten sam payload.
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": "..." }
]
}
| Pole najwyższego poziomu | Typ | Opis |
|---|---|---|
overall |
string | operational, jeśli każda usługa działa prawidłowo, w przeciwnym razie jedna z wartości statusu usługi |
services |
array | Jeden wpis na monitorowaną usługę z polami slug, name, description, bieżącym status oraz historią daily (do 90 dni) |
active_incidents |
array | Aktualnie otwarte incydenty |
recent_incidents |
array | Rozwiązane incydenty z ostatnich 14 dni |
Wartości pola status dla usługi: operational, degraded, partial_outage, major_outage, maintenance.
Wartości pola impact dla incydentu: minor (obniżona wydajność), major (częściowa awaria), critical (awaria usługi).
Wzorzec odpytywania (polling)
Użyj tego endpointu, aby zintegrować status FourA z własnym panelem lub systemem powiadomień.
Gdy nie można pobrać danych o statusie, endpoint zwraca kod 502 z treścią {"error": "Monitor unreachable"}. Potraktuj to jako status nieznany, a nie błąd krytyczny, i ponów próbę przy kolejnym odpytaniu.
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
Starszy endpoint GET /api/status zwraca 410 Gone i przekierowuje wywołujących tutaj.
Changelog
GET /api/changelog
Zwraca opublikowane wpisy w changelogu w odwrotnej kolejności chronologicznej.
curl "https://updates.foura.ai/api/changelog?limit=20"
Parametry zapytania:
| Parametr | Typ | Wartość domyślna | Opis |
|---|---|---|---|
page |
integer | 1 | Numer strony indeksowany od 1 |
limit |
integer | 20 | Liczba wpisów na stronę (maks. 50) |
category |
string | - | Filtruj do new, improved lub 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
}
| Pole | Typ | Opis |
|---|---|---|
id |
integer | ID wpisu |
title |
string | Tytuł wpisu |
body |
string | Treść Markdown |
category |
string | new, improved lub fixed |
tags |
string | Tablica JSON zakodowana jako string. Sparsuj ją przed użyciem: json.loads(entry["tags"]). |
published |
integer | Tutaj zawsze 1. Endpoint zwraca tylko opublikowane wpisy. |
published_at |
string | ISO 8601 z sufiksem Z |
created_at |
string | YYYY-MM-DD HH:MM:SS, UTC, bez oznaczenia strefy |
updated_at |
string | Taki sam format jak created_at |
Dwa formaty znaczników czasu różnią się celowo: published_at to data redakcyjna zawierająca strefę, natomiast created_at i updated_at to znaczniki czasu zapisu. Oba są w formacie UTC. Parser zakładający jeden format dla wszystkich trzech zgłosi błąd przy pozostałych dwóch.
RSS
Pełny changelog (30 najnowszych wpisów) jest publikowany również jako kanał RSS pod adresem:
https://updates.foura.ai/rss
Subskrybuj w Feedly, Miniflux, Thunderbird lub dowolnym czytniku. Treść feedu odpowiada treści changeloga, łącznie z markdownem wyrenderowanym do HTML.
Roadmap
GET /api/roadmap
Zwraca każdy opublikowany element roadmapy, posortowany według liczby głosów, a następnie czasu utworzenia.
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"
}
]
}
Wartości status elementu: planned, in_progress, done, cancelled. Tablica pod adresem updates.foura.ai/roadmap renderuje trzy kolumny, więc element z wartością cancelled trafi do Ciebie przez ten endpoint i nigdy nie pojawi się na stronie.
category to slug pisany małymi literami, a nie etykieta wyświetlana na stronie. Obecnie używane slugi: api, infrastructure, developer-experience, dashboard, billing, analytics, authentication. Traktuj tę listę jako otwartą, ponieważ nowy element może wprowadzić kolejną wartość.
target_date to dowolny tekst ("Q3 2026"), a nie data. completed_at ma wartość null do momentu wdrożenia elementu, a następnie format ISO 8601 z sufiksem Z (2026-09-01T10:15:30.000Z), taki sam jak pole published_at we wpisie changeloga. Pole created_at używa formatu YYYY-MM-DD HH:MM:SS w strefie UTC. Te dwa formaty różnią się w ramach jednego obiektu, dlatego należy parsować każde pole osobno.
Głosowanie
POST /api/roadmap/:id/vote
Przełącza głos na pojedynczym elemencie roadmapy. Głosy są anonimowe i powiązane z adresem IP wywołującego oraz pierwszymi 50 znakami jego nagłówka User-Agent. Ponowne wywołanie usuwa głos. Nieznany lub nieopublikowany element zwraca kod 404 {"error": "Not found"}.
curl -X POST https://updates.foura.ai/api/roadmap/12/vote
{ "votes": 24, "voted": true }
voted zwraca stan po wywołaniu: true, jeśli Twój głos został dodany, false, jeśli został usunięty.
Endpointy roadmapy, GET /api/roadmap oraz ten, mają limit 30 requestów na minutę na źródłowy adres IP. Po jego przekroczeniu zwracana jest odpowiedź {"error": "Too many votes, slow down"}.
Known Issues
GET /api/issues
Zwraca zgłoszenia śledzone przez support FourA.
curl "https://updates.foura.ai/api/issues?tab=open"
Parametry zapytania:
| Parametr | Typ | Domyślnie | Opis |
|---|---|---|---|
tab |
string | open |
open dla aktywnych problemów, resolved dla rozwiązanych/zamkniętych |
{
"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"
}
]
}
| Pole | Typ | Opis |
|---|---|---|
id |
integer | ID problemu |
title |
string | Krótkie podsumowanie |
body |
string | Opis w formacie Markdown |
severity |
string | low, medium, high lub critical |
status |
string | open, investigating, resolved lub closed |
service_id |
integer or null | Numeryczny identyfikator usługi, której dotyczy problem. null, gdy problem nie jest powiązany z żadną usługą. |
service_name |
string or null | Nazwa wyświetlana usługi, rozwiązana automatycznie. Odczytaj tę wartość zamiast samodzielnie mapować service_id. |
resolution |
string | Sposób rozwiązania. Pusty ciąg znaków, dopóki problem pozostaje otwarty. |
opened_at |
string | Format ISO 8601 z sufiksem Z |
resolved_at |
string or null | Format ISO 8601 z sufiksem Z, null dopóki problem pozostaje otwarty |
service_id to numeryczny klucz obcy, a nie slug widoczny na stronie statusu. Dopasowuj problemy do usług według pola service_name.
Payload problemu ma stałą listę kolumn i nie zawiera znacznika czasu modyfikacji. Sortuj lub określaj wiek problemu według opened_at i resolved_at. Z trzech publicznych kolekcji tylko wpisy changelogu zwracają created_at i updated_at.
Karta resolved zwraca 30 ostatnio rozwiązanych problemów i na tym kończy. Karta open zwraca je wszystkie.
Uwagi
- Wszystkie endpointy są publiczne i nie wymagają klucza API. Endpointy roadmapy są ograniczone do 30 żądań na minutę na źródłowy adres IP; pozostałe nie mają obecnie własnego rate limitu, więc odpytuj o status nie częściej, niż uzasadnia to 15-sekundowy cache.
- Odpowiedzi są zwracane w formacie JSON przez HTTPS. Roadmapa i problemy nie przyjmują parametrów stronicowania. Jedynym limitem jest
?tab=resolveddla problemów, który zwraca 30 wierszy. - W przypadku wersji changelogu w postaci czystego tekstu lub surowego HTML użyj kanału
/rsszamiast/api/changelog.
Powiązane
- Status usługi: Przeglądaj te same dane w przeglądarce
- Changelog: Przeglądaj wpisy z filtrami i paginacją
- Roadmapa: Głosuj na elementy w interfejsie
- Znane problemy: Przeglądaj otwarte i rozwiązane problemy
- Portal aktualizacji: Przegląd sekcji