Nodea — logo

Websites — API v1 i MCP | Dokumentacja Nodea

Moduł Websites obejmuje pełną obsługę monitorowanych stron WWW: listowanie, tworzenie, edycję, usuwanie oraz akcje operacyjne (run now, pauza, wznowienie, wyciszenie, klonowanie), a także historię uruchomień testów, statystyki uptime i okna serwisowe. Dokument opisuje warstwę REST API v1 (/api/v1) oraz narzędzia MCP z tego modułu.

Uwierzytelnianie i zakresy (scopes)

API v1 uwierzytelnia się tokenem osobistym Passport przez nagłówek Authorization: Bearer <token>. Każda trasa jest chroniona zakresem odpowiadającym poziomowi operacji:

  • monitoring:read — listowanie i podgląd (index, show, runs, uptime, maintenance-windows).
  • monitoring:write — tworzenie, edycja oraz akcje niedestrukcyjne (run, pause, resume, mute, clone, tworzenie/usuwanie okna serwisowego).
  • monitoring:delete — trwałe usunięcie strony.

Cały moduł jest dodatkowo bramkowany flagą Pennant features:websites — wyłączenie modułu ukrywa go zarówno w web UI, jak i w API. Limit zapytań: throttle:api-v1 = 240/min na użytkownika tokenu.

Własność i widoczność (ownership)

Dostęp na poziomie wiersza wymusza WebsitePolicy: view = właściciel lub zaakceptowany udział FOREIGN (współdzielenie), manage = wyłącznie właściciel. Istniejący, ale niewidoczny dla tokenu identyfikator zwraca 403 (polityka), nieznany identyfikator — 404 (route model binding). Akcja run jest wyjątkiem: dostępna dla view (właściciel ORAZ zaakceptowany udział mogą wywołać ponowne sprawdzenie); pozostałe akcje stanu (pause/resume/mute/clone) wymagają manage. Parametry testów (parameters) są maskowane — hasła basic-auth, nagłówki uwierzytelniające i surowe body POST nigdy nie wracają w czystej postaci (schemat ****+ostatnie 4 znaki), więc nawet zaakceptowany udział nie zobaczy poświadczeń właściciela.

API v1 — endpointy

MetodaŚcieżkaScopeOpis
GET/api/v1/websitesmonitoring:readLista stron (własne + zaakceptowane udziały), paginowana.
GET/api/v1/websites/{website}monitoring:readSzczegóły strony wraz z testami; meta.can_manage.
GET/api/v1/websites/{website}/runsmonitoring:readHistoria uruchomień testów (TestRun), najnowsze pierwsze.
GET/api/v1/websites/{website}/uptimemonitoring:readMiesięczne agregaty uptime z website_uptimes.
GET/api/v1/websites/{website}/maintenance-windowsmonitoring:readLista okien serwisowych strony.
POST/api/v1/websitesmonitoring:writeUtworzenie strony z zestawem testów. Zwraca 201.
PUT/PATCH/api/v1/websites/{website}monitoring:writeAktualizacja nazwy/URL, upsert testów, sync grup powiadomień i wykluczonych run-serwerów.
POST/api/v1/websites/{website}/runmonitoring:writeRęczne uruchomienie sond (HEALTH_CHECK/SSL/WHOIS). 202/422/503.
POST/api/v1/websites/{website}/pausemonitoring:writeIdempotentna pauza (ustawia paused_at).
POST/api/v1/websites/{website}/resumemonitoring:writeIdempotentne wznowienie (czyści paused_at).
POST/api/v1/websites/{website}/mutemonitoring:writePrzełącznik paused_at null↔now (wycisza powiadomienia).
POST/api/v1/websites/{website}/clonemonitoring:writeKlon strony dla użytkownika tokenu. Zwraca 201.
POST/api/v1/websites/{website}/maintenance-windowsmonitoring:writeUtworzenie okna serwisowego. Zwraca 201.
DELETE/api/v1/websites/{website}/maintenance-windows/{maintenanceWindow}monitoring:writeUsunięcie okna serwisowego (scoped binding). Zwraca 204.
DELETE/api/v1/websites/{website}monitoring:deleteTrwałe usunięcie strony (kaskada). Zwraca 204.

GET /websites — parametry zapytania

  • search (string, opcjonalny, max 255) — dopasowanie po nazwie i URL.
  • status (enum: paused|healthy|unhealthy|skipped, opcjonalny).
  • sort (enum: name|url|created_at, domyślnie created_at).
  • direction (asc|desc).
  • per_page (int 1–100, domyślnie 20), page (int ≥1).

