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 device, browser, and OS analytics for QR code scans
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 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());
{
"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"
}
}
}
Optimize for mobile users
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
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
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
)
}
};
}