API-Key-Readiness

Key-Store, Scopes und Auditlog vor produktiver Ausgabe prüfen

API-Key-Readiness: Runtime-Kontrollen 7/7 implementiert; API-Access-Storage 2/2 Tabellen; produktive Freigaben 0/7 aktiv.

Dieses Dossier erzeugt keine echten API-Keys, speichert keine Hashes und gibt keine Secret-Werte aus. Produktive Key-Ausstellung braucht Betreiber-Auth, Domain-Claim und Server-Gates.

blocked_by_production_gatesStatus 0/7Gates 7/7Runtime 2/2API-Storage 0/3Artefakte neinCREATE-Recht 8Scopes 14Auditfelder 4Quickstarts 6Fehler 5Rotation 6Abnahme 6Issuance 5Limits 5Abuse 5Watch 6OpenAPI 5Postman 5SDKs 6Sandbox 5Webhook 4SLO 4Konsolidierung 6Parity-Plan 18Parity-Abnahme 4Grenzen 5Signoff 6Canary 0Deny-Audits 24h okSmoke

API-Parity-Schließplan

Welche Freigaben die API-Lücke zu reifen Plattformen schließen

Der Schließplan verbindet Wettbewerbsanforderungen mit Betreiberinput, Unlocks, Abnahmekriterien, Evidence und klaren Nicht-Behaupten-Grenzen.

JSON prüfen
6Freigaben 6warten 18Unlocks 18Abnahmekriterien 18Betreiberinputs 6Grenzen
Key-Store-Migration, Pepper und One-time Display waiting_for_secret_signoff · DBA/IT-Security

Schließt die Basislücke zu Plattformen mit API-Key-Lifecycle, Secret-Handling und Audit-Trail.

Grenze: Vor Secret-Signoff keine produktive Key-Ausgabe behaupten. Nicht behaupten: Produktive API-Keys sind verfügbar.
Input
3
Unlocks
3
Abnahme
3
Evidence
öffnen
Betreiber-Auth, Domain-Claim und Rollenfreigabe waiting_for_operator_auth · Customer Success/Programm-Verantwortung

Schließt die Trust-/Operator-Grenze gegen Plattformen mit Customer Portal und rollenbasiertem API-Zugang.

Grenze: Public Evidence darf keine Betreiberidentitäten oder privaten Domain-Claims offenlegen. Nicht behaupten: Jeder Betreiber kann selbststaendig API-Keys ausstellen.
Input
3
Unlocks
3
Abnahme
3
Evidence
öffnen
Scopes, Runtime-Gates, Rate-Limits und Revocation waiting_for_runtime_signoff · Backend/Platform

Schließt die Integrationsreife zu API-first Compliance- und Trust-Plattformen.

Grenze: Runtime-Verträge beweisen kein echtes Allow für Kunden, solange keine produktiven Keys ausgegeben wurden. Nicht behaupten: Operator-API ist voll produktiv nutzbar.
Input
3
Unlocks
3
Abnahme
3
Evidence
öffnen
Write-HMAC, Idempotency und Webhook-Receiver-Abnahme waiting_for_hmac_secret · IT-Security/Integration-Verantwortung

Schließt Write-/Webhook-Lücken gegen Plattformen mit Jira, Slack, Teams, Webhook und Ticket-Automation.

Grenze: Fixture ist öffentlich und kein produktives Secret; echte Receiver bleiben privat. Nicht behaupten: Schreibende Kundenintegrationen sind produktiv abgenommen.
Input
3
Unlocks
3
Abnahme
3
Evidence
öffnen
Developer-Onboarding, OpenAPI, Postman, SDKs und Sandbox contract_ready_waiting_for_live_keys · Developer Experience

Schließt die Developer-Experience-Lücke zu API-first Wettbewerbern mit Docs, Collections und SDK-Pfaden.

Grenze: Docs und Fixtures sind bereit; ohne Live-Key-Ausgabe bleibt es eine Integrationsvorbereitung. Nicht behaupten: Self-service API-Onboarding ist produktiv live.
Input
3
Unlocks
3
Abnahme
3
Evidence
öffnen
Support-SLO, Abuse-Stop, Go-live-Signoff und Nachlauf waiting_for_operator_go_live_signoff · Support/Security/Programm-Verantwortung

Schließt die Betriebslücke zu reifen Plattformen mit Support-Ziel, Incident-Prozess und Post-Go-live-Monitoring.

Grenze: Ohne Betreiber-Signoff bleibt API-Reife ein vorbereitetes Dossier, kein Live-Service-Versprechen. Nicht behaupten: API-Betrieb ist mit produktiver Servicezusage und Support freigegeben.
Input
3
Unlocks
3
Abnahme
3
Evidence
öffnen

Konsolidierung

Was erreicht ist, wo die Grenze liegt, was als Nächstes zählt

Diese Ansicht trennt belastbare Evidence von vorbereiteten Claims. Dadurch bleibt die API-Readiness für Betreiber brauchbar, ohne offene Produktiv-Gates zu überzeichnen.

Grenzen exportieren
Runtime-Kontrollen vorbereitet erreicht

7/7 Implementierungs-Gates sind durch Code- oder Control-Evidence belegt.

