API en webhooks
De REST API gebruiken met een persoonlijk token, en ondertekende webhooks ontvangen en controleren.
ServerScope heeft een REST API (versie 1) om gegevens op te halen en incidenten te behandelen, en webhooks die gebeurtenissen naar je eigen systeem sturen.
API-token aanmaken
- Open Profiel → API-tokens.
- Geef het token een Naam, bijvoorbeeld
n8nofgrafana. - Kies de Bevoegdheden:
readzit er altijd in; voegwritealleen toe als het token incidenten moet bijwerken. - Kies de Geldigheid: 30 dagen, 90 dagen, 1 jaar of onbeperkt.
- Klik op Token aanmaken en kopieer het token (begint met
ssk_).
Let op
Het token wordt één keer getoond; ServerScope bewaart alleen een SHA-256-hash. Een token heeft dezelfde rechten als jouw account, beperkt tot de gekozen bevoegdheden. Trek een token direct in als het is uitgelekt.
Authenticatie en conventies
-
Basis-URL:
https://serverscope.nl/api/v1 -
Stuur het token als bearer-token en vraag JSON:
Authorization: Bearer ssk_… Accept: application/json -
Alleen JSON. Lijsten zijn gepagineerd met
?page=2&per_page=50(maximaal 100) en gevendata,linksenmetaterug. -
Tijden zijn ISO 8601 in UTC.
-
Maximaal 120 verzoeken per minuut per token.
Endpoints
| Methode | Pad | Bevoegdheid | Opmerkingen |
|---|---|---|---|
| GET | /servers |
read | filter status = online/offline/pending/maintenance, environment |
| GET | /servers/{id} |
read | inclusief de laatste metingen |
| GET | /servers/{id}/metrics |
read | from, to (ISO 8601), limit ≤ 1440 (standaard het laatste uur, 120 metingen) |
| GET | /domains |
read | filter status = healthy/warning/critical/unknown |
| GET | /domains/{id} |
read | HTTP-, SSL-, DNS- en registratiestatus |
| GET | /domains/{id}/checks |
read | type = http/ssl/dns/expiry |
| GET | /incidents |
read | state = active (standaard)/resolved/closed/all, severity |
| GET | /incidents/{id} |
read | inclusief de tijdlijn |
| POST | /incidents/{id}/acknowledge |
write | |
| POST | /incidents/{id}/investigate |
write | |
| POST | /incidents/{id}/resolve |
write | optioneel notes |
| POST | /incidents/{id}/comments |
write | message (verplicht) |
Voorbeelden
Actieve incidenten ophalen:
curl -s "https://serverscope.nl/api/v1/incidents?state=active" \
-H "Authorization: Bearer $SERVERSCOPE_API_TOKEN" \
-H "Accept: application/json"
Een incident bevestigen:
curl -s -X POST "https://serverscope.nl/api/v1/incidents/12/acknowledge" \
-H "Authorization: Bearer $SERVERSCOPE_API_TOKEN" \
-H "Accept: application/json"
Een notitie toevoegen:
curl -s -X POST "https://serverscope.nl/api/v1/incidents/12/comments" \
-H "Authorization: Bearer $SERVERSCOPE_API_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"message": "Herstart van php-fpm uitgevoerd."}'
Foutmeldingen
Fouten hebben de vorm {"message": "...", "errors": {"veld": ["..."]}}:
| Status | Betekenis |
|---|---|
| 401 | Token ontbreekt of is ongeldig (Ontbrekend of ongeldig API-token.) |
| 403 | Het token mist de bevoegdheid, bijvoorbeeld write |
| 404 | Het object bestaat niet |
| 409 | Ongeldige statusovergang van een incident (bijvoorbeeld een gesloten incident oplossen) |
| 422 | Validatiefout; zie errors |
| 429 | Te veel verzoeken; wacht even |
Opmerking
De monitoringagent gebruikt een eigen endpoint (
POST /api/agent/metrics) met agenttokens per server. Agenttokens werken niet voor deze API, en API-tokens niet voor de agent.
Webhooks
Beheerders stellen webhooks in onder Beheer → Webhooks met Webhook toevoegen: een naam, een publieke https-URL en de gebeurtenissen. Na het aanmaken zie je één keer het ondertekeningsgeheim (begint met whsec_).
Gebeurtenissen: incident.opened, incident.reopened, incident.resolved, incident.escalated (drempel gepasseerd, ernst verhoogd of niet op tijd bevestigd), dns.changed en test.
Elke levering is een POST met een JSON-body:
{"id": "<uuid van de levering>", "event": "incident.opened", "created_at": "2026-10-26T10:00:00+00:00", "data": {"incident": {"id": 12, "title": "…", "severity": "critical", "status": "open"}}}
Met deze headers:
| Header | Inhoud |
|---|---|
X-ServerScope-Event |
De gebeurtenis, bijvoorbeeld incident.opened |
X-ServerScope-Delivery |
Unieke id; gebruik die om dubbele leveringen te negeren |
X-ServerScope-Timestamp |
Unix-tijd van verzending |
X-ServerScope-Signature |
sha256=<hex> met HMAC-SHA256(geheim, timestamp + "." + ruwe body) |
Handtekening controleren
- Lees de ruwe body, nog vóór het parsen van de JSON.
- Bereken
sha256=+ HMAC-SHA256 met je geheim overtimestamp + "." + body. - Vergelijk met
X-ServerScope-Signaturemet een vergelijking in constante tijd. - Weiger leveringen waarvan de timestamp meer dan 5 minuten afwijkt.
PHP:
$expected = 'sha256='.hash_hmac('sha256', $timestamp.'.'.$rawBody, $secret);
$valid = abs(time() - (int) $timestamp) < 300 && hash_equals($expected, $signatureHeader);
Python:
import hashlib, hmac, time
expected = "sha256=" + hmac.new(secret.encode(), f"{timestamp}.".encode() + raw_body, hashlib.sha256).hexdigest()
valid = abs(time.time() - int(timestamp)) < 300 and hmac.compare_digest(expected, signature_header)
Afleverregels
- Alleen publieke
https-adressen op toegestane poorten; dit wordt bij opslaan én vóór elke poging gecontroleerd. Redirects worden niet gevolgd. - Elke
2xxis gelukt. Netwerkfouten, time-outs,408,429en5xxworden tot 6 keer opnieuw geprobeerd (1 min, 5 min, 15 min, 1 uur, 6 uur); andere antwoorden falen direct. - Na 20 mislukte leveringen op rij wordt de webhook uitgeschakeld.
- Op de webhookpagina zie je elke levering; mislukte leveringen kun je Opnieuw versturen. Met Testlevering stuur je een
test-gebeurtenis. - Geheim vernieuwen maakt een nieuw geheim; het oude werkt direct niet meer.
Wil je naar Discord sturen? Gebruik dan de aparte Discord-koppeling; die zet de gebeurtenissen om naar Discord-berichten.