Skip to content

VDAR un datu aizsardzība

Datu aizsardzība pēc konstrukcijas

qr3.app ir izstrādāts tā, lai jau no paša sākuma atbilstu VDAR prasībām:

  • IP pseidonimizācija — IP adreses Edge Worker vidē nekavējoties pārvērš par HMAC-SHA-256 UTC dienas pseidonīmiem. Sākotnējā IP adrese nekad netiek glabāta; pseidonīms joprojām ir personas dati.
  • Datu minimizēšana — tiek vākti tikai tie dati, kas ir nepieciešami darbības nodrošināšanai.

Privacy-API

Datu kopsavilkums (VDAR 15. pants)

GET /v1/account/privacy — atgriež visu saglabāto datu pārskatu.

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 uzskaita saglabātos ierakstus. scan_records ir QR kodu skenējumi, dpp_scan_records – pieprasījumi produktu pasēm caur publisko DPP resolveri. Abos ir IP pseidonīms.

dashboard_activity_records un dashboard_document_activity_records uzskaita dienas, kad dalībnieks atvēra vadības paneli (divas tabulas), api_operation_records — ikdienas pieprasījumu skaitītājus pa API atslēgām, operācijām un rezultātiem, bet webhook_delivery_records — webhook piegādes mēģinājumus, tostarp dzēsto webhook mēģinājumus. Neviens no tiem neglabā IP adresi vai User-Agent; piegādes žurnāls gan glabā notikuma payload un saņēmēja atbildes pirmo kilobaitu (1 KB). Visi četri tiek dzēsti pēc 90 UTC dienām (usage_retention, webhook_delivery_retention).

account norāda personu, kas veic pieprasījumu — vadības panelī pieteikušos personu, citādi personu, kas izveidoja atslēgu — ar e-pastu, vārdu, valodu un izveides datumu; Publishable Key gadījumā vērtība ir null. Pārējie skaitītāji aptver katru citu tabulu ar konta datiem: produktu pases, DPP dokumentus, failus, GS1 identifikatorus, komentārus, audita ierakstus, importa izpildes, workspace dalībniekus un organizācijas kvotu paziņojumus (scan_quota_alerts). Mīksti dzēstās rindas tiek skaitītas, jo tās joprojām ir saglabātas. erasure, backup_retention un billing_records apraksta, ko dzēš DELETE /v1/account un kas vēl kādu laiku saglabājas; pii_in_export ir true, jo eksports norāda personu (e-pasts, vārds) — IP pseidonīmi nekad nepamet datubāzi.


Datu eksportēšana (VDAR 20. pants — datu pārnesamība)

GET /v1/account/export — lejupielādē visus datus kā JSON failu.

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

Eksports satur:

  • Visus QR kodus (ieskaitot dzēstos)
  • Apkopoto skenēšanas statistiku (bez neapstrādātiem IP jaucējkodiem)
  • Apkopotus DPP pieprasījumus katrai produkta pasei (dpp_scan_aggregates, arī bez IP jaucējkodiem)
  • Lietojuma statistiku apkopojumu veidā (dashboard_activity_aggregates, api_operation_aggregates): aktīvās dienas un aktīvo lietotāju skaitu pa vadības paneļa kanāliem, pieprasījumu skaitītājus pa operācijām un rezultātiem — bez lietotāju un atslēgu ID
  • Webhook piegādes mēģinājumus pa webhook un notikuma veidiem (webhook_delivery_aggregates), bez payload un atbildes
  • Personu, kas veic pieprasījumu (account), organizāciju (organization; norēķinu un paziņojumu adrese tikai organizācijas administratoriem) un workspace (workspace)
  • Produktu pases, DPP dokumentu un failu metadatus (ne pašus failus), GS1 identifikatorus, to apstiprināšanas pieprasījumus un importa izpildes (dpp_passports, dpp_documents, files, gs1_identifiers, gs1_verification_requests, dpp_import_jobs)
  • Komentārus bez autora laukiem (code_comments), audita ierakstus kā apkopojumus (audit_log_aggregates) un dalībniekus pa lomām (member_aggregates)
  • API atslēgas bez ID un jaucējkoda (api_keys), webhook bez URL un noslēpuma (webhooks) un organizācijas kvotu paziņojumus (scan_quota_alerts)
  • Izveides un izmaiņu laika zīmogus

Publishable Keys (qr3_pk_) saņem 403: fails satur visu kodu mērķa adreses un piezīmes.


Konta dzēšana (VDAR 17. pants — tiesības tikt aizmirstam)

DELETE /v1/account — Nekavējoties un neatgriezeniski dzēš tās personas kontu, kas veic pieprasījumu: vadības panelī pieteikušās personas, citādi personas, kas izveidoja atslēgu. Dzēšanas pieprasījums pa e-pastu noved pie tās pašas dzēšanas: operators dzēš pieteikšanos Clerk, un pēc tam qr3 dzēš kontu.

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