Grenze: Das ersetzt keine produktive Key-Ausgabe und kein echtes Betreiber-Signoff. Nächster Schritt: Nach Storage-Migration Deny-, Allow-, Revocation-, Rate-Limit- und HMAC-Smokes erneut ausführen.
API-Access-Storage erreicht

api_keys/api_access_audit_log: 2/2 Tabellen vorhanden.

Grenze: Tabellenstatus sagt noch nichts über echte Keys, Pepper, Rollenfreigabe oder Rotation. Nächster Schritt: Pepper, Domain-Claim und Smoke-Gates produktiv signieren.
Öffentliche Evidence und No-Secret-Exports erreicht

Readiness-Smoke: ok; Secret-Policy bleibt öffentlich prüfbar.

Grenze: Öffentliche Evidence darf keine DSN, Roh-Keys, Hashes, Betreiberidentitäten oder private Zielsysteme enthalten. Nächster Schritt: Smokes nach jeder Änderung neu laufen lassen und erst dann Claims in Parity-/Go-live-Ansichten übernehmen.
Claims für Betreiber konsolidieren begrenzt

Dossier trennt technische Vorbereitung, Produktiv-Gates, Signoff, Rollback und Canary-Checks.

Grenze: Nicht behaupten: echte API-Keys sind live, solange Storage, Secrets, Domain-Claim und Gates nicht zusammen grün sind. Nächster Schritt: Darstellung auf klare Betreiber-Entscheidungen ausrichten: was ist fertig, was ist blockiert, was ist der nächste sichere Schritt.

Claim-Grenzen

Was wir sagen dürfen und was nicht

Die Grenzen verhindern, dass technische Vorbereitung als produktive API-Freigabe oder pauschales Sicherheitsurteil formuliert wird.

Parity-Board
Keine produktive Key-Ausgabe behaupten erlaubt: API-Key-Prozess ist vorbereitet und no-secret dokumentiert.

Nicht behaupten: Produktive API-Keys sind verfügbar.

Storage-Tabellen, Pepper, Betreiberrolle, Domain-Claim und Runtime-Gates müssen gemeinsam freigegeben sein.
Evidence
Migration ist Übergabepaket, kein Auto-Apply erlaubt: SQL, Hash und Preflight sind für die DB-Verantwortung prüfbar.

Nicht behaupten: Die Migration wurde produktiv angewendet.

Der aktuelle Web-DB-User hat kein CREATE-Recht; Admin-DSN darf nicht öffentlich gespeichert werden.
Evidence
Smokes prüfen Grenzen, nicht private Zielsysteme erlaubt: Öffentliche Routen, No-Secret-Regeln und Deny-Verhalten sind prüfbar.

Nicht behaupten: Alle Kundenintegrationen sind produktiv abgenommen.

Private Empfänger, Betreiberidentitäten, echte Keys und Webhook-Secrets bleiben außerhalb öffentlicher Evidence.
Evidence
Betreiber-Wording statt Technikbehauptung erlaubt: Betreiber sehen nächste sichere Schritte und klare Stop-Bedingungen.

Nicht behaupten: Score oder API-Reife als pauschales Sicherheitsurteil darstellen.

Automatisierte Checks können Kontext wie Rollen, Consent, Paywall oder manuelle Betreiberfreigaben nicht vollständig bewerten.
Evidence

Letzter API-Key-Readiness-Smoke

No-Secret-Smoke bestanden

Dieser Smoke erzeugt keine API-Keys, setzt keine Env-Gates, wendet keine Migration an und prüft keine privaten Zielsysteme.

okStatus 9Routen 0Fehlerchecks 0erwartete Blocker 2/2API-Storage 2026-06-15T00:27:41+00:00Zeit
Öffentliche API-Key-Readiness-Routen erreichbar passed

9/9 Route(s) liefern HTTP 200.

Weiter mit Preflight/Go-live-Gates.
Migration-Preflight öffentlich und sanitisiert passed

missing_required_artifacts=0, admin_dsn_required=no.

Tabellen vorhanden; Runtime-Gates abnehmen.
API-Key-Store-Migration braucht DB-Admin-DSN der verantwortlichen Rolle statt Web-DB-User passed

required_artifacts=2, ready_artifacts=2, missing_artifacts=0, admin_dsn_required=no.

API-Key-Pepper, Domain-Claim und HMAC-Gates abnehmen.
API-Runtime-Kontrollen dokumentiert passed

manifest_ok=yes, controls=8/8, missing=0, secrets=0, implementation=7/7.

Deny-/Allow-/Revocation-Smokes nach Storage-Migration erneut ausführen.
Runtime-Gate-Probe beschreibt Public Reads, Protected Contracts, Deny-Fixtures und Write-HMAC passed

public_routes=4, protected_routes=7, denied_fixtures=4, live_denied=0, hmac_negative_tests=4, implementation=7/7, systemd=1.

Runtime-Gate-Probe, HMAC-Testfixture, Protected Contracts oder systemd-Service-Evidence reparieren.
Live-Deny-Smoke verweigert fehlende Authorization und schreibt sanitisiertes Audit passed

ok=yes, status_code=401, decision=deny, audit_storage=postgres, fallback_events_24h=0.

scripts/run-api-runtime-deny-smoke.sh prüfen; /api/operator/probe muss ohne Bearer-Key 401 liefern und Audit-Evidence schreiben.
Developer-Quickstarts, Fehlervertrag, Rotation und Client-Abnahme sind no-secret belegbar passed

