Skip to main content
The GetQR API is in beta and is available to selected workspaces. Details may change before the general release.
Get scan totals and breakdowns by country, device, browser and more, for a single QR code or across your workspace. For a ready-made summary per QR code, see Reports.

What the numbers mean

  • Scans. Every count is in the clicks field. A scan is counted each time someone opens the QR code’s short link.
  • Unique scans. With unique=true, each visitor is counted once in the date range.
  • Scope. Numbers come from the QR code’s short link. A QR code without a short link has no scans to count.
  • History. Analytics can’t be reset through the API. Deleting a QR code doesn’t purge its historical scan data.

Headers

string
required
Bearer followed by your API key. See Authentication.

Query parameters

Both endpoints take these parameters. All of them are optional.
string
default:"count"
Breakdown dimension. count returns the total. See Breakdowns for every value and its response shape.
string
default:"30d"
Preset date range: 24h, 7d, 30d, 90d, 1y, mtd, qtd, ytd or all. See Date ranges. Ignored when you send start.
string
Start of a custom range, ISO 8601, for example 2026-08-01 or 2026-08-01T00:00:00Z. Takes precedence over interval. Must be earlier than end.
string
End of a custom range, ISO 8601. Defaults to the end of today. Used together with start or interval=all, and ignored with the other intervals.
string
default:"UTC"
IANA timezone used to align timeseries buckets, for example America/New_York. An unknown timezone returns 422.
boolean
default:"false"
true counts unique scans instead of total scans.
You can also send dimension filters.

Date ranges

For a custom range, send start and optionally end. Ranges of up to 2 days use hourly buckets, ranges over 180 days use monthly buckets, and everything in between uses daily buckets.

Dimension filters

Narrow the results to scans that match a filter. Different filters are combined with AND. Where a filter takes several values, separate them with commas: the values are combined with OR. An unknown country or continent code returns 422. Device, browser and OS names are matched with a capital first letter, so mobile works like Mobile. For example, scans from the US or Canada on mobile devices: ?country=US,CA&device=Mobile.

Breakdowns

count returns an object. Every other value returns an array, sorted by clicks from highest to lowest (timeseries is sorted by time). An unknown groupBy returns 422 with the list of valid values. Response when groupBy=count:
Response when groupBy=countries:

Get analytics for a QR code

GET /api/v1/qrs/{qrId}/analytics Returns scan statistics for one QR code, scoped to its short link. Takes the query parameters and dimension filters above.
string
required
ID of the QR code. Take it from the list or create response of QR codes.

Get workspace analytics

GET /api/v1/analytics Returns scan statistics across all QR codes in your workspace. Takes the query parameters and dimension filters above, plus these scoping parameters.
string
With key, limits the results to the short link with this domain, for example getqr.sh. The domain must belong to your workspace.
string
Short link slug, for example x7Kd2p1. Use it together with domain. Both are in the QR code object.
string
Comma-separated QR code types to include: website, pdf, image, video, whatsapp, social, wifi, app, feedback, vcard, sms, payment, location, multilink, email or event. See QR types.

Common issues

No short link with that domain and slug exists in your workspace. Copy domain and key from the QR code object.
The value isn’t supported. The error message names the parameter and lists the valid values.
Check that you use the same date range and timezone, and whether you count unique scans (unique=true) or total scans.

What’s next

Reports

QR codes

Analytics in the app

Rate limits