Sari la conținut

Urmărirea scanărilor și Analytics

Prezentare generală

Fiecare scanare a unui cod QR dinamic generează o înregistrare de scanare (Scan-Record) în spațiul tău de lucru (Workspace). Colectarea datelor se face în întregime la nivel de Cloudflare Edge — fără servicii externe de urmărire, fără cookie-uri și fără ca IP-ul original să ajungă vreodată în baza ta de date.

Trei moduri de a consuma datele de scanare:

API de agregare

GET /v1/codes/:id/scans — serii temporale + top țări/dispozitive/sisteme de operare pentru un singur obiect cod.

Webhook-uri (în timp real)

Evenimentul qr.scanned per scanare, semnat HMAC-SHA256. Vezi Webhook-uri.

Dashboard

Vizualizare în dashboard-ul qr3.app — nu este necesar niciun apel API.


Ce date sunt colectate

Pentru fiecare scanare, se creează o înregistrare în tabelul scans:

CâmpSursăExemplu
idUUID generat de serverscn_d1f8…
code_idID-ul codului QR scanatqr_a1b2c3d4
workspace_idWorkspace-ul coduluiws_xxx
countryCloudflare cf.countryAT
regionCloudflare cf.regionVienna
cityCloudflare cf.cityWien
device_typeAnaliză User-Agentmobile, tablet, desktop
osAnaliză User-AgentiOS, Android, macOS, Windows
browserAnaliză User-AgentSafari, Chrome, Firefox
refererHeader HTTP Refererhttps://example.com/landing
languageHeader Accept-Language (prima limbă)de
redirected_toDestinația reală de redirecționarehttps://example.com
ip_hashSHA-256(IP + salt zilnic) — ireversibil8f3a…
scanned_atTimestamp ISO-86012026-05-12T14:32:11.000Z

Geolocalizarea la nivel de Edge

Toate datele geografice (country, region, city) provin din obiectul cf de la Cloudflare și se bazează pe baza de date Geo-IP a Cloudflare. Nu sunt interogate servicii externe de Geo-IP — rezoluția are loc în același Worker care execută și redirecționarea.

Acest lucru are trei consecințe:

  1. Latență redusă — fără hop suplimentar, fără interogare DNS către un furnizor extern.
  2. Protecția datelor — adresa IP nu părăsește Cloudflare și nu este transmisă niciodată către terți.
  3. Granularitate limitatăcity nu este întotdeauna disponibil (de exemplu, în cazul VPN-urilor, operatorilor de telefonie mobilă sau regiunilor mici). Așteaptă-te la valori null și ia-le în calcul în dashboard-urile tale.

Interogarea datelor de Scan-Analytics

GET /v1/codes/:id/scans

Returnează date analitice agregate pentru un singur cod QR pe o perioadă selectabilă.

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

Parametri de interogare (Query Parameters):

ParametruTipImplicitDescriere
daysinteger30Perioada în zile (1–365)

Răspuns (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" }
}

Câmpuri de răspuns:

CâmpDescriere
total_scansNumărul total de scanări pe întreaga durată de viață a codului (independent de intervalul days)
period_scansNumărul total de scanări în intervalul de timp selectat
scans_by_dayGrupuri zilnice (buckets), în ordine crescătoare după dată, zilele fără scanări fiind omise
top_countriesTop 8 țări în intervalul de timp selectat, în ordine descrescătoare
top_devicesTop 5 tipuri de dispozitive (mobile, tablet, desktop)
top_osTop 5 sisteme de operare

Agregarea pe mai multe coduri

Totalurile la nivel de Workspace (de exemplu, scanările pe lună pentru toate codurile) sunt disponibile prin GET /v1/workspaces/:id în câmpul scans_this_month. Pentru analize comparative între coduri (cross-code), recomandăm dashboard-ul sau un export periodic.


Consum în timp real prin Webhook-uri

Dacă dorești să procesezi evenimentele de scanare imediat ce se produc — de exemplu, pentru dashboard-uri live, urmărirea lead-urilor sau integrări CRM — abonează-te la evenimentul qr.scanned:

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:

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

Documentația completă privind verificarea semnăturii, logica de reîncercare (retry) și jurnalele de livrare (delivery logs) se găsește în API → Webhooks.


GDPR și protecția datelor

Înregistrările de scanare (Scan-Records) nu conțin adrese IP cu caracter personal. IP-ul original este înlocuit în Worker-ul Edge printr-o funcție hash criptografică (SHA-256) cu un salt care se rotește zilnic. Acest lucru înseamnă:

  • Fără posibilitate de reidentificare, chiar dacă algoritmul este cunoscut
  • Fără corelare de la o zi la alta a aceluiași vizitator
  • IP-ul original nu ajunge niciodată în baza de date D1

Perioada de retenție depinde de abonament:

AbonamentRetenție
Free7 zile
Pro90 de zile
Business / Agency1 an
EnterprisePersonalizat (SLA)

Un job cron care rulează zilnic (purgeOldScans) elimină automat înregistrările mai vechi — câmpul total_scans de pe obiectul cod rămâne neafectat.


Cele mai bune practici

  • Frecvența de interogare (Polling): API-ul de agregare este eficient, dar nu este conceput pentru interogări la interval de secunde. Pentru actualizări live, preferă întotdeauna webhook-urile și folosește API-ul doar pentru backfill-uri sau dashboard-uri.
  • Caching: Răspunsul conține serii temporale — pentru intervale mari (days=365), payload-ul poate ajunge la câțiva KB. Folosește cache pe partea de client cu un TTL scurt (de exemplu, 60 s).
  • Limite Top-N: top_countries, top_devices, top_os sunt limitate pe partea de server la 8, respectiv 5 înregistrări. Pentru analize mai detaliate, exportă datele brute.
  • Tolerarea valorilor null: Câmpurile country, region, city, referer, language pot fi null. Tratează aceste cazuri ca „Necunoscut” în analizele tale.