Scan stats
Scan totals, daily series and breakdowns for one code.
Plan: Starter and up. The date range is limited to your plan's history window.
GET /api/v1/codes/{id}/stats
| Query parameter | Notes |
|---|---|
from | Start, ISO 8601 with a time and offset, e.g. 2026-10-01T00:00:00Z. Default: 30 days before to |
to | End, same format. Default: now |
The range is the same as the dashboard's analytics and can span up to 10 years. Bot scans are left out of every number except totals.bots.
curl "https://dynaqr.app/api/v1/codes/0b8f6c2e-3f7a-4d0e-9a61-2f4c7f1d9b10/stats?from=2026-10-01T00:00:00Z&to=2026-11-01T00:00:00Z" \ -H "Authorization: Bearer qrm_live_your_key"
Response
{
"data": {
"locked": false,
"tier": "business",
"timezone": "Europe/London",
"range": {
"from": "2026-10-01T00:00:00.000Z",
"to": "2026-11-01T00:00:00.000Z",
"clamped": false
},
"totals": { "scans": 1284, "uniques": 1102, "bots": 37 },
"series": [
{ "day": "2026-10-01", "scans": 41, "uniques": 38 }
],
"heatmap": [
{ "weekday": 5, "hour": 12, "scans": 96 }
],
"codes": [
{
"codeId": "0b8f6c2e-3f7a-4d0e-9a61-2f4c7f1d9b10",
"name": "Spring menu flyer",
"costCents": 12000,
"placement": "Table tents",
"scans": 1284,
"uniques": 1102,
"costPerScanCents": 9
}
],
"breakdowns": {
"country": [{ "key": "GB", "scans": 1010 }, { "key": "FR", "scans": 120 }],
"region": [{ "key": "ENG", "scans": 980 }],
"city": [{ "key": "London", "scans": 640 }],
"device": [{ "key": "ios", "scans": 702 }, { "key": "android", "scans": 560 }],
"os": [{ "key": "iOS", "scans": 702 }],
"browser": [{ "key": "Safari", "scans": 650 }],
"language": [{ "key": "en", "scans": 1150 }],
"rule": [{ "key": "Unknown", "scans": 1284 }],
"source": [{ "key": "qr", "scans": 1200 }, { "key": "link", "scans": 84 }]
}
}
}
| Field | Notes |
|---|---|
range.clamped | true when from was earlier than the plan's history allows and was moved forward |
timezone | The workspace time zone used for series days and the heatmap |
totals.scans | Human scans in the range |
totals.uniques | Distinct visitors. Visitor ids rotate daily, so a person who scans on two days counts twice |
totals.bots | Bot scans in the range, not included elsewhere |
series | One row per day in the range, including days with no scans |
heatmap | Scans by weekday (0 = Sunday) and hour, in the workspace time zone |
codes | Per-code totals, top 50 by scans. costCents and costPerScanCents are set when the code has a print cost, otherwise null |
breakdowns | Top 10 values for each dimension. Missing values are reported as Unknown. rule holds the matched redirect rule id (rule:variant for A/B splits). source is link when the short link was opened with ?src=link, otherwise qr |