Nodea — logo

Status Pages — API v1 i MCP | Dokumentacja Nodea

Moduł Status Pages obsługuje publiczne strony statusu: publiczny widok stanu wybranych monitorowanych stron WWW pod adresem /status/{slug}. API v1 zapewnia pełny CRUD nad definicjami stron statusu. Publiczny renderer (/status/{slug}) to osobna, nieuwierzytelniona trasa web i nie jest częścią tego API.

Uwierzytelnianie, zakresy i flaga

Bearer token Passport. Zakresy: monitoring:read (index, show), monitoring:write (create, update), monitoring:delete (delete). Moduł bramkowany flagą features:websites (strony statusu jadą na tej samej fladze co strony WWW).

Własność (ownership) — brak polityki

StatusPage nie ma klasy polityki. Dostęp jest wyłącznie właścicielski — każdy wiersz jest ograniczony do user_id = użytkownik tokenu. Cudzy albo nieznany identyfikator konsekwentnie zwraca 404 (nigdy nie potwierdza istnienia zasobu innego najemcy). Dodatkowo strony przypisane do strony statusu muszą być własnością użytkownika (pivot OWNER) — sam udział FOREIGN nie wystarcza, bo strona statusu eksponuje stronę WWW publicznie. Cudzy website_id → 422 (API rzuca błąd zamiast cicho pomijać).

API v1 — endpointy

MetodaŚcieżkaScopeOpis
GET/api/v1/status-pagesmonitoring:readLista stron statusu użytkownika (z licznikiem stron WWW), paginowana.
GET/api/v1/status-pages/{statusPage}monitoring:readSzczegóły z listą przypisanych stron WWW.
POST/api/v1/status-pagesmonitoring:writeUtworzenie strony statusu. Zwraca 201.
PUT/PATCH/api/v1/status-pages/{statusPage}monitoring:writeAktualizacja (częściowa) + sync stron WWW gdy podano selectedWebsiteIds.
DELETE/api/v1/status-pages/{statusPage}monitoring:deleteTrwałe usunięcie. Zwraca 204.

GET /status-pages — parametry zapytania

  • per_page (int 1–100, domyślnie 20), page.

POST/PATCH — parametry ciała

  • title (string, wymagany, max 120).
  • slug (string, wymagany, max 80, regex ^[a-z0-9-]+$, unikalny; przy update wyjątek dla własnego slug).
  • description (string, opcjonalny, max 1000).
  • accent_color (wymagany, regex ^#[0-9A-Fa-f]{6}$).
  • logo_url (url, opcjonalny, max 500).
  • is_public (boolean; przy częściowym PATCH pominięcie nie zmienia widoczności).
  • selectedWebsiteIds[] — identyfikatory stron WWW posiadanych przez użytkownika (pivot OWNER); kolejność listy = kolejność wyświetlania (display_order).

Kształt odpowiedzi (StatusPageResource)

Pola: id, slug, title, description, accent_color, logo_url, is_public, public_url (zawsze rozwiązywalny — prywatna strona po prostu 404 dla gości), website_ids[], websites[] ({id,name}, tylko gdy relacja załadowana), websites_count, created_at, updated_at.

Kody błędów

  • 401 — brak/niepoprawny token; 403 — brak scope lub nieaktywna flaga; 404 — nieznany lub cudzy identyfikator; 422 — walidacja (nieunikalny slug, zły kolor, cudzy/nieposiadany website_id).

Przykłady — API

Utworzenie strony statusu

curl -s -X POST https://app.nodea.io/api/v1/status-pages \
  -H "Authorization: Bearer $NODEA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Status usług",
    "slug": "status-uslug",
    "accent_color": "#50CD89",
    "is_public": true,
    "selectedWebsiteIds": ["9b1f...uuid", "7c22...uuid"]
  }'

Publikacja istniejącej strony (PATCH)

curl -s -X PATCH https://app.nodea.io/api/v1/status-pages/{id} \
  -H "Authorization: Bearer $NODEA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "title": "Status usług", "slug": "status-uslug", "accent_color": "#50CD89", "is_public": true }'

MCP — narzędzia

Ten sam model auth/scope co API v1 i flaga features:websites. Rozwiązywanie po id jest właścicielskie (brak polityki); brakujący i cudzy id zwracają ten sam błąd. W przeciwieństwie do web (który cicho pomija cudze id), narzędzia MCP odrzucają każdy website_id nienależący do użytkownika, więc sfałszowana lista nie wyeksponuje cudzej strony publicznie.

NarzędzieScopeTypOpis
status-pages-listmonitoring:readread-onlyLista stron statusu (najnowsze pierwsze); page, per_page (max 50).
status-page-getmonitoring:readread-onlySzczegóły z uporządkowaną listą stron WWW. Param: id.
status-page-createmonitoring:writezapistitle, slug, description, accent_color (domyślnie #50CD89), logo_url, is_public (domyślnie false), website_ids[] (tylko posiadane).
status-page-updatemonitoring:writeidempotentneAktualizacja częściowa; website_ids[] zastępuje całą listę (tylko posiadane).
status-page-deletemonitoring:deletedestrukcyjneTrwałe usunięcie; wymaga confirm: true.

Wynik (status-page-*): id, slug, title, description, accent_color, logo_url, is_public, public_url, websites_count (gdy policzone), websites[] ({id,name,url,display_order,visible}, gdy załadowane), created_at, updated_at.

Przykład — MCP (JSON-RPC)

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "status-page-create",
    "arguments": {
      "title": "Status usług",
      "slug": "status-uslug",
      "is_public": true,
      "website_ids": ["9b1f...uuid", "7c22...uuid"]
    }
  }
}
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "status-page-delete",
    "arguments": { "id": "5d40...uuid", "confirm": true }
  }
}