Device Analytics
curl --request GET \
--url https://jmpy.me/api/v1/qranalytics/devices \
--header 'Authorization: Bearer <token>'{
"deviceTypes": [
{
"type": "<string>",
"scans": 123,
"uniqueScanners": 123,
"percentage": 123
}
],
"osBreakdown": [
{
"name": "<string>",
"scans": 123,
"uniqueScanners": 123
}
],
"browserBreakdown": [
{
"name": "<string>",
"scans": 123,
"uniqueScanners": 123
}
],
"totalScans": 123
}QR Code Analytics
Device Analytics
Get device, browser, and OS analytics for QR code scans
GET
/
qranalytics
/
devices
Device Analytics
curl --request GET \
--url https://jmpy.me/api/v1/qranalytics/devices \
--header 'Authorization: Bearer <token>'{
"deviceTypes": [
{
"type": "<string>",
"scans": 123,
"uniqueScanners": 123,
"percentage": 123
}
],
"osBreakdown": [
{
"name": "<string>",
"scans": 123,
"uniqueScanners": 123
}
],
"browserBreakdown": [
{
"name": "<string>",
"scans": 123,
"uniqueScanners": 123
}
],
"totalScans": 123
}Get detailed breakdown of devices, browsers, and operating systems used by visitors scanning your QR codes.
This endpoint returns user-level aggregated device data across all your QR codes. For device analytics on a specific QR code, use the Complete Analytics endpoint.
Query Parameters
Number of days to include in analytics (1-365).
Response
Total number of scans across all devices.
Device analytics may be restricted based on your plan. Users on free plans may have limited access to detailed device breakdowns. Upgrade to access full device analytics.
Request Examples
- cURL
- Node.js
- TypeScript
- Python
- PHP
- Go
- Java
# Get device analytics for last 30 days
curl -X GET "https://jmpy.me/api/v1/qranalytics/devices?days=30" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get device analytics for last 90 days
curl -X GET "https://jmpy.me/api/v1/qranalytics/devices?days=90" \
-H "Authorization: Bearer YOUR_API_KEY"
const fetch = require('node-fetch');
const response = await fetch(
'https://jmpy.me/api/v1/qranalytics/devices?days=30',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}
);
const data = await response.json();
// Display device breakdown
console.log('Device Types:');
data.data.deviceTypes.forEach(device => {
console.log(` ${device.type}: ${device.scans} (${device.percentage}%)`);
});
import axios from 'axios';
interface DeviceAnalytics {
deviceTypes: Array<{ type: string; scans: number; uniqueScanners: number; percentage: number }>;
osBreakdown: Array<{ name: string; scans: number; uniqueScanners: number }>;
browserBreakdown: Array<{ name: string; scans: number; uniqueScanners: number }>;
totalScans: number;
}
const response = await axios.get<{ success: boolean; data: DeviceAnalytics }>(
'https://jmpy.me/api/v1/qranalytics/devices',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' },
params: { days: 30 }
}
);
const { deviceTypes, osBreakdown, browserBreakdown } = response.data.data;
console.log('Top device:', deviceTypes[0]?.type);
console.log('Top OS:', osBreakdown[0]?.name);
console.log('Top browser:', browserBreakdown[0]?.name);
import requests
response = requests.get(
'https://jmpy.me/api/v1/qranalytics/devices',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={'days': 30}
)
data = response.json()['data']
print("Device Breakdown:")
for device in data['deviceTypes']:
print(f" {device['type']}: {device['scans']} ({device['percentage']}%)")
print("\nOS Breakdown:")
for os in data['osBreakdown']:
print(f" {os['name']}: {os['scans']} scans")
print("\nBrowser Breakdown:")
for browser in data['browserBreakdown']:
print(f" {browser['name']}: {browser['scans']} scans")
<?php
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://jmpy.me/api/v1/qranalytics/devices', [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY'
],
'query' => [
'days' => 30
]
]);
$data = json_decode($response->getBody(), true)['data'];
echo "Device Types:\n";
foreach ($data['deviceTypes'] as $device) {
echo " {$device['type']}: {$device['scans']} ({$device['percentage']}%)\n";
}
?>
package main
import (
"fmt"
"net/http"
"net/url"
"io"
)
func main() {
baseURL := "https://jmpy.me/api/v1/qranalytics/devices"
params := url.Values{}
params.Add("days", "30")
req, _ := http.NewRequest("GET", baseURL+"?"+params.Encode(), nil)
req.Header.Add("Authorization", "Bearer YOUR_API_KEY")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.URI;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
String url = "https://jmpy.me/api/v1/qranalytics/devices?days=30";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Authorization", "Bearer YOUR_API_KEY")
.GET()
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Response Examples
- 200 OK
- 401 Unauthorized
- 403 Feature Disabled
{
"success": true,
"data": {
"deviceTypes": [
{ "type": "Mobile", "scans": 2654, "uniqueScanners": 2100, "percentage": 58.7 },
{ "type": "Desktop", "scans": 1569, "uniqueScanners": 1200, "percentage": 34.7 },
{ "type": "Tablet", "scans": 300, "uniqueScanners": 250, "percentage": 6.6 }
],
"osBreakdown": [
{ "name": "iOS", "scans": 1890, "uniqueScanners": 1500 },
{ "name": "Android", "scans": 1234, "uniqueScanners": 980 },
{ "name": "Windows", "scans": 987, "uniqueScanners": 800 },
{ "name": "macOS", "scans": 312, "uniqueScanners": 250 },
{ "name": "Linux", "scans": 100, "uniqueScanners": 85 }
],
"browserBreakdown": [
{ "name": "Chrome", "scans": 2345, "uniqueScanners": 1900 },
{ "name": "Safari", "scans": 1234, "uniqueScanners": 1000 },
{ "name": "Firefox", "scans": 567, "uniqueScanners": 450 },
{ "name": "Edge", "scans": 234, "uniqueScanners": 190 },
{ "name": "Other", "scans": 143, "uniqueScanners": 120 }
],
"totalScans": 4523
}
}
{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "User authentication required"
}
}
{
"success": false,
"error": {
"code": "FEATURE_DISABLED",
"message": "Device analytics is not available on your current plan",
"details": {
"feature": "Device analytics",
"currentPlan": "Free"
}
}
}
Use Cases
Optimize for mobile users
Optimize for mobile users
Analyze mobile vs desktop traffic to prioritize responsive design for your landing pages.
async function getMobileDesktopRatio() {
const response = await fetch(
'https://jmpy.me/api/v1/qranalytics/devices?days=30',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
const devices = data.deviceTypes;
const mobile = devices.find(d => d.type === 'Mobile');
const desktop = devices.find(d => d.type === 'Desktop');
console.log(`Mobile: ${mobile?.percentage || 0}%`);
console.log(`Desktop: ${desktop?.percentage || 0}%`);
if (mobile && mobile.percentage > 60) {
console.log('Recommendation: Prioritize mobile-first design');
}
}
Browser compatibility report
Browser compatibility report
Generate a report for QA teams showing which browsers to prioritize testing.
import requests
def generate_browser_report():
response = requests.get(
'https://jmpy.me/api/v1/qranalytics/devices?days=30',
headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
browsers = response.json()['data']['browserBreakdown']
total = sum(b['scans'] for b in browsers)
# Group into tiers
tier1 = [b for b in browsers if (b['scans']/total)*100 >= 10] # Must support
tier2 = [b for b in browsers if 5 <= (b['scans']/total)*100 < 10] # Should support
tier3 = [b for b in browsers if (b['scans']/total)*100 < 5] # Nice to have
print("=== Browser Testing Priority ===")
print("\nTier 1 (Must Test):")
for b in tier1:
pct = (b['scans']/total)*100
print(f" - {b['name']}: {pct:.1f}%")
print("\nTier 2 (Should Test):")
for b in tier2:
pct = (b['scans']/total)*100
print(f" - {b['name']}: {pct:.1f}%")
Create device analytics chart
Create device analytics chart
Prepare data for visualization in a chart library.
interface ChartData {
labels: string[];
values: number[];
percentages: number[];
}
async function getDeviceChartData(): Promise<{
devices: ChartData;
browsers: ChartData;
}> {
const response = await fetch(
'https://jmpy.me/api/v1/qranalytics/devices?days=30',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
return {
devices: {
labels: data.deviceTypes.map(d => d.type),
values: data.deviceTypes.map(d => d.scans),
percentages: data.deviceTypes.map(d => d.percentage)
},
browsers: {
labels: data.browserBreakdown.map(b => b.name),
values: data.browserBreakdown.map(b => b.scans),
percentages: data.browserBreakdown.map(b =>
Math.round((b.scans / data.totalScans) * 1000) / 10
)
}
};
}
Related Endpoints
Location Analytics
Get geographic distribution of scans
Recent Activity
See individual scan records with device info
Referrer Analytics
See where your traffic is coming from
Complete Analytics
Get all analytics for a specific QR code
⌘I