Skip to content

GDPR és adatvédelem

Beépített adatvédelem (Privacy-by-Design)

a qr3.app alapjaiban GDPR-megfelelőnek készült:

  • IP-álnevesítés — Az IP-címeket az Edge Worker azonnal HMAC-SHA-256 UTC-napi álnevekké alakítja. Az eredeti IP-cím soha nem kerül tárolásra; az álnév továbbra is személyes adat.
  • Adatminimalizálás — Csak a működéshez feltétlenül szükséges adatokat gyűjtjük.

Privacy-API

Adatösszesítés (GDPR 15. cikk)

GET /v1/account/privacy — Visszaadja az összes tárolt adat áttekintését.

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" }
}

A stored_data a tárolt bejegyzéseket számolja. A scan_records a QR-kódok beolvasásai, a dpp_scan_records a termékútlevelekhez a nyilvános DPP-resolveren keresztül érkező lekérések. Mindkettő tartalmazza az IP-álnevet.

A dashboard_activity_records és a dashboard_document_activity_records azokat a napokat számolja, amelyeken egy tag megnyitotta a dashboardot (két tábla), az api_operation_records a napi kérésszámlálókat API-kulcs, művelet és eredmény szerint, a webhook_delivery_records pedig a webhook-kézbesítési kísérleteket, a törölt webhookokéit is beleértve. Egyik sem tárol IP-címet vagy User-Agentet; a kézbesítési napló viszont tárolja az esemény payloadját és a fogadó válaszának első 1 KB-ját. Mind a négy 90 UTC-nap után törlődik (usage_retention, webhook_delivery_retention).

Az account a kérés mögött álló személyt nevezi meg — a dashboardon a bejelentkezett személyt, egyébként a kulcsot létrehozó személyt — e-mail-címmel, névvel, nyelvvel és létrehozási dátummal; Publishable Key esetén az érték null. A többi számláló a fiók adatait tartalmazó minden további táblát lefed: termékútleveleket, DPP-dokumentumokat, fájlokat, GS1-azonosítókat, megjegyzéseket, auditbejegyzéseket, importfuttatásokat, a workspace tagjait és a szervezet kvótaértesítéseit (scan_quota_alerts). A logikailag törölt sorok is beleszámítanak, mert még tárolva vannak. Az erasure, a backup_retention és a billing_records leírja, mit töröl a DELETE /v1/account, és mi marad meg egy ideig; a pii_in_export értéke true, mert az export megnevezi a személyt (e-mail, név) — az IP-álnevek soha nem hagyják el az adatbázist.


Adatexportálás (GDPR 20. cikk — adathordozhatóság)

GET /v1/account/export — Letölti az összes adatot JSON-fájlként.

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

Az exportálás a következőket tartalmazza:

  • Minden QR-kód (beleértve a törölteket is)
  • Aggregált beolvasási statisztikák (nyers IP-hashek nélkül)
  • Aggregált DPP-lekérések termékútlevelenként (dpp_scan_aggregates, szintén IP-hashek nélkül)
  • Használati statisztika aggregátumként (dashboard_activity_aggregates, api_operation_aggregates): aktív napok és az aktív felhasználók száma dashboard-csatornánként, kérésszámlálók művelet és eredmény szerint — felhasználói és kulcsazonosítók nélkül
  • Webhook-kézbesítési kísérletek webhookonként és eseménytípusonként (webhook_delivery_aggregates), payload és válasz nélkül
  • A kérés mögött álló személyt (account), a szervezetet (organization; számlázási és értesítési cím csak a szervezeti adminisztrátoroknak) és a workspace-t (workspace)
  • Termékútleveleket, a DPP-dokumentumok és fájlok metaadatait (magukat a fájlokat nem), GS1-azonosítókat, a hitelesítésükre irányuló kérelmeket és importfuttatásokat (dpp_passports, dpp_documents, files, gs1_identifiers, gs1_verification_requests, dpp_import_jobs)
  • Megjegyzéseket szerzőmezők nélkül (code_comments), auditbejegyzéseket aggregátumként (audit_log_aggregates) és tagokat szerepkörönként (member_aggregates)
  • API-kulcsokat azonosító és hash nélkül (api_keys), webhookokat URL és titok nélkül (webhooks), valamint a szervezet kvótaértesítéseit (scan_quota_alerts)
  • Létrehozási és módosítási időbélyegek

A Publishable Keys (qr3_pk_) 403 választ kap: a fájl minden kód célcímét és jegyzetét tartalmazza.


Fiók törlése (GDPR 17. cikk — az elfeledtetéshez való jog)

DELETE /v1/account — Azonnal és visszavonhatatlanul törli a kérés mögött álló személy fiókját: a dashboardon a bejelentkezett személyét, egyébként a kulcsot létrehozó személyét. Az e-mailben küldött törlési kérelem ugyanehhez a törléshez vezet: az üzemeltető törli a bejelentkezést a Clerknél, majd a qr3 törli a fiókot.

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

