Comparar e exportar
Comparar códigos
GET /v1/analytics/compare recebe codeIds (até 4, separados por vírgula) e os habituais range, tz e groupBy. A resposta traz uma série por código sobre os mesmos intervalos: seus pontos, seus totais, o período anterior de mesma duração, a variação em relação a ele e a fatia do código nos escaneamentos comparados.
Os códigos que a chave não pode ver voltam em omitted em vez de fazer a requisição falhar. Um código estático aparece com tracked: false e zero pontos, porque seus escaneamentos não são contados.
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": []}Baixar escaneamentos em CSV
GET /v1/analytics/export responde com o próprio CSV (text/csv, como anexo) para os filtros dos outros endpoints de estatísticas: codeId ou codeIds, folderId, tagId, gtin, country e um período. kind escolhe o arquivo: daily_totals, scan_rows, breakdowns.
daily_totals é uma linha por período (adicione splitByCode=true para uma linha por código), scan_rows é uma linha por escaneamento e breakdowns lista cada linha das dimensões que você indicar. Os três exigem um plano com exportação em CSV; scan_rows exige também estatísticas por escaneamento. Linhas mais antigas que o histórico do plano não entram no arquivo.
Acima de 10.000 linhas a resposta é 413 payload_too_large com details.reason use_export_job. Inicie então um job de exportação.
Períodos grandes: um job de exportação
POST /v1/analytics/exports recebe os mesmos filtros como corpo JSON (kind é obrigatório) e prepara o arquivo em segundo plano, até 1.000.000 linhas. Mais que isso é 413 com details.reason too_many_rows: reduza o período. Envie uma Idempotency-Key.
A resposta é 202 com um exportId. Consulte GET /v1/exports/{id} até ficar pronto e leia dali o link de download. Um e-mail também avisa do arquivo; envie email: false para dispensá-lo.
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"}