# API Runtime Gate Probe

API Runtime Gate Probe: Public-Read-Flächen und Runtime-Kontrollen sind dokumentiert; produktive Operator-/Write-/Admin-Flows bleiben blockiert, bis 7/7 API-Key-Servergates freigegeben sind.

> Dieser Probe ist ein öffentlicher No-Secret-Nachweis. Er erstellt keine API-Keys, prüft keine echten Authorization-Header, speichert keine Hashes und führt keine Schreibaktion aus. Echte Live-Deny-Smoke-Tests sind erst nach aktivierten Server-Gates sinnvoll.

## Runtime-Gates
- **Public-Read-Exports deklariert**: passed - Schema, Matrix, Report-Share-Card und Badge sind als Public-Read-Flächen im Router sichtbar.
- **API-Runtime-Kontrollen implementiert**: passed - 7/7 Kontrollen im Backend nachweisbar: Key-Store-Vertrag, Scope, Audit, Rate-Limit, Revocation, Domain-Claim, Write-HMAC.
- **API-Key-Store und Access-Auditlog migriert**: passed - Tabellen api_keys und api_access_audit_log sind vorhanden; Audit-Events letzte 24h: 0.
- **Geschützter Operator-Probe-Endpunkt implementiert**: passed - /api/operator/probe prüft Bearer-Key, Scope, Revocation/Expiry und schreibt sanitisierte Audit-Entscheidungen.
- **Fallback-Audit für Deny-Smokes aktiv**: warning - Noch kein sanitisierter Fallback-Audit-Event in den letzten 24h sichtbar.
- **API systemd-Service-Vertrag vorhanden**: passed - saferpage-api.service und scripts/run-api-service-smoke.sh sind als Runtime-Evidence dokumentiert.
- **Keine Key-Ausstellung im öffentlichen Probe**: passed - Diese Seite erzeugt keine Keys, speichert keine Hashes und akzeptiert keine Authorization-Header.
- **Deny-Fixtures dokumentiert**: passed - 4 erwartete Deny-Entscheidungen sind ohne Live-Secret ausformuliert; 1 ist bereits live auditierbar.
- **Runtime-Middleware für Operator/API aktiv**: blocked - 0/7 API-Key-Servergates aktiv.

## Runtime-Implementierung
- **Key-Store/Hash-Vertrag implementiert**: passed - Migration und Storage-Funktionen deklarieren Prefix, Hash, Scopes, Status und Ablauf.
- **Scope-Enforcement implementiert**: passed - Operator-Probe weist Scope-Mismatches mit 403 ab und auditiert sie.
- **Access-Audit/Fallback implementiert**: passed - Postgres-Audit und File-Fallback sind implementiert; Fallback-Events 24h: 0.
- **Rate-Limit implementiert**: passed - Operator-Probe prüft Rate-Limits und auditiert 429-Entscheidungen.
- **Revocation/Expiry implementiert**: passed - Revoked/expired Keys werden vor Allow-Entscheidung abgewiesen.
- **Domain-Claim implementiert**: passed - Operator-Scopes brauchen Domain-Scope; Mismatches werden nur mit Hash-Evidence auditiert.
- **Write-HMAC implementiert**: passed - Write-Scopes verlangen HMAC-Signatur und Idempotency-Key.

## Public-Read-Probes
- `GET /schemas`: allow_public_cacheable - Router und Schema Registry deklarieren einen öffentlichen, cachebaren Schema-Katalog.
- `GET /vergleich/features-json`: allow_public_cacheable - Konkurrenzmatrix ist als öffentlicher JSON-Export deklariert.
- `GET /anrufer.info/share-card-json`: allow_public_cacheable - Kanonische Domain-Reports und Share-Cards bleiben öffentlich, ohne Betreiber-Secret.
- `GET /badge/anrufer.info/embed-json`: allow_public_cacheable - Status-Badges sind öffentliche Trust-Links ohne interne Rohdaten.

## Deny-Fixtures
- `401`: GET /api/operator/probe?scope=reports:read ohne Authorization - deny_missing_authorization
- `403`: GET /nachweise/anrufer.info/export mit Scope reports.public:read - deny_scope_mismatch
- `403`: POST Nachweispositions-Delivery ohne X-SaferPage-Signature und Idempotency-Key - deny_missing_hmac_or_idempotency
- `401`: GET Portfolio-Export mit revokiertem Key-Prefix - deny_revoked_key

## Write-HMAC-Test-Fixture
- Canonical SHA-256: `16e4a7e04cf94f5ad6bc986e4214f0e600c06100b9cef6b40fbee419f5382049`
- Erwartete Signatur: `sha256=aa2e6130e9eeb1bd9d3b92f4d2b883ece08b2b76389a01f61d99b55fed7a3b1d`
- Idempotency-Key: `sp-api-write-test-fixture`
