Porównanie i eksport
Porównanie kodów
GET /v1/analytics/compare przyjmuje codeIds (do 4, rozdzielone przecinkami) oraz zwykłe range, tz i groupBy. Odpowiedź zawiera po jednej serii na kod w tych samych przedziałach: jego punkty, sumy, poprzedni okres tej samej długości, zmianę względem niego i udział kodu w porównywanych skanach.
Kody, których klucz nie może zobaczyć, wracają w omitted zamiast powodować błąd żądania. Kod statyczny pojawia się z tracked: false i zerem punktów, bo jego skany nie są liczone.
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": []}Pobieranie skanów jako CSV
GET /v1/analytics/export odpowiada samym plikiem CSV (text/csv, jako załącznik) dla filtrów pozostałych endpointów statystyk: codeId lub codeIds, folderId, tagId, gtin, country i okres. kind wybiera plik: daily_totals, scan_rows, breakdowns.
daily_totals to jeden wiersz na okres (dodaj splitByCode=true, by mieć jeden wiersz na kod), scan_rows to jeden wiersz na skan, a breakdowns wypisuje każdy wiersz podanych wymiarów. Wszystkie trzy wymagają planu z eksportem CSV; scan_rows wymaga też statystyk pojedynczych skanów. Wiersze starsze niż historia planu nie trafiają do pliku.
Powyżej 10 000 wierszy odpowiedzią jest 413 payload_too_large z details.reason use_export_job. Uruchom wtedy zadanie eksportu.
Duże okresy: zadanie eksportu
POST /v1/analytics/exports przyjmuje te same filtry jako treść JSON (kind jest wymagane) i przygotowuje plik w tle, do 1 000 000 wierszy. Więcej to 413 z details.reason too_many_rows: zawęź okres. Wyślij Idempotency-Key.
Odpowiedzią jest 202 z exportId. Odpytuj GET /v1/exports/{id}, aż będzie gotowy, i odczytaj z niego link do pobrania. E-mail również zapowiada plik; wyślij email: false, by go pominąć.
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"}