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 parameterNotes
fromStart, ISO 8601 with a time and offset, e.g. 2026-10-01T00:00:00Z. Default: 30 days before to
toEnd, 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 }]
    }
  }
}
FieldNotes
range.clampedtrue when from was earlier than the plan's history allows and was moved forward
timezoneThe workspace time zone used for series days and the heatmap
totals.scansHuman scans in the range
totals.uniquesDistinct visitors. Visitor ids rotate daily, so a person who scans on two days counts twice
totals.botsBot scans in the range, not included elsewhere
seriesOne row per day in the range, including days with no scans
heatmapScans by weekday (0 = Sunday) and hour, in the workspace time zone
codesPer-code totals, top 50 by scans. costCents and costPerScanCents are set when the code has a print cost, otherwise null
breakdownsTop 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