GDPR & Προστασία Δεδομένων
Προστασία Δεδομένων από τον Σχεδιασμό
Το qr3.app είναι κατασκευασμένο από την αρχή ώστε να είναι συμβατό με τον GDPR:
- Ψευδωνυμοποίηση IP — Οι διευθύνσεις IP μετατρέπονται αμέσως σε ημερήσια ψευδώνυμα HMAC-SHA-256 UTC στον Edge Worker. Η αρχική IP δεν αποθηκεύεται ποτέ· το ψευδώνυμο παραμένει δεδομένο προσωπικού χαρακτήρα.
- Ελαχιστοποίηση δεδομένων — Συλλέγονται μόνο τα δεδομένα που είναι απαραίτητα για τη λειτουργία.
Privacy-API
Σύνοψη δεδομένων (Άρθρο 15 GDPR)
GET /v1/account/privacy — Επιστρέφει μια επισκόπηση όλων των αποθηκευμένων δεδομένων.
curl https://qr3.app/v1/account/privacy \ -H "Authorization: Bearer qr3_sk_..."Response:
{ "data": { "workspace_id": "ws_xxx", "organization_id": "org_xxx", "account": { "name": "Alex Example", "locale": "en", "created_at": "2026-01-15T09:00:00.000Z" }, "stored_data": { "qr_codes": 42, "scan_records": 15000, "dpp_scan_records": 3200, "dashboard_activity_records": 0, "dashboard_document_activity_records": 36, "api_operation_records": 180, "webhook_delivery_records": 640, "api_keys": 2, "webhooks": 1, "dpp_passports": 12, "dpp_documents": 30, "files": 4, "gs1_identifiers": 2, "gs1_verification_requests": 1, "code_comments": 5, "audit_log_entries": 0, "dpp_import_jobs": 1, "workspace_members": 3, "scan_quota_alerts": 1 }, "gdpr_rights": { "access": "GET /v1/account/privacy", "export": "GET /v1/account/export", "erasure": "DELETE /v1/account", "consents": "GET /v1/account/privacy/consents" }, "data_processing": { "ip_storage": "Purpose-separated HMAC-SHA-256 UTC-day IP pseudonym — pseudonymous personal data", "scan_retention": "90 days by default", "usage_retention": "90 UTC days", "webhook_delivery_retention": "90 UTC days", "pii_in_export": true, "erasure": "DELETE /v1/account erases the person's account: organizations they own with all workspaces and data (unless another org admin takes them over), their memberships in other organizations, their login and their Stripe customer. A running subscription ends immediately, without refund.", "backup_retention": "Erased rows stay restorable from the database backups (Cloudflare D1 Time Travel) for up to 30 days, then they are gone.", "billing_records": "Invoices stay with Stripe for the statutory retention period (7 years, § 132 BAO)." } }, "meta": { "request_id": "req_xxx" }}Το stored_data μετρά τις αποθηκευμένες εγγραφές. Τα scan_records είναι σαρώσεις κωδικών QR, τα dpp_scan_records αιτήματα προς διαβατήρια προϊόντος μέσω του δημόσιου DPP Resolver. Και τα δύο περιέχουν το ψευδώνυμο IP.
Τα dashboard_activity_records και dashboard_document_activity_records μετρούν τις ημέρες κατά τις οποίες ένα μέλος άνοιξε το dashboard (δύο πίνακες), τα api_operation_records τους ημερήσιους μετρητές αιτημάτων ανά API key, λειτουργία και αποτέλεσμα και τα webhook_delivery_records τις απόπειρες παράδοσης webhook, συμπεριλαμβανομένων εκείνων διαγραμμένων webhooks. Κανένα δεν αποθηκεύει διεύθυνση IP ή User-Agent· το αρχείο καταγραφής παράδοσης αποθηκεύει όμως το payload του συμβάντος και το πρώτο kilobyte (1 KB) της απόκρισης του παραλήπτη. Και τα τέσσερα διαγράφονται μετά από 90 ημέρες UTC (usage_retention, webhook_delivery_retention).
Το account αναφέρει το πρόσωπο πίσω από το αίτημα — στο dashboard το συνδεδεμένο πρόσωπο, αλλιώς το πρόσωπο που δημιούργησε το κλειδί — με email, όνομα, γλώσσα και ημερομηνία δημιουργίας· για ένα Publishable Key είναι null. Οι υπόλοιποι μετρητές καλύπτουν κάθε άλλο πίνακα με δεδομένα του λογαριασμού: διαβατήρια προϊόντων, έγγραφα DPP, αρχεία, αναγνωριστικά GS1, σχόλια, εγγραφές ελέγχου, εκτελέσεις εισαγωγής, μέλη του workspace και τις ειδοποιήσεις ορίου του οργανισμού (scan_quota_alerts). Οι γραμμές με ήπια διαγραφή μετρώνται, επειδή εξακολουθούν να αποθηκεύονται. Τα erasure, backup_retention και billing_records περιγράφουν τι διαγράφει το DELETE /v1/account και τι παραμένει για κάποιο διάστημα· το pii_in_export είναι true, επειδή η εξαγωγή αναφέρει το πρόσωπο (email, όνομα) — τα ψευδώνυμα IP δεν βγαίνουν ποτέ από τη βάση δεδομένων.
Εξαγωγή δεδομένων (Άρθρο 20 GDPR — Φορητότητα δεδομένων)
GET /v1/account/export — Πραγματοποιεί λήψη όλων των δεδομένων ως αρχείο JSON.
curl https://qr3.app/v1/account/export \ -H "Authorization: Bearer qr3_sk_..." \ -o my-data.jsonΗ εξαγωγή περιλαμβάνει:
- Όλους τους κωδικούς QR (συμπεριλαμβανομένων των διαγραμμένων)
- Συγκεντρωτικά στατιστικά στοιχεία σάρωσης (όχι ακατέργαστα IP hashes)
- Συγκεντρωτικά αιτήματα DPP ανά διαβατήριο προϊόντος (
dpp_scan_aggregates, επίσης χωρίς IP hashes) - Στατιστικά χρήσης ως συγκεντρωτικά στοιχεία (
dashboard_activity_aggregates,api_operation_aggregates): ενεργές ημέρες και αριθμός ενεργών χρηστών ανά κανάλι του dashboard, μετρητές αιτημάτων ανά λειτουργία και αποτέλεσμα — χωρίς αναγνωριστικά χρηστών και κλειδιών - Απόπειρες παράδοσης webhook ανά webhook και τύπο συμβάντος (
webhook_delivery_aggregates), χωρίς payload και απόκριση - Το πρόσωπο πίσω από το αίτημα (
account), τον οργανισμό (organization· διεύθυνση χρέωσης και ειδοποιήσεων μόνο για διαχειριστές οργανισμού) και το workspace (workspace) - Διαβατήρια προϊόντων, μεταδεδομένα εγγράφων DPP και αρχείων (όχι τα ίδια τα αρχεία), αναγνωριστικά GS1, αιτήματα επαλήθευσής τους και εκτελέσεις εισαγωγής (
dpp_passports,dpp_documents,files,gs1_identifiers,gs1_verification_requests,dpp_import_jobs) - Σχόλια χωρίς πεδία συντάκτη (
code_comments), εγγραφές ελέγχου ως συγκεντρωτικά (audit_log_aggregates) και μέλη ανά ρόλο (member_aggregates) - Κλειδιά API χωρίς ID και hash (
api_keys), webhooks χωρίς URL και μυστικό (webhooks) και τις ειδοποιήσεις ορίου του οργανισμού (scan_quota_alerts) - Χρονικές σημάνσεις δημιουργίας και τροποποίησης
Τα Publishable Keys (qr3_pk_) λαμβάνουν 403: το αρχείο περιέχει τις διευθύνσεις προορισμού και τις σημειώσεις όλων των κωδικών.
Διαγραφή λογαριασμού (Άρθρο 17 GDPR — Δικαίωμα στη λήθη)
DELETE /v1/account — Διαγράφει τον λογαριασμό του προσώπου πίσω από το αίτημα, αμέσως και αμετάκλητα: στο dashboard το συνδεδεμένο πρόσωπο, αλλιώς το πρόσωπο που δημιούργησε το κλειδί. Ένα αίτημα διαγραφής μέσω email οδηγεί στην ίδια διαγραφή: ο διαχειριστής της υπηρεσίας διαγράφει τη σύνδεση στο Clerk και στη συνέχεια το qr3 διαγράφει τον λογαριασμό.
curl -X DELETE https://qr3.app/v1/account \ -H "Authorization: Bearer qr3_sk_..."Τι συμβαίνει:
- Οι οργανισμοί που ανήκουν στο πρόσωπο διαγράφονται με όλα τα workspaces, τους κωδικούς, τα διαβατήρια προϊόντων, τα αρχεία, τα στατιστικά και τα αρχεία καταγραφής, μαζί με τα αρχεία τους στον χώρο αποθήκευσης. Αν ένας τέτοιος οργανισμός έχει άλλον ενεργό διαχειριστή οργανισμού, τον αναλαμβάνει αντί γι’ αυτό ο παλαιότερος — μαζί με τα δεδομένα και τη συνδρομή.
- Συνδρομή: μια ενεργή συνδρομή λήγει αμέσως, χωρίς αναλογική επιστροφή χρημάτων και χωρίς τελικό τιμολόγιο· στη συνέχεια διαγράφεται ο πελάτης στη Stripe. Τα τιμολόγια παραμένουν στη Stripe για τη νόμιμη περίοδο διατήρησης (7 έτη, § 132 BAO).
- Ομάδες: οι συμμετοχές του προσώπου σε άλλους οργανισμούς λήγουν· αυτές οι ομάδες διατηρούν τα δεδομένα τους. Τα σχόλια του προσώπου δεν αναφέρουν πλέον συντάκτη, οι εγγραφές ελέγχου του χάνουν το ψευδώνυμο IP και το user agent, και τα κλειδιά API που δημιούργησε εκεί ανακαλούνται.
- Το πρόσωπο: η σύνδεση (Clerk) και η εγγραφή χρήστη διαγράφονται.
Η απόκριση είναι 200 με status: "completed" και τους μετρητές organizations_deleted, organizations_transferred, memberships_removed και login_deleted. Σε πολύ μεγάλους οργανισμούς ένα αίτημα δεν αρκεί: η απόκριση είναι τότε 202 με status: "in_progress" και η διαγραφή ολοκληρώνεται αυτόματα μέσα σε λίγες ώρες.
Απαιτεί Secret ή Test Key με δικαίωμα εγγραφής ή μια συνεδρία στο dashboard (οποιοσδήποτε ρόλος, αφού πρόκειται για τον δικό του λογαριασμό). Τα Publishable Keys και τα κλειδιά μόνο ανάγνωσης λαμβάνουν 403, ένα κλειδί χωρίς πρόσωπο πίσω του (created_by = 'system') λαμβάνει 409. Το 503 σημαίνει ότι στην εγκατάσταση λείπει ένα μυστικό που χρειάζεται η διαγραφή· δεν διαγράφηκε τίποτα.
Διαχείριση συγκαταθέσεων
GET /v1/account/privacy/consents — Ανάκτηση τρεχουσών συγκαταθέσεων.
POST /v1/account/privacy/consents — Ενημέρωση συγκαταθέσεων.
# Ανάκτηση των τρεχουσών συναινέσεωνcurl https://qr3.app/v1/account/privacy/consents \ -H "Authorization: Bearer qr3_sk_..."
# Απενεργοποίηση των email μάρκετινγκcurl -X POST https://qr3.app/v1/account/privacy/consents \ -H "Authorization: Bearer qr3_sk_..." \ -H "Content-Type: application/json" \ -d '{ "marketing_emails": false, "analytics": true, "product_updates": true }'Πεδία συγκατάθεσης:
| Πεδίο | Προεπιλογή | Περιγραφή |
|---|---|---|
marketing_emails | false | Ενημερωτικά δελτία (Newsletters) και διαφημιστικά μηνύματα ηλεκτρονικού ταχυδρομείου |
analytics | true | Συγκεντρωτικά στατιστικά χρήσης |
product_updates | true | Νέα προϊόντων και αρχεία αλλαγών (changelogs) |
Η αλλαγή των συναινέσεων απαιτεί δικαιώματα εγγραφής: ο ρόλος viewer και τα Publishable Keys λαμβάνουν 403.
Τεχνική υλοποίηση GDPR
Ψευδωνυμοποίηση IP (Άρθρο 25 GDPR)
Αίτημα HTTP → Cloudflare Edge Worker ↓Κεφαλίδα CF-Connecting-IP → HMAC-SHA-256(IP_HASH_SALT, σκοπός, ημέρα UTC, IP) ↓ip_hash (ημερήσιο ψευδώνυμο) → βάση δεδομένων D1 ↓Η αρχική IP δεν αποθηκεύεται ποτέΤο IP_HASH_SALT είναι μακρόβιο κύριο μυστικό· ο σκοπός και η ημέρα UTC παράγουν αυτόματα διακριτά ημερήσια ψευδώνυμα. Ψευδώνυμα από διαφορετικές ημέρες UTC δεν είναι άμεσα ίδια, αλλά ο κάτοχος του μυστικού μπορεί να υπολογίσει ξανά έναν γνωστό υποψήφιο IP για συγκεκριμένη ημέρα. Δεν χρησιμοποιείται ημερήσιο αλάτι KV ούτε χειροκίνητη καθημερινή εναλλαγή.
Διατήρηση δεδομένων (αυτοματοποιημένη)
| Πρόγραμμα | Διατήρηση |
|---|---|
| Όλα τα προγράμματα | 90 ημέρες |
Τα στατιστικά χρήσης (δραστηριότητα στο dashboard, μετρητές χρήσης του API) και τα αρχεία καταγραφής παράδοσης webhook διατηρούνται επίσης για 90 ημέρες UTC: την τρέχουσα ημέρα UTC και τις 89 προηγούμενες. Η ίδια ημερήσια εργασία cron διαγράφει τις παλαιότερες γραμμές (purgeOldDashboardActivity, purgeOldApiOperationUsage, purgeOldWebhookDeliveries).
DPA Υπεργολάβων Επεξεργασίας
Η Cloudflare, Inc. επεξεργάζεται δεδομένα ως εκτελών την επεξεργασία. Η DPA είναι διαθέσιμη στη διεύθυνση cloudflare.com/cloudflare-customer-dpa.
Η Cloudflare επεξεργάζεται δεδομένα με υπόδειξη τοποθεσίας (location hint) στην περιοχή της ΕΕ (μεταξύ άλλων στη Φρανκφούρτη), ωστόσο μια συμβατικά διασφαλισμένη δικαιοδοσία εντός της ΕΕ δεν είναι επί του παρόντος κρατημένη. Καθώς η Cloudflare, Inc. εδρεύει στις ΗΠΑ, ως βάση διαβίβασης ισχύουν οι Τυπικές Συμβατικές Ρήτρες (SCCs) σύμφωνα με το Άρθρο 46 του GDPR.
Επικοινωνία
- Υπεύθυνος Προστασίας Δεδομένων: [email protected]
- Σύμβαση Επεξεργασίας Δεδομένων (DPA): [email protected] (κατόπιν αιτήματος)
- Πολιτική Απορρήτου: qr3.app/de/legal/datenschutz