Get detailed breakdown of devices, browsers, and operating systems used by visitors clicking your short URLs.
Path Parameters
Short URL identifier. Accepts:
UUID : 550e8400-e29b-41d4-a716-446655440000
Short code : abc123
Custom alias : my-custom-link
Query Parameters
Predefined date range: last_hour, last_24_hours, last_7_days, last_30_days, last_year, all_time, custom.
Start date for custom range (ISO 8601).
End date for custom range (ISO 8601).
Filter by URL type: all, standard, branded, subdomain.
Filter by Campaign UUID or name.
Comma-separated list of tags to filter by.
Filter clicks by country name (e.g. Pakistan, United States).
Filter clicks by ISO country code (e.g. pk, us). Supports alias country_code.
Filter clicks by region name (e.g. Sindh, California).
Filter clicks by city name (e.g. Karachi, New York).
Filter clicks by device type. Options: desktop, mobile, tablet. Supports alias device_type.
Filter clicks by browser (e.g. chrome, firefox, safari).
Filter clicks by OS (e.g. windows, macos, android, ios).
Filter clicks by UTM Source. Supports alias utm_source.
Filter clicks by UTM Medium. Supports alias utm_medium.
Filter clicks by UTM Campaign. Supports alias utm_campaign.
Filter clicks by UTM Term. Supports alias utm_term.
Filter clicks by UTM Content. Supports alias utm_content.
Filter clicks by referrer URL.
Filter clicks by referrer domain (e.g. t.co, facebook.com). Supports alias referrer_domain.
Response
Device analytics data. Show Device Analytics Object
Browser usage breakdown. Browser name (e.g., “Chrome”, “Safari”, “Firefox”).
Number of clicks from this browser.
Percentage of total clicks.
Operating system breakdown. OS name (e.g., “iOS”, “Android”, “Windows”, “macOS”).
Number of clicks from this OS.
Percentage of total clicks.
Device type breakdown. Device type: Mobile, Desktop, or Tablet.
Number of clicks from this device type.
Percentage of total clicks.
total_device_combinations
Total number of unique device combinations tracked.
Request Examples
cURL
Node.js
TypeScript
Python
PHP
Go
Java
# 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 ( " \n Device 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 ());
Response Examples
{
"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"
}
}
User-Level Device Analytics
Get aggregated device analytics across all your short URLs.
Endpoint
GET /analytics/user-devices
Query Parameters
Number of days to include in analytics (1-365).
Predefined date range: last_hour, last_24_hours, last_7_days, last_30_days, last_year, all_time, custom.
Start date for custom range (ISO 8601).
End date for custom range (ISO 8601).
Filter by URL type: all, standard, branded, subdomain.
Filter by Campaign UUID or name.
Comma-separated list of tags to filter by.
Filter clicks by country name (e.g. Pakistan, United States).
Filter clicks by ISO country code (e.g. pk, us). Supports alias country_code.
Filter clicks by region name (e.g. Sindh, California).
Filter clicks by city name (e.g. Karachi, New York).
Filter clicks by device type. Options: desktop, mobile, tablet. Supports alias device_type.
Filter clicks by browser (e.g. chrome, firefox, safari).
Filter clicks by OS (e.g. windows, macos, android, ios).
Filter clicks by UTM Source. Supports alias utm_source.
Filter clicks by UTM Medium. Supports alias utm_medium.
Filter clicks by UTM Campaign. Supports alias utm_campaign.
Filter clicks by UTM Term. Supports alias utm_term.
Filter clicks by UTM Content. Supports alias utm_content.
Filter clicks by referrer URL.
Filter clicks by referrer domain (e.g. t.co, facebook.com). Supports alias referrer_domain.
Request Example
curl -X GET "https://jmpy.me/api/v1/analytics/user-devices?days=30" \
-H "Authorization: Bearer YOUR_API_KEY"
Response Example
{
"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 }
]
}
}
}
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.
Use Cases
Optimize for mobile users
Analyze mobile vs desktop traffic to prioritize responsive design. 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
Generate a report for QA teams showing which browsers to prioritize testing. 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 ( " \n Tier 1 (Must Test):" )
for b in tier1:
print ( f " - { b[ 'name' ] } : { b[ 'percentage' ] } %" )
print ( " \n Tier 2 (Should Test):" )
for b in tier2:
print ( f " - { b[ 'name' ] } : { b[ 'percentage' ] } %" )
Create device analytics chart
Prepare data for visualization in a chart library. 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 )
}
};
}
Location Analytics Get geographic distribution of clicks
Click Details Get individual click records with device info
Referrer Analytics See where your traffic is coming from
Complete Analytics Get all analytics in one request