quickstarts=4, errors=6, rotation_steps=5, acceptance=6.

Client-Onboarding, Fehlervertrag, Rotation und Abnahmekriterien im API-Key-Dossier pflegen; keine echten Keys oder Secrets in Public-Exports aufnehmen.
API-Key-Ausgabe hat Issuance-Receipt, Rate-Limits, Abuse-Stop und Nachlauf passed

issuance_items=6, rate_limit_tiers=5, abuse_steps=5, watch_signals=5.

Key-Issuance-Receipt, Rate-Limit-Tiers, Abuse-Response und Post-Issuance-Watch im API-Dossier pflegen; keine Raw-Keys, Hashes oder Betreiberidentitäten exportieren.
API-Integration-Launch-Kit deckt OpenAPI, Postman, SDKs, Sandbox, Webhook-Abnahme und Support ab passed

openapi=6, postman=5, sdks=5, sandbox=6, webhook=5, slo=4.

OpenAPI-Vertrag, Postman-Smokes, SDK-Matrix, Sandbox-Onboarding, Webhook-Receiver-Abnahme und Support-SLOs im API-Dossier pflegen; echte Keys und Zielsystem-Secrets bleiben privat.
API-Hauptseite zeigt Developer-Launch-Kit mit OpenAPI, Postman, SDK, Sandbox und Nicht-live-Grenzen passed

api_access_url=https://saferpage.de/api-zugriff, visible=yes.

API-Hauptseite muss Developer-Readiness und Nicht-live-Grenzen zeigen; Details bleiben im Key-Readiness-Dossier.
API-Hauptseite liefert no-secret OpenAPI 3.1 Vertrag mit BearerAuth, Pfaden und Claim-Grenze passed

openapi=3.1.0, paths=6, bearer=yes, no_secret=yes.

OpenAPI-Export muss Pfade, Security-Scheme, Fehlervertrag und No-Secret-Grenze zeigen; keine echten Keys, Servicezusage oder Write-Live-Zusage exportieren.
API-Hauptseite liefert no-secret Postman/Smoke Collection mit Placeholder-Key passed

schema=yes, requests=7, bearer_placeholder=yes, no_secret=yes, forbidden_hits=0.

Postman-Export muss v2.1-Schema, Smoke-Requests, Bearer-Placeholder und No-Secret-Grenze zeigen; keine echten Keys, privaten URLs oder Empfänger exportieren.

DB-Verantwortungs-Paket

API-Key-Store-Migration sicher übergeben

Diese Migration erzeugt nur Key-Store und Access-Auditlog. Sie erzeugt keine Keys und benötigt keine Secret-Werte.

Versionapi-access-2026-06-09 SHA-25627d802d48887d084e9132c841b943681c70638bd432746a92cab7809be621213 Bytes2211 Secretsnicht erforderlich 5Signoff-Punkte 4Rollback-Probe 6Canary-Schritte
curl -fsS https://saferpage.de/api-zugriff/access-migration.sql -o /tmp/saferpage-api-access.sql && export SAFERPAGE_MIGRATION_DATABASE_URL='<admin-dsn-from-secure-shell>' && psql "$SAFERPAGE_MIGRATION_DATABASE_URL" -v ON_ERROR_STOP=1 -f /tmp/saferpage-api-access.sql
Preflight

scripts/run-api-access-migration-preflight.sh

psql -d saferpage -Atq -c "select current_database(), current_user;"

psql -d saferpage -Atq -c "select coalesce(to_regclass('public.api_keys')::text,'missing'), coalesce(to_regclass('public.api_access_audit_log')::text,'missing');"

Smoke-Test

scripts/run-api-access-migration-preflight.sh

curl -fsS https://saferpage.de/api-zugriff/key-readiness-json | python3 -m json.tool

scripts/run-api-runtime-deny-smoke.sh

scripts/run-api-service-smoke.sh

Aktivierung

DDL-Migration für api_keys und api_access_audit_log anwenden.

API-Readiness erneut prüfen: api_access_storage_table_count muss 2 zeigen.

API-Key-Pepper und Write-HMAC-Secret nur im Server-Environment oder Secret Manager setzen.

Domain-Claim und Betreiberrolle verifizieren.

Test-Key nur einmal anzeigen, danach Deny-/Allow-/Revocation-Smokes ausführen.

Pause/Rollback

Sofortige Pause ohne DDL-Rollback: alle SAFERPAGE_API_*_READY Freigaben entfernen und API-Service neu starten.

Keys bei Verdacht auf Fehlkonfiguration auf status=revoked setzen statt Rohdaten zu exportieren.

DDL-Drop nur nach Backup-, Audit- und Retention-Freigabe ausführen.

Abnahme

api_keys und api_access_audit_log existieren.

api_keys enthält nur Prefix/Hash/Scopes/Status und keinen Roh-Key.

api_access_audit_log schreibt sanitisierte Deny-/Allow-Events ohne Authorization-Header.

Runtime-Gate-Probe bestätigt 401/403/429/Revocation-Fixtures.

Write-HMAC-Test-Fixture ist gegen Client/Receiver verifiziert.

Signoff-Paket

DDL-Hash fixiert · ready

27d802d48887d084e9132c841b943681c70638bd432746a92cab7809be621213

Preflight vor/nach Migration · ready

https://saferpage.de/evidence/api-access-migration-preflight.json

