Vergleichen und exportieren
Codes vergleichen
GET /v1/analytics/compare nimmt codeIds (bis zu 4, durch Kommas getrennt) und die üblichen range, tz und groupBy. Die Antwort enthält pro Code eine Reihe über dieselben Zeitabschnitte: seine Punkte, seine Summen, den vorherigen Zeitraum gleicher Länge, die Veränderung dazu und den Anteil des Codes an den verglichenen Scans.
Codes, die der Schlüssel nicht sehen darf, kommen in omitted zurück, statt die Anfrage scheitern zu lassen. Ein statischer Code erscheint mit tracked: false und null Punkten, weil seine Scans nicht gezählt werden.
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 herunterladen
GET /v1/analytics/export antwortet mit der CSV-Datei selbst (text/csv, als Anhang) für die Filter der anderen Statistik-Endpunkte: codeId oder codeIds, folderId, tagId, gtin, country und einen Zeitraum. kind wählt die Datei: daily_totals, scan_rows, breakdowns.
daily_totals ist eine Zeile pro Zeitabschnitt (mit splitByCode=true eine Zeile pro Code), scan_rows eine Zeile pro Scan, und breakdowns listet jede Zeile der von Ihnen genannten Dimensionen auf. Alle drei brauchen einen Tarif mit CSV-Export; scan_rows außerdem Statistiken pro Scan. Zeilen, die älter als der Verlauf des Tarifs sind, fehlen in der Datei.
Ab mehr als 10.000 Zeilen lautet die Antwort 413 payload_too_large mit details.reason use_export_job. Starten Sie stattdessen einen Export-Auftrag.
Große Zeiträume: ein Export-Auftrag
POST /v1/analytics/exports nimmt dieselben Filter als JSON-Body (kind ist Pflicht) und bereitet die Datei im Hintergrund vor, bis zu 1.000.000 Zeilen. Mehr ergibt 413 mit details.reason too_many_rows: Engen Sie den Zeitraum ein. Senden Sie einen Idempotency-Key.
Die Antwort ist 202 mit einer exportId. Fragen Sie GET /v1/exports/{id} ab, bis die Datei bereit ist, und lesen Sie den Download-Link daraus. Eine E-Mail kündigt die Datei ebenfalls an; senden Sie email: false, um sie zu überspringen.
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"}