GET
https://jmpy.me/api/v1
/
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

days
integer
default:30
Number of days to include in analytics (1-365).

Response

deviceTypes
array
Device type breakdown (Mobile, Desktop, Tablet).
osBreakdown
array
Operating system breakdown.
browserBreakdown
array
Browser breakdown.
totalScans
integer
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

# 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"

Response Examples

{
  "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
  }
}

Use Cases

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');
  }
}
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}%")
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
      )
    }
  };
}