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=resolved dla problemów, który zwraca 30 wierszy.
  • W przypadku wersji changelogu w postaci czystego tekstu lub surowego HTML użyj kanału /rss zamiast /api/changelog.

Powiązane

Aktualizacja: 10 września 2026