Odpowiedź: kolekcja WebsiteResource — pola: id, name, url, status (paused→unhealthy→skipped→healthy), paused_at, ownership (owner|shared), tests[], created_at, updated_at. Każdy test: id, type (wartość enum), type_name, interval, state, state_name, parameters (zamaskowane), last_run.

POST/PATCH — parametry ciała

  • url (string, wymagany, reguła SafePublicUrl).
  • name (string, wymagany, max 255).
  • intervals (obiekt kluczowany wartością TestType; wartość: sekundy, 0–259200).
  • parameters (obiekt per-typ; opcjonalny — pominięcie zachowuje istniejącą konfigurację).
  • notificationGroupsId[] — muszą należeć do użytkownika tokenu (inaczej 422).
  • excludedRunServersId[] — istniejące run_servers.id.

Typy testów (backing value): 1=HEALTH_CHECK, 2=SSL, 4=WHOIS, 16=TCP, 32=DNS, 64=PING, 128=SMTP, 256=POP3, 512=IMAP, 1024=UDP.

Kody błędów

  • 401 — brak/niepoprawny token.
  • 403 — brak wymaganego scope lub polityki (istniejący, cudzy zasób bez dostępu).
  • 404 — nieznany identyfikator.
  • 422 — walidacja (np. brak uruchamialnego testu przy run, kod no_runnable_test).
  • 503 — brak zdrowego run-serwera do wykonania sond (kod no_run_server_available).

Przykłady — API

Lista stron z filtrem statusu

curl -s https://app.nodea.io/api/v1/websites?status=unhealthy&per_page=10 \
  -H "Authorization: Bearer $NODEA_TOKEN" \
  -H "Accept: application/json"

Utworzenie strony z testem health-check co 60 s

curl -s -X POST https://app.nodea.io/api/v1/websites \
  -H "Authorization: Bearer $NODEA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Sklep",
    "url": "https://sklep.example.com",
    "intervals": { "1": 60 },
    "parameters": { "1": { "timeout": 10, "status_codes": "200" } }
  }'

Ręczne uruchomienie sond

curl -s -X POST https://app.nodea.io/api/v1/websites/{id}/run \
  -H "Authorization: Bearer $NODEA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "test_id": 123 }'

MCP — narzędzia

Narzędzia MCP dzielą model uwierzytelniania i zakresów z API v1 (Bearer + scope sprawdzany w ensureScope) oraz flagę features:websites (narzędzie na nieaktywnej fladze znika z tools/list). Identyfikatory zasobów to UUID przekazywane jako string. Brakujący i cudzy identyfikator zwracają ten sam błąd (brak enumeracji między najemcami).

NarzędzieScopeTypOpis
websites-listmonitoring:readread-onlyLista stron; filtry search, status (paused/healthy/unhealthy), page, per_page (max 50).
website-getmonitoring:readread-onlySzczegóły strony wraz z testami. Param: id.
website-createmonitoring:writezapisUtworzenie strony; name, url, tests[] (type/interval/parameters, min 1).
website-updatemonitoring:writeidempotentneAktualizacja name/url + upsert tests[]. Tylko właściciel.
website-deletemonitoring:deletedestrukcyjneTrwałe usunięcie; wymaga confirm: true.
website-run-nowmonitoring:writezapisDispatch sond; opcjonalny test_type. Zwraca dispatched/skipped.
website-set-pausedmonitoring:writeidempotentnePauza/wznowienie przez paused: true|false (nie toggle).
website-runsmonitoring:readread-onlyHistoria uruchomień; test_type, page, per_page (max 50).
website-uptimemonitoring:readread-onlyMiesięczny uptime; months (domyślnie 12, max 60).
website-maintenance-windowsmonitoring:readread-onlyLista okien serwisowych z flagą active_now.
website-maintenance-window-createmonitoring:writezapisUtworzenie okna; starts_at/ends_at (wall-clock w timezone), recurrence_type, weekdays.
website-maintenance-window-deletemonitoring:writedestrukcyjne (adnotacja)Usunięcie okna po id. Scope pozostaje write.

Przykład — MCP (JSON-RPC)

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "website-run-now",
    "arguments": { "id": "9b1f...uuid", "test_type": 1 }
  }
}
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "website-set-paused",
    "arguments": { "id": "9b1f...uuid", "paused": true }
  }
}