API Referentie

Real-time monitoring voor Nederlandse infrastructuur

Introductie

De StatusBewaker REST API geeft je volledige controle over je monitors, statusdata en alertconfiguraties. Alle endpoints vereisen authenticatie via een Bearer token in de Authorization header. De API is gehost op api.statusbewaker.nl en ondersteunt alleen HTTPS.

Je vindt je API-keys onder Instellingen > API-toegang in je dashboard. Standaard geldt een rate limit van 60 verzoeken per minuut per key. Enterprise-abonnees krijgen een verhoogd plafond van 600 verzoeken per minuut. Alle tijden worden geretourneerd in ISO 8601-formaat (UTC). Fouten gebruiken standaard HTTP-statuscodes met een JSON-body die een error en details veld bevat.

Beheer je API-keys Snelstartgids

Endpoints

Alle beschikbare API-endpoints, gegroepeerd per functie. Elke endpoint beschrijft de HTTP-methode, vereiste parameters, request-body schema en voorbeeld-responses.

Monitors

GET /v1/monitors

Retoureert een gepagineerde lijst van alle monitors in je account. Ondersteunt filteren op status (up/down/maintenance) en type (http/tcp/ping/dns).

GET /v1/monitors?status=up&limit=25&offset=0

Response 200:
{
  "data": [
    {
      "id": "mon_7k2x9p4q",
      "name": "API Backend — Amsterdam",
      "type": "http",
      "url": "https://api.voorbeeld.nl/health",
      "status": "up",
      "uptime_30d": 99.97,
      "created_at": "2024-03-12T08:14:00Z"
    }
  ],
  "meta": {
    "total": 14,
    "limit": 25,
    "offset": 0
  }
}
Monitors

POST /v1/monitors

Maak een nieuwe monitor aan. Verplichte velden: name, type, target. Optioneel: interval (standaard 60s, min 30s), expected_status, ssl_expiry_alert_days.

POST /v1/monitors
Content-Type: application/json

{
  "name": "PostNL Track & Trace",
  "type": "http",
  "target": "https://www.postnl.nl/api/v2/track",
  "interval": 60,
  "expected_status": [200, 201],
  "ssl_expiry_alert_days": 14,
  "tags": ["logistiek", "productie"]
}

Response 201:
{
  "id": "mon_3n8w1r5t",
  "name": "PostNL Track & Trace",
  "status": "initializing",
  "created_at": "2025-01-08T14:22:31Z"
}
Monitors

GET /v1/monitors/{id}/status

Haal gedetailleerde statusdata op voor een specifieke monitor. Retourneert huidige status, laatste check-resultaat, response-time historie (laatste 72 uur) en uptime-statistieken.

GET /v1/monitors/mon_7k2x9p4q/status

Response 200:
{
  "monitor_id": "mon_7k2x9p4q",
  "current_status": "up",
  "last_check": {
    "timestamp": "2025-01-08T14:23:00Z",
    "response_time_ms": 142,
    "status_code": 200,
    "ssl_days_remaining": 87
  },
  "uptime": {
    "24h": 100.0,
    "7d": 99.94,
    "30d": 99.97
  },
  "response_times": [
    { "timestamp": "...", "ms": 138 },
    { "timestamp": "...", "ms": 151 }
  ]
}
Alerts

GET /v1/alerts

Lijst alle geconfigureerde alertkanalen op. Ondersteunde types: webhook, email, slack, teams, pagerduty. Filter op type of active.

GET /v1/alerts?type=webhook

Response 200:
{
  "data": [
    {
      "id": "alt_9m2k4x7p",
      "type": "webhook",
      "name": "Ops Team — Discord",
      "endpoint": "https://discord.com/api/webhooks/...",
      "active": true,
      "monitors": ["mon_7k2x9p4q", "mon_3n8w1r5t"],
      "conditions": ["down", "ssl_expiry", "response_time_gt_500"]
    }
  ]
}
Alerts

POST /v1/alerts

Configureer een nieuw alertkanaal. Verplicht: type, name, config (type-specifiek). Koppel monitors via monitor_ids. Stel trigger-voorwaarden in via conditions.

POST /v1/alerts
Content-Type: application/json

{
  "type": "slack",
  "name": "Infra-alerts — #ops-channel",
  "config": {
    "webhook_url": "https://hooks.slack.com/services/T02/...",
    "channel": "#ops-channel"
  },
  "monitor_ids": ["mon_7k2x9p4q"],
  "conditions": ["down", "response_time_gt_1000"],
  "cooldown_minutes": 15
}

