Skip to content

Skenavimo sekimas ir analitika

Apžvalga

Kiekvienas dinaminio QR kodo nuskaitymas sukuria skenavimo įrašą (Scan-Record) tavo Workspace. Duomenys renkami visiškai Cloudflare-Edge aplinkoje — be išorinių sekimo paslaugų, be slapukų ir be to, kad originalus IP adresas kada nors pasiektų tavo duomenų bazę.

Trys būdai gauti skenavimo duomenis:

Agregavimo API

GET /v1/codes/:id/scans — laiko eilutės + populiariausios šalys / įrenginiai / OS vienam kodo objektui.

Webhooks (realiuoju laiku)

qr.scanned įvykis kiekvienam skenavimui, pasirašytas HMAC-SHA256. Žr. Webhooks.

Valdymo skydelis

Vizualizacija qr3.app valdymo skydelyje — nereikia jokių API iškvietimų.


Kokie duomenys renkami

Kiekvienam skenavimui sukuriama eilutė lentelėje scans:

LaukasŠaltinisPavyzdys
idServerio sugeneruotas UUIDscn_d1f8…
code_idNuskaityto QR kodo IDqr_a1b2c3d4
workspace_idKodo Workspacews_xxx
countryCloudflare cf.countryAT
regionCloudflare cf.regionVienna
cityCloudflare cf.cityWien
device_typeUser-Agent analizėmobile, tablet, desktop
osUser-Agent analizėiOS, Android, macOS, Windows
browserUser-Agent analizėSafari, Chrome, Firefox
refererHTTP Referer antraštėhttps://example.com/landing
languageAccept-Language antraštė (pirmoji kalba)de
redirected_toFaktinis nukreipimo tikslashttps://example.com
ip_hashSHA-256(IP + dienos druska) — negrįžtamas8f3a…
scanned_atISO-8601 laiko žyma2026-05-12T14:32:11.000Z

Geo-lokalizacija Edge aplinkoje

Visi geo-duomenys (country, region, city) gaunami iš Cloudflare cf objekto ir yra pagrįsti Cloudflare Geo-IP duomenų baze. Išorinės Geo-IP paslaugos neužklausia — vietos nustatymas vyksta tame pačiame Worker, kuris atlieka ir nukreipimą (redirect).

Tai turi tris pasekmes:

  1. Maža delsa (latency) — jokių papildomų tinklo žingsnių (hop), jokios DNS užklausos išoriniam teikėjui.
  2. Duomenų apsauga — IP adresas nepalieka Cloudflare aplinkos ir niekada neperduodamas trečiosioms šalims.
  3. Ribotas tikslumascity (miestas) ne visada prieinamas (pvz., naudojant VPN, mobiliojo ryšio operatorius ar mažesniuose regionuose). Tikėkis null reikšmių ir numatyk jas savo valdymo skydeliuose.

Skenavimo analitikos užklausa

GET /v1/codes/:id/scans

Pateikia agreguotą vieno QR kodo analitiką pasirinktam laikotarpiui.

Terminal window
curl "https://qr3.app/v1/codes/qr_a1b2c3d4/scans?days=30" \
-H "Authorization: Bearer qr3_sk_..."

Užklausos parametrai (Query parameters):

ParametrasTipasNumatytasisAprašymas
daysinteger30Laikotarpis dienomis (1–365)

Atsakymas (HTTP 200):

{
"data": {
"code_id": "qr_a1b2c3d4",
"short_code": "r7f3Kx",
"total_scans": 1842,
"period_days": 30,
"period_scans": 367,
"scans_by_day": [
{ "date": "2026-04-13", "count": 12 },
{ "date": "2026-04-14", "count": 18 }
],
"top_countries": [
{ "value": "AT", "count": 142 },
{ "value": "DE", "count": 98 },
{ "value": "CH", "count": 41 }
],
"top_devices": [
{ "value": "mobile", "count": 281 },
{ "value": "desktop", "count": 72 },
{ "value": "tablet", "count": 14 }
],
"top_os": [
{ "value": "iOS", "count": 158 },
{ "value": "Android", "count": 123 },
{ "value": "macOS", "count": 48 }
]
},
"meta": { "request_id": "req_xyz123" }
}

