Confronta ed esporta
Confrontare i codici
GET /v1/analytics/compare accetta codeIds (fino a 4, separati da virgole) e i consueti range, tz e groupBy. La risposta contiene una serie per codice sugli stessi intervalli: i suoi punti, i suoi totali, il periodo precedente della stessa durata, la variazione rispetto a esso e la quota del codice sulle scansioni confrontate.
I codici che la chiave non può vedere tornano in omitted invece di far fallire la richiesta. Un codice statico compare con tracked: false e zero punti, perché le sue scansioni non vengono conteggiate.
curl "https://api.dotwick.com/v1/analytics/compare?codeIds=qr_8841ce2mxk%2Cqr_2k8m4q7x1c9v&range=7d&tz=Europe%2FBerlin" \ -H "Authorization: Bearer sk_live_…"{ "groupBy": "day", "tz": "Europe/Berlin", "from": "2026-09-09T00:00:00+02:00", "to": "2026-09-12T00:00:00+02:00", "previous": { "from": "2026-09-06T00:00:00+02:00", "to": "2026-09-09T00:00:00+02:00" }, "buckets": [ "2026-09-09T00:00:00+02:00", "2026-09-10T00:00:00+02:00", "2026-09-11T00:00:00+02:00" ], "series": [ { "codeId": "qr_8841ce2mxk", "name": "Van fleet – unit 14", "tracked": true, "points": [ { "ts": "2026-09-09T00:00:00+02:00", "scans": 40, "uniques": 31 }, { "ts": "2026-09-10T00:00:00+02:00", "scans": 52, "uniques": 44 }, { "ts": "2026-09-11T00:00:00+02:00", "scans": 58, "uniques": 47 } ], "totals": { "scans": 150, "uniques": 122, "bots": 3 }, "previous": { "scans": 100, "uniques": 80 }, "deltas": { "scans": 0.5, "uniques": 0.525 }, "share": 0.75 }, { "codeId": "qr_2k8m4q7x1c9v", "name": "Van fleet – unit 15", "tracked": true, "points": [ { "ts": "2026-09-09T00:00:00+02:00", "scans": 12, "uniques": 10 }, { "ts": "2026-09-10T00:00:00+02:00", "scans": 20, "uniques": 17 }, { "ts": "2026-09-11T00:00:00+02:00", "scans": 18, "uniques": 15 } ], "totals": { "scans": 50, "uniques": 42, "bots": 0 }, "previous": { "scans": 60, "uniques": 51 }, "deltas": { "scans": -0.167, "uniques": -0.176 }, "share": 0.25 } ], "omitted": []}Scaricare le scansioni in CSV
GET /v1/analytics/export risponde con il CSV stesso (text/csv, come allegato) per i filtri degli altri endpoint delle statistiche: codeId o codeIds, folderId, tagId, gtin, country e un periodo. kind sceglie il file: daily_totals, scan_rows, breakdowns.
daily_totals è una riga per periodo (aggiungi splitByCode=true per una riga per codice), scan_rows una riga per scansione, e breakdowns elenca ogni riga delle dimensioni che indichi. Tutti e tre richiedono un piano con esportazione CSV; scan_rows richiede anche le statistiche per singola scansione. Le righe più vecchie dello storico del piano non sono nel file.
Oltre 10.000 righe la risposta è 413 payload_too_large con details.reason use_export_job. Avvia invece un job di esportazione.
Periodi lunghi: un job di esportazione
POST /v1/analytics/exports accetta gli stessi filtri come corpo JSON (kind è obbligatorio) e prepara il file in background, fino a 1.000.000 righe. Oltre è 413 con details.reason too_many_rows: restringi il periodo. Invia una Idempotency-Key.
La risposta è 202 con un exportId. Interroga GET /v1/exports/{id} finché non è pronto e leggi da lì il link di download. Anche un’email annuncia il file; invia email: false per saltarla.
curl -X POST https://api.dotwick.com/v1/analytics/exports \ -H "Authorization: Bearer sk_live_…" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: van-014-scans-q3" \ -d '{ "kind": "scan_rows", "range": "90d", "tz": "Europe/Berlin", "codeIds": [ "qr_8841ce2mxk" ], "email": false }'{ "exportId": "exp_2m7x4k9q1c8v3b6n", "status": "queued"}