GDPR & Privacy
Privacy by Design
qr3.app is built GDPR-compliant from the ground up:
- IP pseudonymisation — IP addresses are immediately converted to purpose-separated HMAC-SHA-256 UTC-day pseudonyms in the edge worker. The original IP is never stored; the pseudonym remains personal data.
- Retention policies — Scan data is automatically deleted after a plan-dependent period (Free: 7 days, Pro: 90 days, Business: 1 year).
- Data minimisation — Only data necessary for operation is collected.
Privacy API
Data Summary (Art. 15 GDPR)
GET /v1/account/privacy — Returns an overview of all stored data.
curl https://qr3.app/v1/account/privacy \ -H "Authorization: Bearer qr3_sk_..."Response:
{ "data": { "workspace_id": "ws_xxx", "stored_data": { "qr_codes": { "count": 42, "oldest_at": "2026-03-01T..." }, "scan_records": { "count": 15000, "oldest_at": "2026-03-01T..." }, "api_keys": { "count": 2 }, "webhooks": { "count": 1 } }, "your_rights": { "access": "GET /v1/account/export", "erasure": "DELETE /v1/account", }, "data_processing": { "legal_basis": "Contract performance (Art. 6(1)(b) GDPR)", "sub_processors": [ { "name": "Cloudflare, Inc.", "purpose": "CDN, edge computing, database" } ] } }}Data Export (Art. 20 GDPR)
GET /v1/account/export — Downloads all your data as a JSON file.
curl https://qr3.app/v1/account/export \ -H "Authorization: Bearer qr3_sk_..." \ -o my-data.jsonConsent Management
GET /v1/account/privacy/consents — Get current consent preferences.
POST /v1/account/privacy/consents — Update consent preferences.
{ "analytics": true, "marketing": false, "third_party_integrations": false}Account Deletion (Art. 17 GDPR)
DELETE /v1/account — Immediately and irrevocably deletes the account.
Scan Data & Pseudonymisation
| Data point | Treatment |
|---|---|
| IP address | HMAC-SHA-256 UTC-day pseudonym (long-lived master secret + purpose + UTC day), never stored in plain text |
| Country / Region | Derived from Cloudflare geo data, stored directly |
| User-Agent | Parsed to OS/Browser/Device type, raw string discarded |
| Referer | Stored as-is (no PII in standard referers) |
| Accept-Language | Only primary language tag stored |
Technical implementation of IP pseudonymisation
HTTP request → Cloudflare edge worker ↓CF-Connecting-IP header → HMAC-SHA-256(IP_HASH_SALT, purpose, UTC day, IP) ↓ip_hash (UTC-day pseudonym) → D1 database ↓Original IP is never storedIP_HASH_SALT is a long-lived master secret; purpose and UTC day automatically derive separate daily pseudonyms. Pseudonyms from different UTC days are not directly equal, but a holder of the secret can recalculate a known IP candidate for a specific day. No KV day salt or manual daily rotation is used.
Contact
- Data Protection: [email protected]
- Privacy Policy: qr3.app/en/legal/privacy