curl --request GET \
--url https://jmpy.me/api/v1/analytics/device/:shortUrlId \
--header 'Authorization: Bearer <token>'{
"data": {
"browsers": [
{
"name": "<string>",
"clicks": 123,
"percentage": 123
}
],
"operating_systems": [
{
"name": "<string>",
"clicks": 123,
"percentage": 123
}
],
"device_types": [
{
"type": "<string>",
"clicks": 123,
"percentage": 123
}
]
},
"total_device_combinations": 123
}Get device, browser, and OS analytics for a short URL
curl --request GET \
--url https://jmpy.me/api/v1/analytics/device/:shortUrlId \
--header 'Authorization: Bearer <token>'{
"data": {
"browsers": [
{
"name": "<string>",
"clicks": 123,
"percentage": 123
}
],
"operating_systems": [
{
"name": "<string>",
"clicks": 123,
"percentage": 123
}
],
"device_types": [
{
"type": "<string>",
"clicks": 123,
"percentage": 123
}
]
},
"total_device_combinations": 123
}550e8400-e29b-41d4-a716-446655440000abc123my-custom-linkShow Device Analytics Object
# Get device analytics by UUID
curl -X GET "https://jmpy.me/api/v1/analytics/device/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get device analytics by short code
curl -X GET "https://jmpy.me/api/v1/analytics/device/abc123" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get device analytics by custom alias
curl -X GET "https://jmpy.me/api/v1/analytics/device/my-promo-link" \
-H "Authorization: Bearer YOUR_API_KEY"
const fetch = require('node-fetch');
const shortUrlId = '550e8400-e29b-41d4-a716-446655440000';
const response = await fetch(
`https://jmpy.me/api/v1/analytics/device/${shortUrlId}`,
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}
);
const data = await response.json();
// Display device breakdown
console.log('Device Types:');
data.data.data.device_types.forEach(device => {
console.log(` ${device.type}: ${device.clicks} (${device.percentage}%)`);
});
import axios from 'axios';
interface DeviceAnalytics {
browsers: Array<{ name: string; clicks: number; percentage: number }>;
operating_systems: Array<{ name: string; clicks: number; percentage: number }>;
device_types: Array<{ type: string; clicks: number; percentage: number }>;
}
const shortUrlId = '550e8400-e29b-41d4-a716-446655440000';
const response = await axios.get<{ success: boolean; data: { data: DeviceAnalytics } }>(
`https://jmpy.me/api/v1/analytics/device/${shortUrlId}`,
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}
);
const { browsers, device_types } = response.data.data.data;
console.log('Top browser:', browsers[0]?.name);
console.log('Mobile vs Desktop:', device_types);
import requests
short_url_id = '550e8400-e29b-41d4-a716-446655440000'
response = requests.get(
f'https://jmpy.me/api/v1/analytics/device/{short_url_id}',
headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
data = response.json()['data']['data']
print("Browser Breakdown:")
for browser in data['browsers']:
print(f" {browser['name']}: {browser['clicks']} ({browser['percentage']}%)")
print("\nDevice Types:")
for device in data['device_types']:
print(f" {device['type']}: {device['clicks']} ({device['percentage']}%)")
<?php
$client = new GuzzleHttp\Client();
$shortUrlId = '550e8400-e29b-41d4-a716-446655440000';
$response = $client->request('GET',
"https://jmpy.me/api/v1/analytics/device/{$shortUrlId}", [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY'
]
]);
$data = json_decode($response->getBody(), true);
$analytics = $data['data']['data'];
echo "Top Browser: " . $analytics['browsers'][0]['name'] . "\n";
echo "Mobile Clicks: " . array_column($analytics['device_types'], 'clicks', 'type')['Mobile'] ?? 0;
?>
package main
import (
"fmt"
"net/http"
"io"
)
func main() {
shortUrlId := "550e8400-e29b-41d4-a716-446655440000"
url := fmt.Sprintf(
"https://jmpy.me/api/v1/analytics/device/%s",
shortUrlId,
)
req, _ := http.NewRequest("GET", url, 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;
String shortUrlId = "550e8400-e29b-41d4-a716-446655440000";
String url = String.format(
"https://jmpy.me/api/v1/analytics/device/%s",
shortUrlId
);
HttpClient client = HttpClient.newHttpClient();
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": {
"data": {
"browsers": [
{ "name": "Chrome", "clicks": 2345, "percentage": 51.8 },
{ "name": "Safari", "clicks": 1234, "percentage": 27.3 },
{ "name": "Firefox", "clicks": 567, "percentage": 12.5 },
{ "name": "Edge", "clicks": 234, "percentage": 5.2 },
{ "name": "Other", "clicks": 143, "percentage": 3.2 }
],
"operating_systems": [
{ "name": "iOS", "clicks": 1890, "percentage": 41.8 },
{ "name": "Android", "clicks": 1234, "percentage": 27.3 },
{ "name": "Windows", "clicks": 987, "percentage": 21.8 },
{ "name": "macOS", "clicks": 312, "percentage": 6.9 },
{ "name": "Linux", "clicks": 100, "percentage": 2.2 }
],
"device_types": [
{ "type": "Mobile", "clicks": 2654, "percentage": 58.7 },
{ "type": "Desktop", "clicks": 1569, "percentage": 34.7 },
{ "type": "Tablet", "clicks": 300, "percentage": 6.6 }
]
},
"total_device_combinations": 15
}
}
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Short URL not found",
"details": "No short URL found with code or alias: invalid-code"
}
}
GET /analytics/user-devices
curl -X GET "https://jmpy.me/api/v1/analytics/user-devices?days=30" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"success": true,
"data": {
"data": {
"browsers": [
{ "name": "Chrome", "clicks": 12450, "percentage": 48.2 },
{ "name": "Safari", "clicks": 8230, "percentage": 31.9 }
],
"operating_systems": [
{ "name": "iOS", "clicks": 9870, "percentage": 38.2 },
{ "name": "Android", "clicks": 7650, "percentage": 29.6 }
],
"device_types": [
{ "type": "Mobile", "clicks": 15430, "percentage": 59.7 },
{ "type": "Desktop", "clicks": 9120, "percentage": 35.3 }
]
}
}
}
Optimize for mobile users
async function getMobileDesktopRatio(shortUrlId) {
const response = await fetch(
`https://jmpy.me/api/v1/analytics/device/${shortUrlId}`,
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
const devices = data.data.device_types;
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(short_url_id):
response = requests.get(
f'https://jmpy.me/api/v1/analytics/device/{short_url_id}',
headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
browsers = response.json()['data']['data']['browsers']
# Group into tiers
tier1 = [b for b in browsers if b['percentage'] >= 10] # Must support
tier2 = [b for b in browsers if 5 <= b['percentage'] < 10] # Should support
tier3 = [b for b in browsers if b['percentage'] < 5] # Nice to have
print("=== Browser Testing Priority ===")
print("\nTier 1 (Must Test):")
for b in tier1:
print(f" - {b['name']}: {b['percentage']}%")
print("\nTier 2 (Should Test):")
for b in tier2:
print(f" - {b['name']}: {b['percentage']}%")
Create device analytics chart
interface ChartData {
labels: string[];
values: number[];
percentages: number[];
}
async function getDeviceChartData(shortUrlId: string): Promise<{
devices: ChartData;
browsers: ChartData;
}> {
const response = await fetch(
`https://jmpy.me/api/v1/analytics/device/${shortUrlId}`,
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
const analytics = data.data;
return {
devices: {
labels: analytics.device_types.map(d => d.type),
values: analytics.device_types.map(d => d.clicks),
percentages: analytics.device_types.map(d => d.percentage)
},
browsers: {
labels: analytics.browsers.map(b => b.name),
values: analytics.browsers.map(b => b.clicks),
percentages: analytics.browsers.map(b => b.percentage)
}
};
}