Skip to main content
POST
Returns aggregated scan analytics for one or more QR codes, grouped by whichever metric type(s) you request.
This is a POST-only endpoint despite the name suggesting a lookup — a GET request returns 405 Method Not Allowed. The query parameters (from, to, type) select the date range and metrics; the request body selects which QR codes to include.
Requires a Management API key with MANAGEMENT_API (or MANAGEMENT_API_SANDBOX) quota — see the Management API overview — plus the account’s own QR_ANALYTICS_BASIC quota. Requesting anything beyond the count metric additionally requires QR_ANALYTICS_ADVANCED; without it, every request is silently downgraded to count regardless of the type you asked for.

Request

Verified live — an empty qr array here reflects a QR code with zero scans in the requested window, not an error. qr_meta is an extra name -> {qrid, category, category_slug} map, added only when qr is among the requested types, so a caller can deep-link from a name-keyed row back to its qrid. It’s additive: the shape callers already parse under each metric key is unchanged.

Query parameters

string
required
Start date (YYYY-MM-DD), inclusive.
string
required
End date (YYYY-MM-DD), inclusive.
string
required
Comma-separated metric types, e.g. qr,device,geography. Common values: count, qr, date, day, time, utm, device, os, browser, handset, geography, geo_location, age. Requires the account’s QR_ANALYTICS_ADVANCED quota for anything beyond count.
string
default:"date"
Grouping for time-series metric types, e.g. date, week, month.
boolean
default:"false"
Excludes scans identified as bot traffic from the results.
boolean
Pass true for dashboard-overview-style calls — bypasses the QR-count/date-range volume limit described below, and doesn’t count toward the account’s “analytics fetched” activity signal.

Request body

array
required
List of identifiers to scope the analytics to — the type of identifier depends on filter_by.
string
default:"qrid"
One of qrid (QR code IDs), id (internal numeric IDs), tags (tag names), or folder (folder IDs).

Response

The response is an object keyed by each requested metric type, plus qr_meta when applicable (see above). Shape varies per metric type — count returns scan totals, device/os/browser/geography return breakdowns by that dimension, and time-series types (date/day/time) return a series bucketed by group.
Requesting too many QR codes over too wide a date range returns a 400 under q: "High Volume of data. Either select lower than {N} QR Codes/{N} days time period or generate Analytics Export instead." In practice, both Export analytics and Export raw analytics enforce the exact same limit — all three endpoints share the same request-validation code path — so the actual fix for this error is narrowing q or the date range, not switching endpoints.

Authorizations

Authorization
string
header
required

Send your Management API key as the raw value of the Authorization header — no "Bearer " or "Token " prefix, and no other characters. Example: Authorization: 401f7ac837da42b97f613d789819ff93537bee6a. A header containing more than one space-separated part is rejected outright. Requests also require the request's Host header to be the management API host (e.g. management.scanova.io) — the same key sent to the regular API host will not authenticate.

Query Parameters

from
string<date>
required
to
string<date>
required
type
string
required

Comma-separated metric types, e.g. qr.

group
string
default:date

Grouping for time-series metric types, e.g. date/week/month.

exclude_bot_scan
boolean
default:false
overview
boolean

Bypasses the volume cap; used by dashboard overview widgets.

Body

application/json
q
string[]
required

Query data — a list of identifiers of the type named in filter_by.

filter_by
enum<string>
default:qrid
Available options:
qrid,
tags,
id,
folder

Response

200 - application/json

Analytics data, grouped by the requested type(s). A qr_meta name->{qrid, category, category_slug} map is attached whenever qr is among the requested types.