Kurzlebiger Admin-DSN · not_required_after_apply

DSN wird nie in Public-State, Repo, Logs oder Smoke-Ergebnis ausgegeben.

DB-Verantwortungsfreigabe · ready

Freigabe muss verantwortliche DB-Rolle, Zeitpunkt, SQL-Hash und Rollback/Pause-Entscheidung nennen.

API-Service Restart geplant · ready

Service-Restart erst nach erfolgreichem Preflight und Secret-Referenzen.
Rollback-Probe

Key-Ausgabe pausieren

Protected Routen bleiben denied.

Keine Rohdaten exportieren

No-Secret-Policy im Smoke bleibt grün.

Test-Keys widerrufen

Revocation-Smoke liefert Deny.

DDL nur nach Backup droppen

DB-Verantwortungsentscheidung außerhalb Public-Export dokumentiert.
Canary nach Migration

Preflight nach Apply

api_access_storage_table_count=2 und missing_required_artifact_count=0.

Readiness JSON prüfen

Storage grün, Produktiv-Gates nur bei echten Env-Freigaben grün.

Deny-Smoke ohne Key

401 deny und sanitisiertes Audit.

Runtime-Gate-Probe

Public/Protected/HMAC/Revocation-Vertrag vollständig.

No-Secret-Smoke

failed_check_count=0; blocked_expected nur für bewusst offene Gates.

Public Evidence erneut deployen

Öffentliche Evidence zeigt neue Smoke-Zeit und keine Secrets.

DB-Verantwortungs-Handoff

Was privat bleibt und was öffentlich belegbar ist

API-Access-Tabellen sind vorhanden; DB-Verantwortungs-Handoff bleibt als Nachweis für Hash, Rollback und Canary erhalten.

storage_ready_after_applyStatus 5Schritte 5private Inputs 6öffentliche Outputs 8verbotene Outputs 5Validierungsqueries 6Evidence-Links
SQL-Hash vergleichen DB-Verantwortung

Public SHA-256 mit der lokal angewendeten Datei vergleichen.

Abnahme: Hash stimmt exakt mit dem Readiness-Export überein. Grenze: Hash beweist nur Dateigleichheit, nicht erfolgreiche Migration.
Evidence
Apply-Fenster und Backup festlegen DB-Verantwortung/Platform

Zeitfenster, Backup-Stand und Pause-Entscheidung privat dokumentieren.

Abnahme: Zeitfenster und Rollback-Verantwortung sind vor Apply bestätigt. Grenze: Private Backup-Details werden nicht öffentlich exportiert.
Evidence
Kurzlebigen Admin-DSN nutzen DB-Verantwortung

Migration nur aus sicherer Shell mit kurzlebigem Admin-DSN ausführen und DSN danach entfernen.

Abnahme: DSN taucht in keinem Public-Export, Repo, Log oder Smoke auf. Grenze: Ohne Admin-DSN bleibt der Web-DB-User erwartbar blockiert.
Evidence
Preflight und Runtime-Smokes wiederholen Platform/Security

Preflight, Deny-Smoke, Runtime-Probe und API-Key-Readiness-Smoke nach Apply erneut ausführen.

Abnahme: api_access_storage_table_count=2 und failed_check_count=0; offene Produktiv-Gates bleiben als Blocker sichtbar. Grenze: Smokes erzeugen keine produktiven API-Keys.
Evidence
Runtime-Gates erst nach Secret-Signoff aktivieren Security/Operator

API-Key-Pepper, Write-HMAC-Secret, Domain-Claim und Betreiberrolle privat abnehmen.

Abnahme: Alle Produktiv-Gates sind mit privatem Signoff und öffentlicher No-Secret-Evidence belegt. Grenze: Storage allein erlaubt noch keine Key-Ausgabe.
Evidence
Private Inputs

Kurzlebiger Admin-DSN

Nie öffentlich ausgeben.

DB-Verantwortungsfreigabe

Nur Status, Zeitpunktklasse und SQL-Hash öffentlich zeigen.

Backup-/Pause-Verantwortung

Keine Backup-Pfade oder internen Hostnamen exportieren.

API-Key-Pepper-Secret-Referenz

Nur Vorhandensein als Gate zeigen, nie Wert oder Secret-Manager-Pfad.

Write-HMAC-Secret-Referenz

Nur Fixture und Gate-Status exportieren.
Öffentlich erlaubte Outputs

Migration-SHA-256

DB-Verantwortung kann Datei vor Apply prüfen.

Tabellen-Readiness 0/2 oder 2/2

Öffentlicher Fortschritt ohne DSN/Tabellendaten.

Redaktierter DB-User-Hash

Preflight kann Rollenwechsel erkennen, ohne Usernamen zu nennen.

Sichere Command-Namen

Runbook bleibt reproduzierbar ohne private Parameter.

SaferPage-Evidence-URLs

Abnahme ist verlinkbar und maschinenlesbar.

Smoke-Status und Zähler

Produktreife ist prüfbar, ohne Secrets zu leaken.
Verbotene Outputs

Admin-DSN oder Passwort

DB-Host, Port oder interner Username

Roh-API-Key oder vollständiger Key-Prefix außer Testfixture

Key-Hash, Pepper oder Secret-Manager-Pfad

Authorization-Header oder Bearer-Token

