Entwickler-API
Ein Endpunkt, eine Dimension: das Security-Ergebnis eines Scans als JSON, ohne den Weg durch das vollständige Report-Schema. Gebaut für CI-Pipelines, Dashboards und Agenturwerkzeuge, die Response-Header regelmäßig prüfen.
01 Authentifizierung
Jede Anfrage trägt ein API-Token als Bearer-Token im Authorization-Header. Tokens werden auf der API-Token-Seite des Kontos angelegt und widerrufen, und ein Token sieht ausschließlich die Scans seines eigenen Kontos. Der API-Zugang gehört zum Agency-Tarif; ob darunter noch eine leichtere, registrierungsfreie Stufe folgt, ist eine offene Produktfrage und wird hier nicht entschieden.
02 Der Endpunkt
Der Endpunkt gibt die Security-Dimension eines fertigen Scans zurück und sonst nichts. Er liest, was der Scan gespeichert hat, und misst nichts eigenes: derselbe Scan-Token antwortet über den vollständigen Report-Endpunkt genauso.
GET /api/v1/scans/{token}/security JSON curl -H "Authorization: Bearer $SCAN_API_TOKEN" \ "https://scan.erseni.com/api/v1/scans/8f14e45fceea167a5a36dedd4bea2543/security?locale=en-gb" { "schemaVersion": 6, "token": "8f14e45fceea167a5a36dedd4bea2543", "url": "https://example.com/", "status": "finished", "resultAvailable": true, "scanErrorMessage": null, "progressStage": null, "progressPercent": 100, "security": { "dimension": "security", "measured": true, "score": 62, "band": "warn", "rank": "needs_work", "checkSummary": { "passed": 21, "violated": 9, "notChecked": 18, "ran": 30, "total": 48 }, "checks": [ { "key": "strict-transport-security", "state": "passed", "label": "Strict-Transport-Security", "reason": "Enforces HTTPS for every later request." } ], "findings": [ { "code": "security.missing-header.content-security-policy", "severity": "high", "riskLevel": "high", "effort": "medium", "title": "Content-Security-Policy header missing", "detail": "...", "riskStatement": "...", "remediation": "..." } ] } } 03 Einen Scan starten
Ein Scan fährt einen echten Browser gegen die Seite, er läuft also asynchron. Der erste Aufruf reiht ihn ein und liefert einen Token, der zweite liest das Ergebnis, sobald der Status auf finished steht. Fragen Sie den Security-Endpunkt ab: solange der Scan läuft, antwortet er mit Status und Fortschritt und einem leeren security-Block.
POST /api/v1/scans curl -X POST \ -H "Authorization: Bearer $SCAN_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/"}' \ "https://scan.erseni.com/api/v1/scans" { "token": "8f14e45fceea167a5a36dedd4bea2543", "id": 4711, "status": "queued", "statusUrl": "/api/v1/scans/8f14e45fceea167a5a36dedd4bea2543" } 04 Die Antwort lesen
Nichts in der Antwort ist eine Rechtsaussage, und nichts wird der schönen Form zuliebe gefüllt. Eine Dimension, die nie gemessen wurde, kommt als measured false mit einem score von null zurück und nicht als Null-Punkte-Ergebnis.
score Der Security-Score des Scans von 0 bis 100, oder null, wenn die Dimension nicht gemessen wurde. band ist good, warn, poor oder unknown; rank ist die feinere siebenstufige Skala aus dem Report.
measured False, wenn der Scan keinen Security-Score trägt. Der Rest des Blocks kann trotzdem gefüllt sein, aber es steht kein Score dahinter.
checkSummary Wie viele der deklarierten Security-Prüfungen bestanden wurden, verletzt sind und nicht laufen konnten. ran ist passed plus violated, total zählt alle drei. Null bei einem Scan von vor der Prüfbuchführung.
checks Ein Eintrag je Prüfung mit Schlüssel, Zustand, Bezeichnung und Begründung. Die Liste ist entweder vollständig für die Dimension oder null: eine halbe Liste würde die zufällig benannten Prüfungen als vollen Prüfumfang ausgeben.
findings Die öffentlichen Security-Befunde des Scans. code ist ein stabiler Fingerabdruck, auf den Sie abbilden können; die vier Texte kommen in der angefragten Sprache.
locale Optionaler Query-Parameter, en-gb ist der Standard, de-de wird ebenfalls unterstützt. Er wählt die Sprache von Bezeichnungen, Begründungen und Befundtexten. Schlüssel, Codes und Zustände ändern sich mit der Sprache nie.
05 Fehler
Jeder Fehler trägt den HTTP-Status und einen JSON-Body mit errorMessage. Verzweigen Sie über den Statuscode und nicht über den Text: der Wortlaut kann sich ändern, die Codes nicht.
06 Migration
Snyk stellt die API von securityheaders.com im April 2026 ein. Die Zuordnung unten ist bewusst wörtlich: wo wir etwas anderes meinen, steht das da, statt unsere Antwort in eine Form zu biegen, die kompatibel aussieht und still etwas anderes berichtet.
07 Mehr als Header
Die Security-Dimension ist breiter als eine Headerliste. Diese Prüfungen kommen mit demselben Aufruf und stehen in checks und findings neben den Header-Prüfungen.
08 Grenzen
Die ehrliche Hälfte des Vergleichs. Nichts davon ist ein Versehen, und jede Zeile sagen wir lieber hier, als dass Sie sie im Betrieb entdecken.
Legen Sie im Konto ein Token an, fahren Sie einen Scan von Hand, um die Form der Antwort zu sehen, und richten Sie dann Ihre Pipeline darauf.