Skip to content

GDPR u l-Protezzjoni tad-Data

Privatezza mid-Disinn

qr3.app huwa mibni biex ikun konformi mal-GDPR mill-qiegħ nett:

  • Psewdonimizzazzjoni tal-IP — L-indirizzi IP jiġu kkonvertiti immedjatament f’psewdonimi HMAC-SHA-256 tal-jum UTC fl-Edge Worker. L-IP oriġinali qatt ma jinħażen; il-psewdonimu jibqa’ data personali.
  • Minimizzazzjoni tad-Data — Tinġabar biss id-data meħtieġa għall-operat.

Privacy-API

Sommarju tad-Data (Art. 15 GDPR)

GET /v1/account/privacy — Jirritorna sommarju tad-data kollha maħżuna.

Terminal window
curl https://qr3.app/v1/account/privacy \
-H "Authorization: Bearer qr3_sk_..."

Response:

{
"data": {
"workspace_id": "ws_xxx",
"organization_id": "org_xxx",
"account": {
"email": "[email protected]",
"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 jgħodd l-entrati maħżuna. scan_records huma skens ta’ QR codes, dpp_scan_records huma talbiet lil passaporti tal-prodott permezz tar-resolver DPP pubbliku. It-tnejn fihom il-psewdonimu tal-IP.

dashboard_activity_records u dashboard_document_activity_records jgħoddu l-jiem li fihom membru fetaħ id-dashboard (żewġ tabelli), api_operation_records il-kontaturi ta’ kuljum tat-talbiet għal kull API key, operazzjoni u riżultat, u webhook_delivery_records it-tentattivi ta’ kunsinna tal-webhooks, inklużi dawk ta’ webhooks imħassra. Ebda wieħed minnhom ma jaħżen indirizz IP jew User-Agent; il-log tal-kunsinna, madankollu, jaħżen il-payload tal-avveniment u l-ewwel kilobyte (1 KB) tat-tweġiba tar-riċevitur. L-erbgħa kollha jitħassru wara 90 jum UTC (usage_retention, webhook_delivery_retention).

account isemmi l-persuna wara t-talba — fid-dashboard il-persuna li tkun illoggjata, inkella l-persuna li ħolqot il-key — bl-email, l-isem, il-lingwa u d-data tal-ħolqien; għal Publishable Key il-valur huwa null. Il-kontaturi l-oħra jkopru kull tabella oħra b’data tal-kont: passaporti tal-prodott, dokumenti DPP, fajls, identifikaturi GS1, kummenti, entrati tal-awditu, tħaddim ta’ importazzjonijiet, membri tal-workspace u l-avviżi tal-kwota tal-organizzazzjoni (scan_quota_alerts). Ir-ringieli mħassra b’mod loġiku jingħaddu, għax għadhom maħżuna. erasure, backup_retention u billing_records jiddeskrivu x’iħassar DELETE /v1/account u x’jibqa’ għal xi żmien; pii_in_export huwa true għax l-esportazzjoni ssemmi l-persuna (email, isem) — il-psewdonimi tal-IP qatt ma joħorġu mid-database.


Esportazzjoni tad-Data (Art. 20 GDPR — Portabbiltà tad-Data)

GET /v1/account/export — Iniżżel id-data kollha bħala fajl JSON.

Terminal window
curl https://qr3.app/v1/account/export \
-H "Authorization: Bearer qr3_sk_..." \
-o my-data.json

L-esportazzjoni tinkludi:

  • Il-QR codes kollha (inkluż dawk imħassra)
  • Statistika tal-iskannjar aggregata (l-ebda hash tal-IP mhux ipproċessat)
  • Talbiet DPP aggregati għal kull passaport tal-prodott (dpp_scan_aggregates, lanqas b’hash tal-IP)
  • Statistika tal-użu bħala aggregati (dashboard_activity_aggregates, api_operation_aggregates): jiem attivi u n-numru ta’ utenti attivi għal kull kanal tad-dashboard, kontaturi tat-talbiet għal kull operazzjoni u riżultat — mingħajr ID tal-utenti u taċ-ċwievet
  • Tentattivi ta’ kunsinna tal-webhooks għal kull webhook u tip ta’ avveniment (webhook_delivery_aggregates), mingħajr payload u tweġiba
  • Il-persuna wara t-talba (account), l-organizzazzjoni (organization; l-indirizz tal-kontijiet u tan-notifiki biss għall-amministraturi tal-organizzazzjoni) u l-workspace (workspace)
  • Passaporti tal-prodott, metadata ta’ dokumenti DPP u fajls (mhux il-fajls infushom), identifikaturi GS1, talbiet għall-verifika tagħhom u tħaddim ta’ importazzjonijiet (dpp_passports, dpp_documents, files, gs1_identifiers, gs1_verification_requests, dpp_import_jobs)
  • Kummenti mingħajr oqsma tal-awtur (code_comments), entrati tal-awditu bħala aggregati (audit_log_aggregates) u membri skont ir-rwol (member_aggregates)
  • API keys mingħajr ID u hash (api_keys), webhooks mingħajr URL u sigriet (webhooks) u l-avviżi tal-kwota tal-organizzazzjoni (scan_quota_alerts)
  • Timestamp tal-ħolqien u tal-modifika

Il-Publishable Keys (qr3_pk_) jirċievu 403: il-fajl fih l-indirizzi tad-destinazzjoni u n-noti tal-kodiċijiet kollha.


Ħassar il-Kont (Art. 17 GDPR — Dritt li Tinsesa)

DELETE /v1/account — Iħassar il-kont tal-persuna wara t-talba, minnufih u b’mod irriversibbli: fid-dashboard il-persuna li tkun illoggjata, inkella l-persuna li ħolqot il-key. Talba għat-tħassir permezz ta’ email twassal għall-istess tħassir: l-operatur iħassar il-login ma’ Clerk, u mbagħad qr3 iħassar il-kont.

Terminal window
curl -X DELETE https://qr3.app/v1/account \
-H "Authorization: Bearer qr3_sk_..."

X’jiġri:

  1. L-organizzazzjonijiet li huma tal-persuna jitħassru bil-workspaces, il-kodiċijiet, il-passaporti tal-prodott, il-fajls, l-istatistika u l-logs kollha tagħhom, inklużi l-fajls tagħhom fil-ħażna. Jekk organizzazzjoni bħal din ikollha amministratur attiv ieħor tal-organizzazzjoni, minflok jieħu f’idejh dak bl-itwal anzjanità — flimkien mad-data u l-abbonament.
  2. Abbonament: abbonament attiv jintemm minnufih, mingħajr rimborż proporzjonali u mingħajr fattura finali; imbagħad jitħassar il-klijent ta’ Stripe. Il-fatturi jibqgħu ma’ Stripe għall-perjodu legali ta’ żamma (7 snin, § 132 BAO).
  3. Timijiet: is-sħubiji tal-persuna f’organizzazzjonijiet oħra jintemmu; dawk it-timijiet iżommu d-data tagħhom. Il-kummenti tal-persuna ma jsemmu l-ebda awtur aktar, l-entrati tal-awditu tagħha jitilfu l-psewdonimu tal-IP u l-user agent, u l-API keys li ħolqot hemm jiġu revokati.
  4. Il-persuna: il-login (Clerk) u r-rekord tal-utent jitħassru.

It-tweġiba hija 200 b’status: "completed" u l-kontaturi organizations_deleted, organizations_transferred, memberships_removed u login_deleted. Għal organizzazzjonijiet kbar ħafna talba waħda ma tkunx biżżejjed: it-tweġiba mbagħad tkun 202 b’status: "in_progress", u t-tħassir jitlesta waħdu fi ftit sigħat.

Jeħtieġ Secret Key jew Test Key b’dritt tal-kitba, jew sessjoni tad-dashboard (kwalunkwe rwol, għax huwa l-kont tal-persuna stess). Il-Publishable Keys u l-keys li jaqraw biss jirċievu 403, key mingħajr persuna warajha (created_by = 'system') tirċievi 409. 503 ifisser li l-iskjerament m’għandux sigriet li jeħtieġ it-tħassir; xejn ma tħassar.


Ġestjoni tal-Kunsens

GET /v1/account/privacy/consents — Ikseb il-kunsensi attwali.

POST /v1/account/privacy/consents — Aġġorna l-kunsensi.

Terminal window
# Ikseb il-kunsensi attwali
curl https://qr3.app/v1/account/privacy/consents \
-H "Authorization: Bearer qr3_sk_..."
# Itfi l-emails tal-marketing
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 }'

Kampi tal-Kunsens:

KampDefaultDeskrizzjoni
marketing_emailsfalseNewsletters u emails promozzjonali
analyticstrueStatistika tal-użu aggregata
product_updatestrueAġġornamenti tal-prodott u changelogs

Il-bidla tal-kunsensi teħtieġ drittijiet tal-kitba: ir-rwol viewer u l-Publishable Keys jirċievu 403.


Implimentazzjoni Teknika tal-GDPR

Psewdonimizzazzjoni tal-IP (Art. 25 GDPR)

Talba HTTP → Cloudflare Edge Worker
↓
Intestatura CF-Connecting-IP → HMAC-SHA-256(IP_HASH_SALT, għan, jum UTC, IP)
↓
ip_hash (psewdonimu ta' kuljum) → database D1
↓
L-IP oriġinali qatt ma jinħażen

IP_HASH_SALT huwa sigriet ewlieni li jdum fit-tul; l-għan u l-jum UTC joħolqu awtomatikament psewdonimi ta’ kuljum separati. Psewdonimi minn jiem UTC differenti mhumiex ugwali direttament, iżda min iżomm is-sigriet jista’ jerġa’ jikkalkula kandidat IP magħruf għal jum speċifiku. Ma jintuża l-ebda melħ ta’ kuljum f’KV jew rotazzjoni manwali ta’ kuljum.

Żamma tad-Data (Awtomatizzata)

PjanŻamma (Retention)
Il-pjanijiet kollha90 jum

L-istatistika tal-użu (attività tad-dashboard, kontaturi tal-użu tal-API) u l-logs tal-kunsinna tal-webhooks jinżammu wkoll għal 90 jum UTC: il-jum UTC kurrenti flimkien mad-89 jum ta’ qabel. L-istess cron job ta’ kuljum iħassar ringieli aktar qodma (purgeOldDashboardActivity, purgeOldApiOperationUsage, purgeOldWebhookDeliveries).

DPA tas-Sub-Proċessur

Cloudflare, Inc. jipproċessa d-data bħala proċessur tad-data. Id-DPA hija disponibbli fuq cloudflare.com/cloudflare-customer-dpa.

Cloudflare jipproċessa d-data b’indikazzjoni tal-lokalità lejn ir-reġjun tal-UE (fost l-oħrajn Frankfurt); ġurisdizzjoni tal-UE garantita b’kuntratt bħalissa mhijiex ibbukkjata. Peress li Cloudflare, Inc. hija bbażata fl-Istati Uniti, il-Klawżoli Kuntrattwali Standard (SCCs) skont l-Art. 46 tal-GDPR japplikaw bħala l-bażi għat-trasferiment.


Kuntatt