QR Code Analytics
Scan analytics for a dynamic QR code: totals, daily series and
top breakdowns. Requires the analytics:read scope. Static codes
have no scan tracking and return 422.
curl --request GET \
--url https://api.useqrkit.com/v1/qr-codes/{id}/analytics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.useqrkit.com/v1/qr-codes/{id}/analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.useqrkit.com/v1/qr-codes/{id}/analytics', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.useqrkit.com/v1/qr-codes/{id}/analytics",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.useqrkit.com/v1/qr-codes/{id}/analytics"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.useqrkit.com/v1/qr-codes/{id}/analytics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.useqrkit.com/v1/qr-codes/{id}/analytics")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "analytics",
"qr_code_id": "qr_123",
"total_scans": 123,
"first_scan_at": "2023-11-07T05:31:56Z",
"last_scan_at": "2023-11-07T05:31:56Z",
"scans_by_day": [
{
"date": "2026-06-01",
"count": 123
}
],
"countries": [
{
"name": "<string>",
"count": 123
}
],
"cities": [
{
"name": "<string>",
"count": 123
}
],
"devices": [
{
"name": "<string>",
"count": 123
}
],
"operating_systems": [
{
"name": "<string>",
"count": 123
}
],
"browsers": [
{
"name": "<string>",
"count": 123
}
],
"referrers": [
{
"name": "<string>",
"count": 123
}
],
"languages": [
{
"name": "<string>",
"count": 123
}
]
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"gs1_code": "NOT_ENTITLED",
"field": "<string>",
"fields": [
"<string>"
],
"limit": 123,
"current_count": 123,
"requested": 123,
"plan_id": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"gs1_code": "NOT_ENTITLED",
"field": "<string>",
"fields": [
"<string>"
],
"limit": 123,
"current_count": 123,
"requested": 123,
"plan_id": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"gs1_code": "NOT_ENTITLED",
"field": "<string>",
"fields": [
"<string>"
],
"limit": 123,
"current_count": 123,
"requested": 123,
"plan_id": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"gs1_code": "NOT_ENTITLED",
"field": "<string>",
"fields": [
"<string>"
],
"limit": 123,
"current_count": 123,
"requested": 123,
"plan_id": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Authorizations
API key in the Authorization header: Bearer qr_live_… or Bearer qr_test_…. Token endpoints take a Clerk session JWT instead.
Path Parameters
Query Parameters
Include scans on/after this date.
Include scans on/before this date.
Response
Analytics summary
"analytics"
"qr_123"
Show child attributes
Show child attributes
Top 10 values with scan counts.
Show child attributes
Show child attributes
Top 10 values with scan counts.
Show child attributes
Show child attributes
Top 10 values with scan counts.
Show child attributes
Show child attributes
Top 10 values with scan counts.
Show child attributes
Show child attributes
Top 10 values with scan counts.
Show child attributes
Show child attributes
Top 10 values with scan counts.
Show child attributes
Show child attributes
Top 10 values with scan counts.
Show child attributes
Show child attributes
curl --request GET \
--url https://api.useqrkit.com/v1/qr-codes/{id}/analytics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.useqrkit.com/v1/qr-codes/{id}/analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.useqrkit.com/v1/qr-codes/{id}/analytics', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.useqrkit.com/v1/qr-codes/{id}/analytics",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.useqrkit.com/v1/qr-codes/{id}/analytics"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.useqrkit.com/v1/qr-codes/{id}/analytics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.useqrkit.com/v1/qr-codes/{id}/analytics")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "analytics",
"qr_code_id": "qr_123",
"total_scans": 123,
"first_scan_at": "2023-11-07T05:31:56Z",
"last_scan_at": "2023-11-07T05:31:56Z",
"scans_by_day": [
{
"date": "2026-06-01",
"count": 123
}
],
"countries": [
{
"name": "<string>",
"count": 123
}
],
"cities": [
{
"name": "<string>",
"count": 123
}
],
"devices": [
{
"name": "<string>",
"count": 123
}
],
"operating_systems": [
{
"name": "<string>",
"count": 123
}
],
"browsers": [
{
"name": "<string>",
"count": 123
}
],
"referrers": [
{
"name": "<string>",
"count": 123
}
],
"languages": [
{
"name": "<string>",
"count": 123
}
]
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"gs1_code": "NOT_ENTITLED",
"field": "<string>",
"fields": [
"<string>"
],
"limit": 123,
"current_count": 123,
"requested": 123,
"plan_id": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"gs1_code": "NOT_ENTITLED",
"field": "<string>",
"fields": [
"<string>"
],
"limit": 123,
"current_count": 123,
"requested": 123,
"plan_id": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"gs1_code": "NOT_ENTITLED",
"field": "<string>",
"fields": [
"<string>"
],
"limit": 123,
"current_count": 123,
"requested": 123,
"plan_id": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"gs1_code": "NOT_ENTITLED",
"field": "<string>",
"fields": [
"<string>"
],
"limit": 123,
"current_count": 123,
"requested": 123,
"plan_id": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}