Mi történik:

  1. A személy tulajdonában lévő szervezetek törlődnek minden workspace-szel, kóddal, termékútlevéllel, fájllal, statisztikával és naplóval együtt, beleértve a tárhelyen lévő fájljaikat is. Ha egy ilyen szervezetnek van másik aktív szervezeti adminisztrátora, akkor helyette a legrégebbi veszi át a szervezetet az adatokkal és az előfizetéssel együtt.
  2. Előfizetés: a futó előfizetés azonnal megszűnik, időarányos visszatérítés és végszámla nélkül; ezután a Stripe-ügyfél törlődik. A számlák a törvényes megőrzési időn át a Stripe-nál maradnak (7 év, § 132 BAO).
  3. Csapatok: a személy tagságai más szervezetekben megszűnnek; ezek a csapatok megtartják az adataikat. A személy megjegyzései többé nem neveznek meg szerzőt, auditbejegyzései elveszítik az IP-álnevet és a user agentet, az ott általa létrehozott API-kulcsokat pedig visszavonják.
  4. A személy: a bejelentkezés (Clerk) és a felhasználói rekord törlődik.

A válasz 200 status: "completed" értékkel és az organizations_deleted, organizations_transferred, memberships_removed és login_deleted számlálókkal. Nagyon nagy szervezeteknél egy kérés nem elég: ilyenkor a válasz 202 status: "in_progress" értékkel, és a törlés néhány órán belül magától befejeződik.

Írási joggal rendelkező Secret vagy Test Key, illetve dashboard-munkamenet szükséges (bármely szerepkör, mert a saját fiókról van szó). A Publishable Keys és a csak olvasható kulcsok 403 választ kapnak, a személy nélküli kulcs (created_by = 'system') 409-et. A 503 azt jelenti, hogy a telepítésből hiányzik egy titok, amelyre a törlésnek szüksége van; semmi sem törlődött.


Hozzájárulások kezelése

GET /v1/account/privacy/consents — Aktuális hozzájárulások lekérése.

POST /v1/account/privacy/consents — Hozzájárulások frissítése.

Terminal window
# Aktuális hozzájárulások lekérése
curl https://qr3.app/v1/account/privacy/consents \
-H "Authorization: Bearer qr3_sk_..."
# Marketing e-mailek kikapcsolása
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 }'

Hozzájárulási mezők:

MezőAlapértelmezettLeírás
marketing_emailsfalseHírlevelek és reklám e-mailek
analyticstrueAggregált használati statisztikák
product_updatestrueTermékújdonságok és változásnaplók (changelogok)

A hozzájárulások módosításához írási jogosultság szükséges: a viewer szerepkör és a Publishable Keys 403 választ kap.


Technikai GDPR-implementáció

IP-álnevesítés (GDPR 25. cikk)

HTTP-kérés → Cloudflare Edge Worker
↓
CF-Connecting-IP fejléc → HMAC-SHA-256(IP_HASH_SALT, cél, UTC-nap, IP)
↓
ip_hash (napi álnév) → D1-adatbázis
↓
Az eredeti IP-cím soha nem kerül tárolásra

Az IP_HASH_SALT hosszú élettartamú főtitok; a cél és az UTC-nap automatikusan külön napi álneveket képez. A különböző UTC-napok álnevei nem közvetlenül azonosak, de a titok birtokosa egy ismert IP-jelöltet egy adott napra újra kiszámíthat. Nincs KV-napi só vagy kézi napi rotáció.

Adatmegőrzés (automatizált)

CsomagMegőrzés
Minden csomag90 nap

A használati statisztika (dashboard-aktivitás, API-használati számlálók) és a webhook-kézbesítési naplók megőrzési ideje szintén 90 UTC-nap: az aktuális UTC-nap és az azt megelőző 89 nap. Ugyanaz a napi cron-feladat törli a régebbi sorokat (purgeOldDashboardActivity, purgeOldApiOperationUsage, purgeOldWebhookDeliveries).

Aladatfeldolgozói DPA

A Cloudflare, Inc. adatfeldolgozóként kezeli az adatokat. A DPA elérhető a cloudflare.com/cloudflare-customer-dpa címen.

A Cloudflare az adatokat az EU-régióra vonatkozó helymeghatározási javaslattal (többek között Frankfurt) dolgozza fel; szerződésben garantált EU-s joghatóság jelenleg nincs lefoglalva. Mivel a Cloudflare, Inc. székhelye az USA-ban található, az adattovábbítás alapjaként a GDPR 46. cikke szerinti általános szerződési feltételek (SCC-k) érvényesek.


Kapcsolat