Vergelijken en exporteren
Codes vergelijken
GET /v1/analytics/compare neemt codeIds (tot 4, door komma’s gescheiden) en de gebruikelijke range, tz en groupBy. Het antwoord heeft per code een reeks over dezelfde intervallen: de punten, de totalen, de vorige periode van dezelfde lengte, de verandering ten opzichte daarvan en het aandeel van de code in de vergeleken scans.
Codes die de sleutel niet mag zien, komen terug in omitted in plaats van het verzoek te laten mislukken. Een statische code staat erin met tracked: false en nul punten, omdat zijn scans niet worden geteld.
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": []}Scans als CSV downloaden
GET /v1/analytics/export antwoordt met de CSV zelf (text/csv, als bijlage) voor de filters van de andere analyse-endpoints: codeId of codeIds, folderId, tagId, gtin, country en een periode. kind kiest het bestand: daily_totals, scan_rows, breakdowns.
daily_totals is één rij per periode (voeg splitByCode=true toe voor één rij per code), scan_rows is één rij per scan en breakdowns somt elke rij op van de dimensies die je noemt. Alle drie vragen een abonnement met CSV-export; scan_rows vraagt ook analyse per scan. Rijen die ouder zijn dan de historie van het abonnement staan niet in het bestand.
Boven 10.000 rijen is het antwoord 413 payload_too_large met details.reason use_export_job. Start dan een exporttaak.
Grote periodes: een exporttaak
POST /v1/analytics/exports neemt dezelfde filters als JSON-body (kind is verplicht) en maakt het bestand op de achtergrond klaar, tot 1.000.000 rijen. Meer is 413 met details.reason too_many_rows: beperk de periode. Stuur een Idempotency-Key mee.
Het antwoord is 202 met een exportId. Vraag GET /v1/exports/{id} op tot het klaar is en lees de downloadlink eruit. Een e-mail kondigt het bestand ook aan; stuur email: false om die over te slaan.
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"}