Write-HMAC-Secret oder echte Signatur für Live-Payloads

Private Webhook-, Slack-, Teams- oder Kundenziel-URLs

Besucherlogs, Request-Payloads oder personenbezogene Auditdetails

Sanitisierte Validierungsqueries
select coalesce(to_regclass('public.api_keys')::text, 'missing');
select coalesce(to_regclass('public.api_access_audit_log')::text, 'missing');
select count(*) from information_schema.columns where table_schema = 'public' and table_name = 'api_keys';
select count(*) from information_schema.columns where table_schema = 'public' and table_name = 'api_access_audit_log';
select tgname from pg_trigger where tgrelid = 'public.api_keys'::regclass and not tgisinternal;
Handoff-Abnahme

DB-Verantwortung bestätigt SQL-Hash und Apply-Fenster privat.

api_keys und api_access_audit_log existieren nach Apply.

Public Evidence enthält keine DSN-, Passwort-, Key-, Hash-, Header- oder Ziel-URL-Werte.

Deny-Smoke liefert 401/deny und schreibt nur sanitisiertes Audit.

Produktive Key-Ausgabe bleibt blockiert, bis Pepper, HMAC, Domain-Claim und Betreiberrolle privat freigegeben sind.

Go-live-Dossier nennt Rollback, Stop-Bedingungen und Nachlaufbeobachtung.

Migration-Artefakte

Preflight-Liste für die DB-Verantwortung

Evidence JSON
Erforderlich2 Bereit0 Fehlend2 Admin-DSNnicht erforderlich
API-Key-Tabelle missing · Pflicht für Key-Store

Speichert nur Prefix, Hash, Scopes, Status, Ablauf und Revocation-Metadaten.

infra/postgres/migrations/api-access.sql mit kurzlebigem Admin-DSN aus sicherer Shell anwenden.
API-Access-Auditlog missing · Pflicht für Key-Store

Append-only Auditlog für Key-Prefix, Scope, Route, Entscheidung, Status und Hash-Evidence.

infra/postgres/migrations/api-access.sql mit kurzlebigem Admin-DSN aus sicherer Shell anwenden.
Scan-Results-Basistabelle optional_missing · Basisartefakt

Vorhandene Reportbasis für Public- und Operator-Read-Flows.

Basisinstallation prüfen; Scan-Results-Tabelle sollte für Reports vorhanden sein.

API-Access-Storage

Migration und Tabellenstatus

Runtime Probe
API-Key-Store Tabellen bereit

api_keys: vorhanden · api_access_audit_log: vorhanden

Nur Tabellenstatus, Hashes und Privilegstatus; keine DSN, Passwörter, Roh-DB-User, Hosts, Ports, API-Keys oder Key-Hashes.
CREATE public
nein
Migration
infra/postgres/migrations/api-access.sql
SHA-256
27d802d48887d084e9132c84
Preflight
scripts/run-api-access-migration-preflight.sh

Runtime

Was serverseitig bereits implementiert ist

Runtime Probe
Key-Store- und Hash-Vertrag im Backend vorhanden implemented

Migration deklariert api_keys mit Prefix/Hash/Scopes/Status; Storage liest Key-Records ohne Roh-Key-Export.

Mit Migration, Secret-Referenzen und Smoke-Tests produktiv verifizieren.
Scope-Enforcement im Operator-Probe vorhanden implemented

/api/operator/probe vergleicht angeforderten Scope mit dem Key-Record und auditiert Deny-Entscheidungen.

Mit Migration, Secret-Referenzen und Smoke-Tests produktiv verifizieren.
Access-Audit mit Fallback vorhanden implemented

Postgres-Audit und File-Fallback schreiben sanitisierte Events; Fallback-Events letzte 24h: 0.

Mit Migration, Secret-Referenzen und Smoke-Tests produktiv verifizieren.
Rate-Limit-Gate im Operator-Probe vorhanden implemented

Operator-Probe prüft ein serverseitiges Rate-Limit vor Auth-/Scope-Entscheidung und auditiert 429.

Mit Migration, Secret-Referenzen und Smoke-Tests produktiv verifizieren.
Revocation- und Expiry-Checks vorhanden implemented

Key-Status revoked/expired und expires_at werden vor Allow-Entscheidung geprüft.

Mit Migration, Secret-Referenzen und Smoke-Tests produktiv verifizieren.
Domain-Scope-Gate vorhanden implemented

Operator-Probe erzwingt Domain-Scope für Operator-Scopes und auditiert Domain-Scope-Mismatches nur mit Hash-Evidence.

Mit Migration, Secret-Referenzen und Smoke-Tests produktiv verifizieren.
Write-HMAC- und Idempotency-Gate vorhanden implemented

Write-Scopes verlangen X-SaferPage-Signature und X-SaferPage-Idempotency-Key; Secret bleibt Server-Env.

Mit Migration, Secret-Referenzen und Smoke-Tests produktiv verifizieren.

Produktive Freigabe

Was echte Key-Ausstellung weiter blockiert

Runbook
Gehashter Key-Store produktiv required · IT/Security · SAFERPAGE_API_KEY_STORE_READY

Server-Freigabe SAFERPAGE_API_KEY_STORE_READY ist nicht aktiv.

Key-Store mit Hashing, Prefix und Revocation-Feldern bereitstellen.
Serverseitige Scope-Prüfung required · Backend · SAFERPAGE_API_SCOPE_ENFORCEMENT_READY

