Varmo in Ihre Abläufe einbinden.
Monitoring meldet Vorfälle, das Ticketsystem setzt Massnahmen auf „umgesetzt“, eigene Auswertungen lesen Risiken und Anforderungen. Je Schlüssel legen Sie fest, welche Bereiche er lesen oder bearbeiten darf – Freigaben, Rechte und Einstellungen bleiben Menschen in Varmo vorbehalten.
Enthalten ab Paket Pro
1. API-Schlüssel anlegen
- Verwaltung › API-Schlüssel › „Schlüssel anlegen“ (Tenant Admin): Name, Laufzeit (30 Tage bis 1 Jahr) und Zugriff wählen
- Varmo legt dazu ein API-Mitglied an, z. B. „API: Monitoring“. Der Schlüssel beginnt mit vk_ und hat 46 Zeichen – mit „Schlüssel kopieren“ übernehmen und sicher ablegen, z. B. im Passwort-Tresor oder als Geheimnis Ihres Systems. Unter „Anzeigen“ finden Tenant Admins ihn später wieder; jedes Anzeigen steht im Verwaltungsprotokoll
- Zugriff je Bereich – Assets, Risiken, Massnahmen, Ausnahmen, Vorfälle: kein Zugriff, lesen oder lesen und bearbeiten; dazu „übrige Bereiche lesen“ (Richtlinien, Anforderungen, Dokumente, Audits, Ziele, Schulungen, Mitglieder). Ändern unter „Zugriff bearbeiten“, gilt ab der nächsten Anfrage
- Vor Ablauf „Neuer Schlüssel“ erzeugen, im System ersetzen; „Widerrufen“ sperrt sofort
Was ein API-Mitglied darf
- Genau das, was beim Schlüssel unter „Zugriff“ steht – Lesen, Erfassen und Bearbeiten; Fachrollen gelten für API-Mitglieder nicht
- Nie: freigeben, einreichen, Risiken bewerten, Fachrollen oder Rechte vergeben, Mitglieder oder Einstellungen ändern, Audit-Log lesen
- Es meldet sich nie an, ist in keiner Personenauswahl und zählt nicht als User
- Jede Änderung steht im Änderungsprotokoll mit dem API-Mitglied als handelnder Person; neue Assets kommen als Vorschlag und erscheinen erst nach der Abnahme in Varmo
2. Erste Anfragen
Alle Anfragen gehen an https://varmo.ch/api/v1 mit dem Schlüssel im Header Authorization. Antworten sind JSON; Listen haben Seiten (next_cursor) und lassen sich mit updated_since auf Änderungen seit einem Zeitpunkt eingrenzen.
curl -H "Authorization: Bearer $VARMO_API_KEY" https://varmo.ch/api/v1/mecurl -H "Authorization: Bearer $VARMO_API_KEY" \
"https://varmo.ch/api/v1/measures?limit=100&updated_since=2026-10-01T00:00:00Z"curl -X POST "https://varmo.ch/api/v1/incidents" \
-H "Authorization: Bearer $VARMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Speicher voll auf srv-backup","description":"Alarm aus dem Monitoring","detected_at":"2026-10-19T08:15:00Z","personal_data":"no"}'curl -X POST "https://varmo.ch/api/v1/measures/<id>/status" \
-H "Authorization: Bearer $VARMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status":"implemented","comment":"Ticket SEC-12 erledigt"}'Alle Endpunkte
Die vollständige Beschreibung mit allen Feldern steht als OpenAPI-Datei unter https://varmo.ch/api/v1/openapi.json – sie lässt sich in Postman, Insomnia oder Code-Generatoren laden.
- GET /me · GET /assets, /risks, /measures, /exceptions, /incidents, /findings, /frameworks, /requirements, /members (je mit /{id})
- POST /risks (Meldung), PATCH /risks/{id}, POST /risks/{id}/comments
- POST /measures, PATCH /measures/{id}, POST /measures/{id}/status, /comments, /links
- POST /exceptions (Entwurf), PATCH /exceptions/{id}, /comments, /links
- POST /assets (Vorschlag), PATCH /assets/{id}, /links · POST /incidents, PATCH /incidents/{id}
Fehler und Grenzen
- Fehler immer als JSON {"error": {"code", "message"}}; die Meldung ist deutsch und nennt den Grund
- 401 Schlüssel fehlt, ungültig, abgelaufen oder widerrufen · 403 Recht fehlt oder Paket ohne API · 404 nicht vorhanden oder nicht sichtbar · 400 ungültige Eingabe · 422 von den Regeln abgelehnt (z. B. Pflichtfeld Ihrer Organisation) · 429 zu viele Anfragen
- Höchstens 120 Anfragen je Minute und Schlüssel (dann 429 mit Retry-After), Inhalte bis 64 KB
- Häufige Fehler (401, 403, 404) von derselben Adresse kann der Schutz der Plattform als Angriff werten und die Adresse vorübergehend sperren – prüfen Sie Schlüssel und IDs, statt zu wiederholen
- Versionierung: Änderungen, die bestehende Anbindungen brechen, erscheinen nur unter /api/v2; /api/v1 wird nur ergänzt
3. Webhooks einrichten
Webhooks melden Ihrem System sofort, dass in Varmo etwas passiert ist. Die Meldung enthält nur Ereignis, Zeitpunkt, Art und ID – die Inhalte holt Ihr System über die API mit seinem Schlüssel; so sieht es nur, was das API-Mitglied sehen darf.
- Verwaltung › Webhooks › „Webhook anlegen“: Name, https-Adresse Ihres Empfängers und Ereignisse wählen
- Das angezeigte Geheimnis (beginnt mit whsec_) beim Empfänger hinterlegen; es erscheint nur einmal
- „Testzustellung“ sendet ein Ereignis vom Typ ping
- Ereignisse: approval.requested, incident.reported, risk.reported, measure.status_changed, task.overdue (einmal täglich), role.vacant
- Ihr Empfänger antwortet innert 10 Sekunden mit einem Status 2xx; sonst versucht es Varmo mehrmals über rund 20 Stunden. Nach 20 Fehlern in Folge wird der Webhook pausiert, und Tenant Admins erhalten eine Pendenz; Speichern beendet die Pause
- Nur https, keine internen oder privaten Adressen, keine Weiterleitungen
POST /varmo HTTP/1.1
Content-Type: application/json
Varmo-Event: incident.reported
Varmo-Delivery: 6f0d7c1e-…
Varmo-Signature: t=1792396500,v1=5b1c…
{"id":"9a7e…","type":"incident.reported","created_at":"2026-10-19T08:15:02Z",
"organisation_id":"1e30…","api_version":"v1",
"data":{"object_type":"incident","object_id":"4b07…","code":"V004",
"url":"https://varmo.ch/isms/incidents/4b07…"}}Signatur prüfen
Prüfen Sie jede Zustellung, bevor Sie ihr vertrauen: Die Signatur ist ein HMAC-SHA256 mit Ihrem Geheimnis über „<t>.<Inhalt>“, und t darf höchstens 5 Minuten alt sein. Prüfen Sie den unveränderten Inhalt, nicht ein neu erzeugtes JSON. Dieselbe Zustellung kann bei Wiederholungen mehrfach ankommen; die id hilft, Doppelte zu erkennen.
import { createHmac, timingSafeEqual } from "node:crypto";
// rawBody: der unveränderte Inhalt der Anfrage (Text), nicht neu serialisiert.
export function verifyVarmoSignature(secret, header, rawBody, toleranceSeconds = 300) {
const parts = Object.fromEntries(
String(header ?? "").split(",").map((p) => p.trim().split("=")),
);
const timestamp = Number(parts.t);
if (!Number.isInteger(timestamp) ||
Math.abs(Date.now() / 1000 - timestamp) > toleranceSeconds) {
return false;
}
const expected = createHmac("sha256", secret)
.update(`${timestamp}.${rawBody}`)
.digest("hex");
const given = String(parts.v1 ?? "");
return given.length === expected.length &&
timingSafeEqual(Buffer.from(given), Buffer.from(expected));
}import hashlib
import hmac
import time
def verify_varmo_signature(secret: str, header: str, raw_body: bytes, tolerance: int = 300) -> bool:
parts = dict(p.strip().split("=", 1) for p in (header or "").split(",") if "=" in p)
try:
timestamp = int(parts.get("t", ""))
except ValueError:
return False
if abs(time.time() - timestamp) > tolerance:
return False
expected = hmac.new(secret.encode(), f"{timestamp}.".encode() + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, parts.get("v1", ""))function Test-VarmoSignature {
param([string]$Secret, [string]$Header, [string]$RawBody, [int]$Tolerance = 300)
$parts = @{}
foreach ($p in ($Header -split ',')) {
$kv = $p.Trim() -split '=', 2
if ($kv.Count -eq 2) { $parts[$kv[0]] = $kv[1] }
}
$t = 0L
if (-not [long]::TryParse([string]$parts['t'], [ref]$t)) { return $false }
$now = [DateTimeOffset]::UtcNow.ToUnixTimeSeconds()
if ([math]::Abs($now - $t) -gt $Tolerance) { return $false }
$hmac = New-Object System.Security.Cryptography.HMACSHA256 (,[Text.Encoding]::UTF8.GetBytes($Secret))
$hash = $hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes("$t.$RawBody"))
$expected = -join ($hash | ForEach-Object { $_.ToString('x2') })
return $expected -ceq [string]$parts['v1']
}Sicherheit und Datenschutz
- Varmo speichert vom Schlüssel nur einen Hash; Webhook-Adresse und Geheimnis liegen verschlüsselt
- Schlüssel und Geheimnisse nie in Code-Repositories ablegen; bei Verdacht sofort widerrufen bzw. neu erzeugen
- Personen-Daten liefert die API nur, soweit das API-Mitglied sie sehen darf (z. B. Namen der Mitglieder für die Zuordnung)
- Webhooks enthalten keine Titel oder Beschreibungen
Änderungen der API
- 19.10.2026 – v1: lesende und schreibende Endpunkte, Webhooks; Zugriff je Schlüssel (GET /me liefert access und permissions)
Passend dazu
Sehen Sie es an Ihrem eigenen Beispiel.
In einer persönlichen Demo gehen wir Ihre Fragestellungen durch, unverbindlich. Oder Sie starten sofort mit dem Paket Free.