Get detailed click records with timestamps, IP addresses, user agents, referrers, and geographic information.
The shortUrlId parameter is optional. If omitted, returns click details for all your URLs.
Path Parameters
Short URL identifier. Accepts:
UUID : 550e8400-e29b-41d4-a716-446655440000
Short code : abc123
Custom alias : my-custom-link
If omitted, returns clicks for all your URLs.
Query Parameters
Maximum number of click records to return (max 1000).
Number of records to skip for pagination.
Filter by link structure style. Options: standard, branded, subdomain.
Filter by Campaign UUID or name. Pass none for links with no campaign.
Filter by one or more comma-separated branded domains.
Filter by one or more comma-separated subdomains.
Filter clicks on dynamic vs static links.
Filter clicks on password/passcode-protected links.
Filter clicks by whether the link has Google Analytics UTM parameters.
Filter clicks on links that have configured expiration dates/time limits.
Filter clicks on links that use a custom short alias instead of a randomly generated one.
Filter clicks by a comma-separated list of tags.
Filter by interaction type. Options: all, clicks_only, scans_only.
Filter unique click events.
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
Array of click records. Unique click record identifier.
The short code of the clicked URL.
Click timestamp (ISO 8601).
Visitor’s IP address (anonymized based on settings).
Browser user agent string.
Country code (e.g., “US”).
Device type: mobile, desktop, tablet.
Browser name (e.g., “Chrome”, “Safari”).
Operating system (e.g., “Windows”, “iOS”).
Pagination information. Number of results per page.
Total number of records returned.
Request Examples
cURL
Node.js
TypeScript
Python
PHP
Go
Java
# Get clicks for a specific URL by UUID
curl -X GET "https://jmpy.me/api/v1/analytics/click-details/550e8400-e29b-41d4-a716-446655440000?limit=50" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get clicks for a URL by short code
curl -X GET "https://jmpy.me/api/v1/analytics/click-details/abc123?limit=100&offset=0" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get clicks for a URL by custom alias
curl -X GET "https://jmpy.me/api/v1/analytics/click-details/my-promo-link" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get all clicks (no shortUrlId)
curl -X GET "https://jmpy.me/api/v1/analytics/click-details?limit=50&offset=0" \
-H "Authorization: Bearer YOUR_API_KEY"
const fetch = require ( 'node-fetch' );
// Get clicks for a specific URL
const shortUrlId = '550e8400-e29b-41d4-a716-446655440000' ;
const response = await fetch (
`https://jmpy.me/api/v1/analytics/click-details/ ${ shortUrlId } ?limit=100` ,
{
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' }
}
);
const data = await response . json ();
// Process click data
data . data . data . forEach ( click => {
console . log ( ` ${ click . clicked_at } : ${ click . country } - ${ click . browser } ` );
});
import axios from 'axios' ;
interface ClickRecord {
id : string ;
short_code : string ;
original_url : string ;
clicked_at : string ;
ip_address : string ;
user_agent : string ;
referrer : string ;
country : string ;
city : string ;
device_type : 'mobile' | 'desktop' | 'tablet' ;
browser : string ;
os : string ;
}
interface ClickDetailsResponse {
data : ClickRecord [];
pagination : {
limit : number ;
offset : number ;
total : number ;
};
}
const shortUrlId = '550e8400-e29b-41d4-a716-446655440000' ;
const response = await axios . get <{ success : boolean ; data : ClickDetailsResponse }>(
`https://jmpy.me/api/v1/analytics/click-details/ ${ shortUrlId } ` ,
{
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' },
params: { limit: 100 , offset: 0 }
}
);
import requests
short_url_id = '550e8400-e29b-41d4-a716-446655440000'
response = requests.get(
f 'https://jmpy.me/api/v1/analytics/click-details/ { short_url_id } ' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'limit' : 100 , 'offset' : 0 }
)
data = response.json()
for click in data[ 'data' ][ 'data' ]:
print ( f " { click[ 'clicked_at' ] } : { click[ 'country' ] } - { click[ 'browser' ] } " )
<? php
$client = new GuzzleHttp\ Client ();
$shortUrlId = '550e8400-e29b-41d4-a716-446655440000' ;
$response = $client -> request ( 'GET' ,
"https://jmpy.me/api/v1/analytics/click-details/{ $shortUrlId }" , [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY'
],
'query' => [
'limit' => 100 ,
'offset' => 0
]
]);
$data = json_decode ( $response -> getBody (), true );
foreach ( $data [ 'data' ][ 'data' ] as $click ) {
echo $click [ 'clicked_at' ] . ': ' . $click [ 'country' ] . " \n " ;
}
?>
package main
import (
" fmt "
" net/http "
" io "
)
func main () {
shortUrlId := "550e8400-e29b-41d4-a716-446655440000"
url := fmt . Sprintf (
"https://jmpy.me/api/v1/analytics/click-details/ %s ?limit=100&offset=0" ,
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/click-details/%s?limit=100&offset=0" ,
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" : [
{
"id" : "click-uuid-1" ,
"short_code" : "abc123" ,
"original_url" : "https://example.com/page" ,
"clicked_at" : "2024-01-15T14:32:00Z" ,
"ip_address" : "192.168.xxx.xxx" ,
"user_agent" : "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0..." ,
"referrer" : "https://twitter.com" ,
"country" : "US" ,
"city" : "New York" ,
"device_type" : "mobile" ,
"browser" : "Safari" ,
"os" : "iOS"
},
{
"id" : "click-uuid-2" ,
"short_code" : "abc123" ,
"original_url" : "https://example.com/page" ,
"clicked_at" : "2024-01-15T14:28:00Z" ,
"ip_address" : "10.0.xxx.xxx" ,
"user_agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64)..." ,
"referrer" : "https://google.com" ,
"country" : "UK" ,
"city" : "London" ,
"device_type" : "desktop" ,
"browser" : "Chrome" ,
"os" : "Windows"
}
],
"pagination" : {
"limit" : 100 ,
"offset" : 0 ,
"total" : 2
}
}
}
{
"success" : false ,
"error" : {
"code" : "NOT_FOUND" ,
"message" : "Short URL not found" ,
"details" : "No short URL found with code or alias: invalid-code"
}
}
Use Cases
Fetch all clicks and export them for analysis in spreadsheet software. async function exportClicksToCSV ( shortUrlId ) {
let allClicks = [];
let offset = 0 ;
const limit = 1000 ;
// Paginate through all clicks
while ( true ) {
const response = await fetch (
`https://jmpy.me/api/v1/analytics/click-details/ ${ shortUrlId } ?limit= ${ limit } &offset= ${ offset } ` ,
{ headers: { 'Authorization' : 'Bearer YOUR_API_KEY' } }
);
const { data } = await response . json ();
allClicks = allClicks . concat ( data . data );
if ( data . data . length < limit ) break ;
offset += limit ;
}
// Convert to CSV
const headers = 'clicked_at,country,city,device_type,browser,os,referrer' ;
const rows = allClicks . map ( c =>
` ${ c . clicked_at } , ${ c . country } , ${ c . city } , ${ c . device_type } , ${ c . browser } , ${ c . os } , ${ c . referrer } `
);
return [ headers , ... rows ]. join ( ' \n ' );
}
Real-time click monitoring
Poll for new clicks and display them in real-time. async function monitorClicks ( shortUrlId , onNewClick ) {
let lastClickId = null ;
setInterval ( async () => {
const response = await fetch (
`https://jmpy.me/api/v1/analytics/click-details/ ${ shortUrlId } ?limit=10` ,
{ headers: { 'Authorization' : 'Bearer YOUR_API_KEY' } }
);
const { data } = await response . json ();
const clicks = data . data ;
if ( clicks . length > 0 && clicks [ 0 ]. id !== lastClickId ) {
// New clicks detected
const newClicks = lastClickId
? clicks . slice ( 0 , clicks . findIndex ( c => c . id === lastClickId ))
: clicks ;
newClicks . forEach ( click => onNewClick ( click ));
lastClickId = clicks [ 0 ]. id ;
}
}, 5000 ); // Poll every 5 seconds
}
Analyze traffic by country
Group clicks by country and calculate percentages. import requests
from collections import Counter
def analyze_by_country ( short_url_id ):
response = requests.get(
f 'https://jmpy.me/api/v1/analytics/click-details/ { short_url_id } ' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'limit' : 1000 }
)
clicks = response.json()[ 'data' ][ 'data' ]
countries = Counter(click[ 'country' ] for click in clicks)
total = len (clicks)
for country, count in countries.most_common():
percentage = (count / total) * 100
print ( f " { country } : { count } clicks ( { percentage :.1f} %)" )
Analytics Overview Get aggregated statistics for all your URLs
Location Analytics Get geographic breakdown of clicks
Device Analytics Get device and browser breakdown
Referrer Analytics Get traffic source analysis