Server-Freigabe SAFERPAGE_API_SCOPE_ENFORCEMENT_READY ist nicht aktiv.

Middleware für Scope, Domain-Claim und Method-Policy aktivieren.
Access-Auditlog aktiv required · Compliance/IT · SAFERPAGE_API_ACCESS_AUDIT_READY

Server-Freigabe SAFERPAGE_API_ACCESS_AUDIT_READY ist nicht aktiv.

Append-only Auditlog mit Request-ID, Scope, Entscheidung und Statuscode anbinden.
Rate-Limits je Key und Scope required · Platform · SAFERPAGE_API_RATE_LIMIT_READY

Server-Freigabe SAFERPAGE_API_RATE_LIMIT_READY ist nicht aktiv.

Rate-Limit-Store und Stop-Condition für Schreibpfade aktivieren.
Sofortige Sperrung und Rotation required · IT/Security · SAFERPAGE_API_REVOCATION_READY

Server-Freigabe SAFERPAGE_API_REVOCATION_READY ist nicht aktiv.

Revocation-Check vor Scope-Entscheidung ausführen und Rotation dokumentieren.
Domain-Claim vor Operator-Zugriff required · Programm-Verantwortung · SAFERPAGE_API_DOMAIN_CLAIM_READY

Server-Freigabe SAFERPAGE_API_DOMAIN_CLAIM_READY ist nicht aktiv.

Domain-Verifizierung und Rollenfreigabe vor Key-Ausstellung erzwingen.
HMAC für Schreib- und Webhook-Pfade required · IT/Security · SAFERPAGE_API_WRITE_HMAC_READY

Server-Freigabe SAFERPAGE_API_WRITE_HMAC_READY ist nicht aktiv.

X-SaferPage-Signature und X-SaferPage-Idempotency-Key für Write-Scopes erzwingen.

Write-HMAC

Test-Fixture für schreibende Operator-API-Clients

Runtime Probe JSON
HMAC-SHA256 X-SaferPage-Signature · X-SaferPage-Idempotency-Key

Client berechnet über exakt diesen kanonischen String dieselbe Signatur und sendet sie mit Idempotency-Key.

Öffentlicher Testfall für Operator-API-Write-Clients. Nicht als produktives Secret verwenden.
Scope
nachweise:write
Idempotency
sp-api-write-test-fixture
SHA-256
16e4a7e04cf94f5ad6bc986e
Signatur
sha256=aa2e6130e9eeb1bd9d3b92f4d

Developer Onboarding

Quickstarts ohne Secret-Leak

Markdown
Read-Probe mit Bearer-Key curl · reports:read

Bearer-Key nur aus Secret Manager oder Server-Env laden; nie in Browser, Logs oder Public Config schreiben.

401 ohne Authorization oder 403 bei fehlendem Scope/Domain-Claim.
curl -fsS "https://saferpage.de/api/operator/probe?scope=reports:read&domain=anrufer.info" -H "Authorization: Bearer ${SAFERPAGE_API_KEY}"
Node.js Write-HMAC node · nachweise:write

HMAC-Secret serverseitig halten; Idempotency-Key pro logischem Auftrag stabil setzen.

401/403/409 bei fehlender Signatur, falschem Scope oder wiederverwendetem Idempotency-Key.
crypto.createHmac("sha256", process.env.SAFERPAGE_API_WRITE_HMAC_SECRET).update(canonical).digest("hex")
PHP Server-Client php · portfolio:read

Key aus getenv lesen; Exception-Handler darf Authorization-Header nicht loggen.

401 bis Key-Store, Domain-Claim und Scope-Gate produktiv freigegeben sind.
$headers = ["Authorization: Bearer " . getenv("SAFERPAGE_API_KEY")];
CI-Dry-run ohne echten Key ci · schemas:read

CI nutzt nur Public Probe und Fixture-Signaturen; keine Live-Keys in Pull Requests.

Protected Routen bleiben im CI ohne Key denied.
curl -fsS https://saferpage.de/api-zugriff/runtime-gate-probe-json | jq .metrics

Integration Launch Kit

OpenAPI, Postman, SDKs und Sandbox-Abnahme

Dieses Paket macht Integrationen planbar, ohne echte Keys, Webhook-Secrets, Empfänger, Betreiberidentitäten oder private Payloads zu veröffentlichen.

Launch Kit exportieren
6OpenAPI-Vertrag 5Postman-Smokes 5SDK-Sprachen 6Sandbox-Schritte 5Webhook-Abnahme 4Support-SLOs
OpenAPI-Vertrag

Bearer-Auth als Security Scheme

Authorization: Bearer ${SAFERPAGE_API_KEY}; Roh-Key nie in Beispiele oder Public-Exports schreiben.

Scopes als x-saferpage-scopes

Jede geschützte Route nennt erlaubte Scopes, Domain-Scope und Risiko-Tier.

Sanitisierte Fehlerstruktur

code, message, request_id, retry_after und decision; keine Secrets, Header oder Rohpayloads.

Rate-Limit-Header

Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining und X-RateLimit-Reset als Client-Vertrag.

Write-HMAC Extension

x-saferpage-hmac mit Canonical-String, Idempotency-Key und Negativtests aus Fixture.

Request-ID und Audit-Korrelation