Atsakymo laukai:

LaukasAprašymas
total_scansBendras kodo nuskaitymų skaičius per visą laiką (nepriklausomai nuo days filtro)
period_scansSkenavimų suma pasirinktu laikotarpiu
scans_by_dayDienos grupės, didėjančia tvarka pagal datą, tuščios dienos praleidžiamos
top_countriesPopuliariausios 8 šalys pasirinktu laikotarpiu, mažėjančia tvarka
top_devicesPopuliariausi 5 įrenginių tipai (mobile, tablet, desktop)
top_osPopuliariausios 5 operacinės sistemos

Agregavimas keliems kodams

Workspace lygio sumos (pvz., skenavimai per mėnesį visiems kodams) yra prieinamos per GET /v1/workspaces/:id lauke scans_this_month. Kelių kodų analizei (cross-code analysis) rekomenduojame naudoti valdymo skydelį arba periodinį eksportą.


Gavimo realiuoju laiku būdas per Webhooks

Jei norite apdoroti skenavimo įvykius iškart jiems įvykus — pavyzdžiui, tiesioginėms ataskaitoms, potencialių klientų sekimui (lead tracking) ar CRM integracijoms — užsiprenumeruokite qr.scanned įvykį:

Terminal window
curl -X POST https://qr3.app/v1/webhooks \
-H "Authorization: Bearer qr3_sk_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/webhooks/qr3",
"events": ["qr.scanned"],
"secret": "my-secret-key-min-16-chars"
}'

Payload (duomenų paketas):

{
"id": "evt_abc123xyz",
"type": "qr.scanned",
"created": "2026-05-12T14:32:11.000Z",
"data": {
"code_id": "qr_a1b2c3d4",
"short_code": "r7f3Kx",
"scan_id": "scn_d1f8...",
"country": "AT",
"device_type": "mobile",
"os": "iOS"
}
}

Pilna dokumentacija apie parašo patvirtinimą (signature verification), pakartotinio bandymo logiką (retry logic) ir pristatymo žurnalus (delivery logs) pateikiama skyriuje API → Webhooks.


BDAR ir duomenų apsauga

Skenavimo įrašuose nėra asmens IP adresų. Originalus IP adresas Edge-Worker programoje pakeičiamas kriptografine maišos funkcija (SHA-256) su kasdien keičiama druska (salt). Tai reiškia:

  • Jokio pakartotinio identifikavimo, net ir žinant algoritmą
  • Jokios to paties lankytojo koreliacijos tarp skirtingų dienų
  • Originalus IP adresas niekada nepasiekia D1 duomenų bazės

Duomenų saugojimas (Retention) priklauso nuo plano:

PlanasSaugojimo laikotarpis
Free7 dienos
Pro90 dienų
Business / Agency1 metai
EnterprisePasirinktinis (SLA)

Kasdien veikianti periodinė užduotis (cron job) purgeOldScans automatiškai pašalina senesnius įrašus — kodo objekto total_scans reikšmė lieka nepakitusi.


Geriausios praktikos

  • Užklausų dažnis (Polling frequency): Agregavimo API yra efektyvi, tačiau ji nėra skirta užklausoms kas sekundę. Tiesioginiams atnaujinimams visada teikite pirmenybę Webhooks, o API naudokite tik duomenų užpildymui (backfills) arba valdymo skydeliams.
  • Talpinimas talpykloje (Caching): Atsakyme pateikiamos laiko eilutės — esant dideliems laikotarpiams (days=365), duomenų paketas (payload) gali siekti kelis KB. Naudokite talpinimą kliento pusėje su trumpu gyvavimo laiku (TTL, pvz., 60 s).
  • Top-N ribojimai: top_countries, top_devices, top_os serverio pusėje yra ribojami atitinkamai iki 8 arba 5 įrašų. Gilesnei analizei eksportuokite neapdorotus duomenis.
  • Toleruokite null reikšmes: country, region, city, referer, language gali būti null. Savo analizėje traktuokite tai kaip „Nežinoma“.