API en webhooks
De REST API gebruiken met een persoonlijk token, en ondertekende webhooks ontvangen en controleren.
Laatst bijgewerkt:
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.
Bedankt voor je reactie.