Clients senden oder übernehmen X-Request-ID; Audit exportiert nur Prefix, Scope, Entscheidung und Hashes.
Postman/Smoke Collection

runtime_gate_probe

Public Runtime-Vertrag und Deny-Fixtures abrufen.

missing_authorization_deny

401-Deny ohne Authorization reproduzieren.

operator_read_probe

Read-Key nach Go-live prüfen.

operator_write_hmac_probe

Write-HMAC und Idempotency testen.

revocation_probe

Widerrufener oder abgelaufener Key muss 403 liefern.
SDK-Readiness

Node.js

fetch oder undici, crypto.createHmac, AbortController

PHP

curl/ext-openssl, getenv, PSR-3 Redaction

Python

requests/httpx, hmac, uuid, backoff

Go

net/http, crypto/hmac, context timeout

CI/curl

curl, jq, masked secrets
Sandbox-Onboarding

Public Contract lesen

Runtime-Gate-Probe, Scope-Matrix, Fehlervertrag und No-Secret-Grenzen prüfen.

Deny-Smoke ausführen

Ohne Authorization 401 und sanitisiertes Audit erwarten.

Domain-Claim vorbereiten

Betreiberrolle, Domain-Scope und Zweckbindung vor Key-Ausgabe dokumentieren.

Read-Key testen

Test-Key einmal anzeigen, in Secret Manager legen und Read-Probe ausführen.

Write-HMAC testen

Canonical-String, Signatur und Idempotency-Key gegen Fixture prüfen.

Rotation proben

Dual-run, Client-Switch, Revocation und 24h-Nachlauf durchführen.
Webhook-Receiver-Abnahme

Receiver validiert HMAC

X-SaferPage-Signature wird mit konstantzeitlichem Vergleich geprüft.

Receiver speichert Idempotency-Key

Doppelte Write-Requests erzeugen keine zweite externe Aktion.

Retry ist nebenwirkungsarm

409/429/5xx werden mit Backoff und Jitter behandelt.

Payload minimiert

Keine Roh-Cookies, Authorization-Header, Besucherlogs oder private Dokument-URLs.

Receiver-Logs redacted

Logs enthalten Request-ID, Prefix und Entscheidung, aber keine Secrets.
Support-SLO

sev1_key_leak_suspected

Key pausieren, Prefix auditieren, Rotation erzwingen.

sev2_write_delivery_blocked

HMAC, Idempotency, 409/429 und Receiver-Antwort prüfen.

sev3_scope_or_domain_denied

Scope-Matrix, Domain-Claim und Betreiberrolle prüfen.

sev4_docs_or_sdk_question

Quickstart, OpenAPI/Postman oder SDK-Beispiel aktualisieren.

Client-Vertrag

Fehler, Rotation und Abnahme

JSON
400 bad_request

Pflichtparameter, Domain oder Scope fehlt.

Request lokal validieren; keine Wiederholung ohne Korrektur.
401 missing_or_invalid_authorization

Bearer-Key fehlt, ist falsch formatiert oder kann nicht verifiziert werden.

Secret-Quelle prüfen; Key nicht in Logs ausgeben.
403 scope_or_domain_denied

Key ist gültig, aber Scope, Domain-Claim oder Status erlaubt den Zugriff nicht.

Scope-Matrix und Domain-Freigabe prüfen.
409 idempotency_conflict

Write-Request kollidiert mit vorhandenem Idempotency-Key oder Payload.

Duplikat behandeln; keinen neuen Key für denselben Auftrag erzeugen.
429 rate_limited

Key-, Scope- oder IP-bezogenes Limit erreicht.

Retry-After beachten, Backoff mit Jitter verwenden.
500 server_error_sanitized

Serverfehler ohne Secret- oder Rohpayload-Details.

Request-ID an Support geben; keine Secrets mitsenden.

Rotation

Key-Wechsel und Revocation proben

Smoke
1. Neuen Key vorbereiten

Neuen Key mit identischen oder reduzierten Scopes und maximal 90 Tagen Laufzeit erstellen.

IT/Security · Evidence: key_prefix, scopes, expires_at, reviewer
2. Dual-run testen

Read- und Write-Dry-runs mit neuem Key ausführen, ohne alten Key zu widerrufen.

Integration-Verantwortung · Evidence: Deny-/Allow-Smoke, HMAC-Fixture, Audit-Event
3. Client umstellen

Secret Manager aktualisieren und Dienste kontrolliert neu starten.

Platform/DevOps · Evidence: Deploy-ID, Key-Prefix, Zeitpunkt
4. Alten Key widerrufen

Alten Key auf revoked setzen und sicherstellen, dass der nächste Request denied wird.

IT/Security · Evidence: revoked_at, deny_audit_event
5. Nachlauf prüfen

Auditlog auf Nutzung alter Prefixe, Rate-Limits und Scope-Mismatches prüfen.

Compliance/IT · Evidence: 24h Audit-Auszug ohne Roh-Keys

Client-Abnahme

Was vor dem ersten produktiven Key stimmen muss

Go-live JSON
Kein API-Key im Browser

Keys werden nur serverseitig genutzt; Frontend, HTML, JS und Mobile-Bundles enthalten keine Secrets.

required_before_live
Least-Privilege-Scopes

Jeder Client bekommt nur benötigte Scopes und Domain-/Portfolio-Grenzen.