Kas notiek:

  1. Personai piederošās organizācijas tiek dzēstas ar visām workspace, kodiem, produktu pasēm, failiem, statistiku un žurnāliem, ieskaitot to failus krātuvē. Ja šādai organizācijai ir cits aktīvs organizācijas administrators, tā vietā organizāciju kopā ar datiem un abonementu pārņem visilgāk amatā esošais administrators.
  2. Abonements: aktīvs abonements beidzas nekavējoties, bez proporcionālas naudas atmaksas un bez gala rēķina; pēc tam tiek dzēsts Stripe klients. Rēķini paliek Stripe likumā noteikto glabāšanas termiņu (7 gadi, § 132 BAO).
  3. Komandas: personas dalība citās organizācijās beidzas; šīs komandas saglabā savus datus. Personas komentāri vairs nenorāda autoru, tās audita ieraksti zaudē IP pseidonīmu un user agent, un tur tās izveidotās API atslēgas tiek atsauktas.
  4. Persona: pieteikšanās (Clerk) un lietotāja ieraksts tiek dzēsti.

Atbilde ir 200 ar status: "completed" un skaitītājiem organizations_deleted, organizations_transferred, memberships_removed un login_deleted. Ļoti lielām organizācijām ar vienu pieprasījumu nepietiek: tad atbilde ir 202 ar status: "in_progress", un dzēšana automātiski tiek pabeigta dažu stundu laikā.

Nepieciešama Secret vai Test Key ar rakstīšanas tiesībām vai vadības paneļa sesija (jebkura loma, jo tas ir personas paša konts). Publishable Keys un tikai lasīšanas atslēgas saņem 403, atslēga bez personas (created_by = 'system') saņem 409. 503 nozīmē, ka izvietojumā trūkst dzēšanai nepieciešama noslēpuma; nekas netika dzēsts.


Piekrišanu pārvaldība

GET /v1/account/privacy/consents — iegūt pašreizējās piekrišanas.

POST /v1/account/privacy/consents — atjaunināt piekrišanas.

Terminal window
# Pašreizējo piekrišanu iegūšana
curl https://qr3.app/v1/account/privacy/consents \
-H "Authorization: Bearer qr3_sk_..."
# Mārketinga e-pasta ziņojumu atspējošana
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 }'

Piekrišanas lauki:

LauksNoklusējumsApraksts
marketing_emailsfalseInformatīvie izdevumi un reklāmas e-pasti
analyticstrueApkopotā lietošanas statistika
product_updatestrueProduktu jaunumi un izmaiņu žurnāli (changelogs)

Piekrišanu mainīšanai nepieciešamas rakstīšanas tiesības: loma viewer un Publishable Keys saņem 403.


Tehniskā VDAR ieviešana

IP pseidonimizācija (VDAR 25. pants)

HTTP pieprasījums → Cloudflare Edge Worker
↓
CF-Connecting-IP galvene → HMAC-SHA-256(IP_HASH_SALT, nolūks, UTC diena, IP)
↓
ip_hash (dienas pseidonīms) → D1 datubāze
↓
Sākotnējā IP adrese nekad netiek glabāta

IP_HASH_SALT ir ilglaicīgs galvenais noslēpums; nolūks un UTC diena automātiski atvasina atsevišķus dienas pseidonīmus. Dažādu UTC dienu pseidonīmi nav tieši vienādi, tomēr noslēpuma turētājs var konkrētai dienai no jauna aprēķināt zināmu IP kandidātu. Netiek izmantots ne KV dienas sāls, ne manuāla ikdienas rotācija.

Datu glabāšana (automatizēta)

PlānsGlabāšanas laiks
Visi plāni90 dienas

Lietojuma statistika (vadības paneļa aktivitāte, API lietojuma skaitītāji) un webhook piegādes žurnāli tiek glabāti arī 90 UTC dienas: kārtējā UTC diena un 89 iepriekšējās dienas. Tas pats ikdienas cron uzdevums dzēš vecākās rindas (purgeOldDashboardActivity, purgeOldApiOperationUsage, purgeOldWebhookDeliveries).

Apakšapstrādātāju DPA

Cloudflare, Inc. apstrādā datus kā apstrādātājs. DPA ir pieejams vietnē cloudflare.com/cloudflare-customer-dpa.

Cloudflare apstrādā datus ar atrašanās vietas norādi uz ES reģionu (tostarp Frankfurtē); līgumiski garantēta ES jurisdikcija pašlaik nav rezervēta. Tā kā Cloudflare, Inc. atrodas ASV, kā nodošanas pamats tiek piemērotas standartlīguma standartklauzulas (SCC) saskaņā ar VDAR 46. pantu.


Kontakti