Response 201:
{
  "id": "alt_5r8n2w1q",
  "type": "slack",
  "name": "Infra-alerts — #ops-channel",
  "active": true,
  "created_at": "2025-01-08T14:25:10Z"
}
Monitors

DELETE /v1/monitors/{id}

Verwijder een monitor permanently. Alle bijbehorende statusdata en alertkoppelingen worden verwijderd. Deze actie is onomkeerbaar. Retourneert 204 No Content bij succes.

DELETE /v1/monitors/mon_3n8w1r5t
Authorization: Bearer sk_live_...

Response 204 No Content

Voorbeelden

Praktische code-voorbeelden in veelgebruikte talen om snel te starten met de StatusBewaker API.

JavaScript / Node.js

Monitor aanmaken en status controleren

const API_KEY = process.env.STATUSBEWAKER_API_KEY;
const BASE = 'https://api.statusbewaker.nl/v1';

// Maak een monitor aan
const monitor = await fetch(`${BASE}/monitors`, {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${API_KEY}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    name: 'Rijksdienst Digitale Overheid',
    type: 'http',
    target: 'https://www.overheid.nl/healthz',
    interval: 60,
    expected_status: [200],
    ssl_expiry_alert_days: 21
  })
}).then(r => r.json());

console.log('Monitor aangemaakt:', monitor.id);

// Controleer status na 30 seconden
await new Promise(r => setTimeout(r, 30000));

const status = await fetch(
  `${BASE}/monitors/${monitor.id}/status`,
  { headers: { 'Authorization': `Bearer ${API_KEY}` } }
).then(r => r.json());

console.log('Huidige status:', status.current_status);
console.log('Response tijd:', status.last_check.response_time_ms, 'ms');
console.log('Uptime 30d:', status.uptime['30d'], '%');
Python

Alle monitors ophalen en afval detecteren

import requests

API_KEY = "sk_live_4f8a2b..."
BASE = "https://api.statusbewaker.nl/v1"
headers = {"Authorization": f"Bearer {API_KEY}"}

# Haal alle monitors op
resp = requests.get(f"{BASE}/monitors", headers=headers)
monitors = resp.json()["data"]

# Identificeer monitors met laag uptime
for m in monitors:
    uptime = m.get("uptime_30d", 100)
    if uptime < 99.5:
        print(f"⚠️  {m['name']} — uptime: {uptime}%")
        print(f"    URL: {m.get('url', 'N/A')}")
        print(f"    Status: {m['status']}")

        # Haal gedetailleerde status op
        detail = requests.get(
            f"{BASE}/monitors/{m['id']}/status",
            headers=headers
        ).json()
        print(f"    Laatste check: {detail['last_check']['response_time_ms']}ms")
        print(f"    SSL verloopt over: {detail['last_check']['ssl_days_remaining']} dagen\n")
cURL

Snelle status-check via terminal

# Alle monitors overzicht
curl -s https://api.statusbewaker.nl/v1/monitors \
  -H "Authorization: Bearer sk_live_4f8a2b..." | jq '.data[] | {name, status, uptime_30d}'

# Specifieke monitor status
curl -s https://api.statusbewaker.nl/v1/monitors/mon_7k2x9p4q/status \
  -H "Authorization: Bearer sk_live_4f8a2b..." | jq '.current_status, .last_check.response_time_ms'

# Webhook alert configureren
curl -s -X POST https://api.statusbewaker.nl/v1/alerts \
  -H "Authorization: Bearer sk_live_4f8a2b..." \
  -H "Content-Type: application/json" \
  -d '{
    "type": "webhook",
    "name": "Incidenten — Mattermost",
    "config": {
      "url": "https://mattermost.rijksoverheid.nl/hooks/abc123"
    },
    "monitor_ids": ["mon_7k2x9p4q"],
    "conditions": ["down", "ssl_expiry"],
    "cooldown_minutes": 10
  }'

Foutafhandeling

De API retourneert standaard JSON-foutmeldingen. Hieronder de meest voorkomende statuscodes:

400 Bad Request    — Ongeldige parameters of ontbrekende velden
401 Unauthorized   — Ontbrekend of ongeldig API-key
403 Forbidden      — Key heeft geen rechten voor deze actie
404 Not Found      — Monitor of alert bestaat niet
429 Too Many Requests — Rate limit overschreden (zie Retry-After header)
500 Internal Server Error — Serverfout (contacteer support@statusbewaker.nl)

Voorbeeld 429 response:
{
  "error": "rate_limit_exceeded",
  "details": "U heeft 60 verzoeken per minuut bereikt. Probeer het over 23 seconden opnieuw.",
  "retry_after": 23
}