required_before_live
Request-ID und Audit

Jeder Client sendet oder akzeptiert Request-ID; Deny/Allow wird sanitisiert auditiert.

required_before_live
Retry/Backoff

Clients behandeln 409/429 deterministisch und wiederholen nicht unkontrolliert.

required_before_live
Write-HMAC und Idempotency

Schreibende Clients signieren Payload-Kontext und setzen Idempotency-Key.

required_before_write_live
Rotation geprobt

Rotation und Revocation sind vor dem ersten Produktiv-Key mit Fixture-Key dokumentiert.

required_before_live

Issuance Receipt

Key-Ausstellung nur mit Signoff, Limits und Nachlauf

Der Receipt beschreibt den produktionsnahen Key-Ausgabeprozess ohne echte Keys, Hashes oder Betreiberidentitäten. Damit werden Onboarding, Abuse-Stop und Rotation vor dem ersten produktiven Key prüfbar.

Receipt exportieren
6Signoff-Punkte 5Rate-Limit-Tiers 5Abuse-Schritte 5Watch-Signale
Issuance-Signoff

Requester und Betreiberrolle verifiziert · required_before_key

OIDC/MFA, Betreiberkonto und Domain-Claim sind vor Key-Erzeugung bestätigt.

Scopes und Domain-Grenzen freigegeben · required_before_key

Scope-Matrix, Domain-Scope und Zweckbindung sind dokumentiert.

Ablaufdatum gesetzt · required_before_key

Produktive Keys maximal 90 Tage; Test-Keys kürzer.

One-time Display akzeptiert · required_before_key

Raw-Key wird nur einmal angezeigt, nie gespeichert und nie exportiert.

Deny-/Allow-Smoke geplant · required_before_live

401/403/429/Revocation-Fixtures und Request-ID werden vor Go-live geprüft.

Rotationsverantwortung gesetzt · required_before_live

Verantwortlichkeit, Rotationstermin, Revocation-Pfad und Notfallkontakt sind bekannt.
Rate Limits

public_read

cachebar, pro IP begrenzt

operator_read

pro Key und Domain moderat

evidence_read

streng pro Key und Report-Pack

operator_write

sehr streng mit Idempotency

admin

MFA/Vier-Augen, kein Burst
Abuse Response

Anomalie erkennen

Key-Prefix, Scope, Domain-Hash und Request-ID ohne Raw-Key prüfen.

Key pausieren

status=revoked oder rotating setzen; keine Roh-Keys exportieren.

Client informieren

Sanitisierte Fehlermeldung mit Prefix, Zeitraum und Request-IDs senden.

Rotation erzwingen

Neuen Key mit reduzierten Scopes ausstellen und alten Key denied testen.

Nachlauf auditieren

Auditlog auf alte Prefixe, Rate-Limits und Scope-Mismatches prüfen.
Nachlauf

first_successful_request

Genau erwartete Domain/Scope-Kombination, Request-ID vorhanden.

denied_request_ratio

Deny-Anteil plausibel; keine wiederholten 401/403-Schleifen.

rate_limit_events

429 selten; Client beachtet Retry-After und Backoff.

write_idempotency_conflicts

Keine unkontrollierten 409-Wiederholungen.

old_prefix_usage_after_rotation

Alter Prefix erzeugt nur Deny-Audit, keine Allow-Events.

Scope-Matrix

Jede Route braucht Zweck, Risiko und Entscheidung

API-Katalog
reports.public:read public · GET · Risiko niedrig

ohne Key oder Public-Key mit Cache erlaubt

/{domain}, /{domain}/share-card-json, /badge/{domain}
schemas:read public · GET · Risiko niedrig

öffentlich cachebar

/schemas, /schemas/{schema}.v1
reports:read operator_read · GET · Risiko mittel

Domain-Claim und Operator-Key erforderlich

/{domain}/module-export, /report-pack/{domain}/export
portfolio:read operator_read · GET · Risiko mittel

Portfolio-Zuordnung prüfen

/portfolio/export, /portfolio/audit-json, /portfolio/schedule-json
evidence:read operator_read · GET · Risiko hoch

Sanitization, Domain-Claim und Auditlog erforderlich

/nachweise/{domain}/export, /api/report/export
nachweise:write operator_write · POST · Risiko hoch

HMAC, Idempotency-Key und Zielsystem-Dry-Run erforderlich

Nachweispositions-Delivery
dispatch:write operator_write · POST · Risiko hoch

Betreiberfreigabe, Rate-Limit und Stop-Conditions erforderlich

Scan-Dispatch und Alert-Dispatch
keys:rotate admin · POST · Risiko kritisch

OIDC/MFA, Vier-Augen-Gate und Auditlog erforderlich

Key-Rotation und Revocation

Auditlog

Nachweis ohne Rohdaten und ohne Secrets

Schema
event_id uuid · required
request_id uuid · required
key_prefix text · allowed
key_hash never_export · forbidden
operator_subject_hash sha256 · redacted
domain_scope_hash sha256_or_domain_if_public · redacted
scope text · required
endpoint route_id · required
method GET|POST|PATCH|DELETE · required
decision allow|deny|rate_limited|revoked|expired · required
status_code int · required
ip_hash sha256_with_rotation_salt · redacted
user_agent_hash sha256 · redacted
created_at timestamptz · required