DSGVO von Grund auf, und jede Zusage getestet
Eine Adresse ist ein personenbezogenes Datum. Diese Seite listet genau auf, was Addrova protokolliert, speichert und nie aufbewahrt. Jede Aussage hat eine Kennung und ist mit einem automatisierten Test verknüpft, der bei jeder Codeänderung läuft.
Die Zusagen zur Log-Freiheit
In diesen Tabellen bedeutet „Adresse“ jede Eingabe des Kunden: Freitext, Komponenten, angefragte Koordinaten, Stapeldateien. Maßgeblich ist die Zero-Log-Spezifikation der API, auf Französisch; diese Seite übersetzt sie, ohne ihre Bedeutung zu ändern.
Version der Spezifikation vom 2026-10-19
Was protokolliert wird (vollständige Liste)
| Kennung | Aussage | Automatisierter Test |
|---|---|---|
| ZL-01 | Eine Zeile pro HTTP-Anfrage, mit genau: Methode, Routenvorlage (/v1/geocode, nie die echte URL oder der Query-String), Status, Dauer, pseudonymisierter Mandant, zufällige Anfragekennung. Keine IP-Adresse, kein User-Agent, kein API-Schlüssel. | api/tests/test_zerolog.py::test_access_log_exact_fields |
| ZL-02 | Die einzigen anderen vom Code von Addrova ausgegebenen Meldungen sind die im nachstehenden Inventar; ihre Parameter sind Job-Kennungen, Zähler, Status oder Namen von Ausnahmetypen. | api/tests/test_privacy_claims.py::test_log_inventory_matches_code |
| ZL-03 | Der Mandant wird überall pseudonymisiert (Logs, Traces): 16 Hexadezimalzeichen eines gesalzenen SHA-256 seiner Kennung; die Klartextkennung erscheint nie. | api/tests/test_observability.py::test_tenant_hash_is_stable_and_opaqueapi/tests/test_zerolog.py::test_access_log_exact_fields |
Was nie protokolliert oder getraced wird
| Kennung | Aussage | Automatisierter Test |
|---|---|---|
| ZL-10 | Keine Adresse, keine angefragte Koordinate und kein API-Schlüssel erscheint in den Logs, auf allen Routen (Geokodierung, Rückwärts-Geokodierung, Autovervollständigung, Korrektur, Stapel, Google- und Nominatim-Kompatibilität), auch im Fehlerfall (Engine ausgefallen, abgelehnte Eingabe, ungültiger Parameter, falscher Schlüssel, unbekannte Route). | api/tests/test_zerolog.py::test_canary_never_logged |
| ZL-11 | Meldungen von Drittbibliotheken werden neutralisiert: Parameter maskiert, Query-String gelöscht, Ausnahme auf ihren Typ reduziert (ohne Meldung und Trace). | api/tests/test_zerolog.py::test_third_party_logger_args_and_query_redacted |
| ZL-12 | Fehlerantworten geben weder den fehlerhaften Wert noch die interne Meldung der Engine zurück. | api/tests/test_api.py::test_geocode_invalid_paramsapi/tests/test_api.py::test_engine_errors_do_not_echo_query |
| ZL-13 | OpenTelemetry-Traces tragen nur Attribute einer Positivliste (Methode, Routenvorlage, Status, pseudonymisierter Mandant, Engine-Operation, Land, Anzahl der Ergebnisse, Genauigkeit des ersten Ergebnisses), ohne Ereignisse; weder Adresse noch Koordinate noch Schlüssel noch Klartext-Mandantenkennung. | api/tests/test_observability.py::test_spans_carry_only_allowlisted_attributesapi/tests/test_observability.py::test_span_content |
| ZL-15 | Konsole: E-Mail-Adresse, Magic-Link-Token und Sitzungs-Token erscheinen in keinem Log. | api/tests/test_console.py::test_email_and_tokens_never_logged |
| ZL-16 | Öffentliche Demo der Website (/demo/v1): Weder die eingegebene Adresse noch die IP-Adresse des Besuchers erscheint in den Logs; die IP wird nie gespeichert, nur ein HMAC-Fingerabdruck mit täglich wechselndem Geheimnis (nach der Rotation unbrauchbar) dient zum Zählen der Anfragen. | api/tests/test_demo.py::test_demo_never_logs_address_or_ipapi/tests/test_demo.py::test_fingerprint_rotates_daily_and_hides_ipapi/tests/test_demo.py::test_redis_mode_shares_secret_and_counters |
| ZL-14 | Prometheus-Metriken haben nur Labels mit begrenzten Werten; ein unbekannter Pfad wird als <unmatched> gezählt. | api/tests/test_observability.py::test_metrics_labels_are_boundedapi/tests/test_observability.py::test_spans_carry_only_allowlisted_attributes |
Was gespeichert wird, und wie lange
| Kennung | Aussage | Automatisierter Test |
|---|---|---|
| ZL-20 | API-Schlüssel werden nur als SHA-256-Fingerabdruck gespeichert (plus 12 Zeichen Präfix zur Anzeige). | api/tests/test_tenancy_persistent.py::test_keys_are_hashed_and_revocable |
| ZL-21 | Die Datenbank enthält weder Anfrage noch Ergebnis: nur Mandanten, Schlüssel (Fingerabdrücke) und Nutzungszähler (Mandant, Tag, Endpunkt, Anzahl). | api/tests/test_privacy_claims.py::test_schema_has_no_content_columns |
| ZL-22 | Stapel: Die Eingabedatei wird gelöscht, sobald die Verarbeitung endet; das Ergebnis und die Job-Metadaten werden am Ende der Aufbewahrungsfrist gelöscht (standardmäßig 1 Stunde nach Abschluss, konfigurierbar) oder sofort bei DELETE; ein nie verarbeiteter Job wird nach 24 Stunden bereinigt. | api/tests/test_batch.py::test_csv_roundtrip_usage_and_input_purgeapi/tests/test_batch.py::test_isolation_delete_and_expiryapi/tests/test_batch.py::test_result_purged_after_retention |
| ZL-23 | Die Metadaten eines Stapel-Jobs enthalten keine Zeile der Datei (Zähler, Daten, Spaltennamen, Standardland). | api/tests/test_privacy_claims.py::test_batch_metadata_has_no_row_content |
| ZL-25 | Konsole: Das einzige gespeicherte personenbezogene Datum ist die E-Mail-Adresse des Kontos (und die eines laufenden Anmeldelinks, 15 Minuten gültig, einmalig verwendbar); Link- und Sitzungs-Token werden nur als SHA-256-Fingerabdruck gespeichert. | api/tests/test_privacy_claims.py::test_schema_has_no_content_columnsapi/tests/test_console.py::test_link_is_single_use_and_logout |
| ZL-26 | Eine Organisation sieht weder die Schlüssel noch die Nutzung einer anderen; ein widerrufener oder abgelaufener (rotierter) Schlüssel wird abgelehnt. | api/tests/test_console.py::test_org_isolationapi/tests/test_console.py::test_keys_lifecycle_and_plan_limit |
| ZL-27 | Webhook am Ende eines Stapels: Die Nutzlast enthält nur Kennung, Status, Zähler und Links des Jobs, nie eine Zeile der Datei und keine Adresse; URL und Geheimnis des Webhooks werden nie protokolliert. | api/tests/test_batch_stream.py::test_webhook_delivery_signed_without_addresses_and_retried |
| ZL-28 | Idempotenz (Idempotency-Key): Nur ein SHA-256-Fingerabdruck der Anfrage (und bei einem Stapel die Job-Kennung) wird 24 Stunden lang aufbewahrt, nie die gesendete Adresse und nie die Antwort. | api/tests/test_idempotency_versioning.py::test_idempotency_never_stores_addressapi/tests/test_idempotency_versioning.py::test_in_progress_conflict_and_stores_keep_no_content |
| ZL-29 | Kein nicht deklarierter ausgehender Netzwerkverkehr: Im Namespace wird standardmäßig alles verweigert; die Website hat keinen ausgehenden Verkehr; die API erreicht nur den Cluster-DNS, ihre Datenbanken (PostgreSQL, Redis), den internen OTel-Collector und, für Webhooks, HTTPS ins öffentliche Internet (private, lokale und Metadaten-Bereiche ausgeschlossen). Kein Analysewerkzeug eines Dritten kann eine Anfrage erhalten. | api/tests/test_k8s_hardening.py::test_egress_is_limited_to_declared_flowsapi/tests/test_k8s_hardening.py::test_namespace_is_restricted_and_denies_by_default |
| ZL-24 | Der Stapel-Job eines Kunden ist für andere Kunden unsichtbar. | api/tests/test_batch.py::test_isolation_delete_and_expiry |
Was (noch) nicht existiert
| Kennung | Aussage | Automatisierter Test |
|---|---|---|
| ZL-30 | Der asynchrone Fallback von /v1/repair (LLM) ist deaktiviert: kein externer Aufruf, keine Adresse verlässt den Dienst. | api/tests/test_repair.py::test_repair_unrepairable_and_async_disabled |
| ZL-32 | In v0 wird keine E-Mail tatsächlich versendet (In-Memory-Postausgang) und kein echter Abrechnungsanbieter angebunden (Platzhalter-Anbieter). | api/tests/test_privacy_claims.py::test_no_external_transport_by_default |
| ZL-31 | In v0 ist kein Ergebnis-Cache vorhanden (der HMAC-Cache mit rotierendem Geheimnis aus ADR 0005 ist noch nicht umgesetzt). | api/tests/test_privacy_claims.py::test_no_result_cache_in_v0 |
Inventar der Log-Meldungen
Dies sind die einzigen Meldungen, die der Code ausgibt, im genauen Format. Ein Test schlägt fehl, wenn Code und diese Liste auseinanderlaufen.
%s %s %d %.1fms tenant=%s rid=%s
job %s queued rows=%d
job %s %s rows=%d matched=%d
job %s failed: %s
engine loaded: %s
addrova_engine not installed, using the fake engine
usage flush failed: %s
index preloaded: %d bytes
webhook job %s attempt %d status %s
engine contract violation: candidate without source
engine failure: %sAußerhalb des Umfangs dieser Tests
Diese Punkte werden anders geprüft, und das sagen wir offen:
- Ingress / Proxy: Sein Zugriffslog muss auf den API-Routen deaktiviert sein (ADR 0004); Infrastrukturkonfiguration, in infra/ und auf dem Cluster zu prüfen.
- Engine (addrova_engine): Sie verpflichtet sich, keine Anfragen zu protokollieren (ADR 0002); ihre eigenen Tests prüfen das.
- Export der Traces: nur wenn ADDROVA_OTLP_ENDPOINT gesetzt ist, an einen in der EU gehosteten Collector; ohne diese Einstellung verlässt kein Trace den Prozess.
- Speicherung der Stapeldateien: v0 auf der lokalen Platte des Containers (Rechte 0600); verschlüsselter EU-Objektspeicher ist für die Produktion geplant (ADR 0006, ADR 0009).
Was nicht aufbewahrt wird, wird nicht wiederverwendet
Addrova verwendet Ihre Anfragen nicht, um Modelle zu trainieren, Datensätze aufzubauen oder den Index zu erweitern, und der Code setzt das konkret um: Anfragen und Ergebnisse werden nie protokolliert (ZL-10), die Datenbank enthält weder Anfrage noch Ergebnis (ZL-21), Stapeldateien werden nach der Verarbeitung gelöscht (ZL-22), es gibt keinen Ergebnis-Cache (ZL-31) und keine Adresse wird an einen externen Dienst gesendet (ZL-30).
Noch nicht zugesagt
- Hosting ausschließlich in der EU: Hosting-Anbieter und Region sind noch nicht veröffentlicht. [À VÉRIFIER]
- Unterauftragsverarbeiter und Auftragsverarbeitungsvertrag (AVV): werden vor dem Start veröffentlicht, mit Online-Unterzeichnung. [À VÉRIFIER]
- Zertifizierungen: keine zugesagt. ISO 27001 ist für eine spätere Phase geplant.
Datenquellen und Lizenzen
Wir stützen uns auf offizielle offene Daten unter offenen Lizenzen (für Frankreich die Licence Ouverte 2.0). Jede API-Antwort enthält eine Attributionsliste mit den Quellen. Daten unter Share-Alike-Lizenzen wie OpenStreetMap liegen in einem getrennten Index und werden nie mit dem offiziellen vermischt.
Fragen zum Datenschutz
Kann ich diese Zusagen überprüfen?
Jede Zusage nennt den automatisierten Test, der sie prüft. Die Tests laufen bei jeder Änderung; einer davon schlägt fehl, wenn ein genannter Test verschwindet oder das Log-Inventar nicht mehr zum Code passt. Der Zugang zur Testsuite für Audits ist noch zu klären. [À VÉRIFIER]
Protokollieren Sie meine IP-Adresse?
Die Anwendung nicht: Ihr Zugriffslog enthält keine IP-Adresse, keinen User-Agent und keinen API-Schlüssel (ZL-01). Auch beim vorgeschalteten Ingress muss das Zugriffslog deaktiviert sein; das ist eine Infrastruktureinstellung und oben als außerhalb des Testumfangs aufgeführt.
Wie lange werden Stapelergebnisse aufbewahrt?
Standardmäßig eine Stunde nach Abschluss oder bis Sie den Job löschen (ZL-22). Die Eingabedatei wird gelöscht, sobald die Verarbeitung endet.