Get detailed UTM parameter analytics to track the performance of your marketing campaigns. Analyze traffic by source, medium, campaign, term, and content.
Use all as the shortUrlId to get aggregated UTM analytics across all your short URLs.
Path Parameters
Short URL identifier. Accepts:
UUID : 550e8400-e29b-41d4-a716-446655440000
Short code : abc123
Custom alias : my-custom-link
all : Get aggregated UTM data for all your URLs
Query Parameters
Filter by URL type when using all: all, standard, branded, subdomain. See Branded Domains and Subdomains for more information.
Start date for filtering (ISO 8601).
End date for filtering (ISO 8601).
Predefined date range: last_hour, last_24_hours, last_7_days, last_30_days, last_year, all_time, custom.
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
Array of UTM campaign records. Traffic source (e.g., “google”, “facebook”, “newsletter”).
Marketing medium (e.g., “cpc”, “email”, “social”).
Campaign name (e.g., “spring_sale”, “product_launch”).
Content variant for A/B testing.
Number of clicks with these UTM parameters.
Number of unique visitors.
Total number of unique UTM campaign combinations.
Request Examples
cURL
Node.js
TypeScript
Python
PHP
Go
Java
# Get UTM analytics for a specific URL
curl -X GET "https://jmpy.me/api/v1/analytics/utm/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get UTM analytics for all URLs
curl -X GET "https://jmpy.me/api/v1/analytics/utm/all" \
-H "Authorization: Bearer YOUR_API_KEY"
# Filter by URL type and date range
curl -X GET "https://jmpy.me/api/v1/analytics/utm/all?urlType=branded&startDate=2024-01-01&endDate=2024-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
const fetch = require ( 'node-fetch' );
// Get UTM analytics for all URLs
const response = await fetch (
'https://jmpy.me/api/v1/analytics/utm/all' ,
{
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' }
}
);
const data = await response . json ();
// Group by campaign
const campaigns = {};
data . data . data . forEach ( record => {
const campaign = record . utm_campaign || 'No Campaign' ;
if ( ! campaigns [ campaign ]) {
campaigns [ campaign ] = { clicks: 0 , visitors: 0 };
}
campaigns [ campaign ]. clicks += record . clicks ;
campaigns [ campaign visitors += record . unique_visitors ;
});
console . log ( 'Campaign Performance:' );
Object . entries ( campaigns )
. sort (( a , b ) => b [ 1 ]. clicks - a [ 1 ]. clicks )
. forEach (([ name , stats ]) => {
console . log ( ` ${ name } : ${ stats . clicks } clicks, ${ stats . visitors } visitors` );
});
import axios from 'axios' ;
interface UTMRecord {
utm_source : string ;
utm_medium : string ;
utm_campaign : string ;
utm_term : string | null ;
utm_content : string | null ;
clicks : number ;
unique_visitors : number ;
}
interface UTMAnalyticsResponse {
data : UTMRecord [];
total_campaigns : number ;
}
// Get all UTM analytics
const response = await axios . get <{ success : boolean ; data : UTMAnalyticsResponse }>(
'https://jmpy.me/api/v1/analytics/utm/all' ,
{
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' },
params: { urlType: 'all' }
}
);
// Find top performing campaigns
const topCampaigns = response . data . data . data
. filter ( r => r . utm_campaign )
. sort (( a , b ) => b . clicks - a . clicks )
. slice ( 0 , 10 );
console . log ( 'Top 10 Campaigns:' , topCampaigns );
import requests
from collections import defaultdict
# Get UTM analytics for all URLs
response = requests.get(
'https://jmpy.me/api/v1/analytics/utm/all' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'urlType' : 'all' }
)
data = response.json()[ 'data' ]
records = data[ 'data' ]
# Aggregate by source
sources = defaultdict( lambda : { 'clicks' : 0 , 'visitors' : 0 })
for record in records:
source = record[ 'utm_source' ] or 'Unknown'
sources[source][ 'clicks' ] += record[ 'clicks' ]
sources[source][ 'visitors' ] += record[ 'unique_visitors' ]
print ( f "Total UTM Campaigns: { data[ 'total_campaigns' ] } " )
print ( " \n Traffic by Source:" )
for source, stats in sorted (sources.items(), key = lambda x : - x[ 1 ][ 'clicks' ]):
print ( f " { source } : { stats[ 'clicks' ] } clicks" )
<? php
$client = new GuzzleHttp\ Client ();
$response = $client -> request ( 'GET' , 'https://jmpy.me/api/v1/analytics/utm/all' , [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY'
],
'query' => [
'urlType' => 'all'
]
]);
$data = json_decode ( $response -> getBody (), true )[ 'data' ];
echo "Total Campaigns: " . $data [ 'total_campaigns' ] . " \n\n " ;
// Group by medium
$mediums = [];
foreach ( $data [ 'data' ] as $record ) {
$medium = $record [ 'utm_medium' ] ?: 'Unknown' ;
if ( ! isset ( $mediums [ $medium ])) {
$mediums [ $medium ] = 0 ;
}
$mediums [ $medium ] += $record [ 'clicks' ];
}
arsort ( $mediums );
echo "Clicks by Medium: \n " ;
foreach ( $mediums as $medium => $clicks ) {
echo " $medium : $clicks clicks \n " ;
}
?>
package main
import (
" fmt "
" net/http "
" io "
)
func main () {
url := "https://jmpy.me/api/v1/analytics/utm/all?urlType=all"
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 url = "https://jmpy.me/api/v1/analytics/utm/all?urlType=all" ;
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
200 OK
403 Feature Disabled
{
"success" : true ,
"data" : {
"data" : [
{
"utm_source" : "google" ,
"utm_medium" : "cpc" ,
"utm_campaign" : "spring_sale_2024" ,
"utm_term" : "discount shoes" ,
"utm_content" : "banner_a" ,
"clicks" : 1234 ,
"unique_visitors" : 1098
},
{
"utm_source" : "facebook" ,
"utm_medium" : "social" ,
"utm_campaign" : "spring_sale_2024" ,
"utm_term" : null ,
"utm_content" : "carousel" ,
"clicks" : 876 ,
"unique_visitors" : 743
},
{
"utm_source" : "newsletter" ,
"utm_medium" : "email" ,
"utm_campaign" : "weekly_digest" ,
"utm_term" : null ,
"utm_content" : "header_cta" ,
"clicks" : 567 ,
"unique_visitors" : 512
}
],
"total_campaigns" : 15
}
}
{
"success" : false ,
"error" : {
"code" : "FEATURE_DISABLED" ,
"message" : "UTM tracking analytics is not available on your current plan" ,
"details" : {
"feature" : "UTM tracking analytics" ,
"currentPlan" : "Free" ,
"upgradeRequired" : true
}
}
}
List URLs with UTM Data
Get a list of all short URLs that have UTM tracking data.
Endpoint
GET /analytics/urls-with-utm
Query Parameters
Filter by URL type: all, standard, branded, subdomain.
Request Example
curl -X GET "https://jmpy.me/api/v1/analytics/urls-with-utm?urlType=all" \
-H "Authorization: Bearer YOUR_API_KEY"
Response Example
{
"success" : true ,
"data" : [
{
"id" : "550e8400-e29b-41d4-a716-446655440000" ,
"short_code" : "abc123" ,
"short_url" : "https://jmpy.me/abc123" ,
"name" : "Spring Sale Landing Page" ,
"original_url" : "https://example.com/spring-sale" ,
"created_at" : "2024-01-15T10:30:00Z" ,
"url_type" : "standard" ,
"branded_domain" : null ,
"subdomain" : null ,
"custom_alias" : null
},
{
"id" : "661f9511-f3ac-52e5-b827-557766551111" ,
"short_code" : "def456" ,
"short_url" : "https://go.mycompany.com/promo" ,
"name" : "Product Launch Campaign" ,
"original_url" : "https://example.com/new-product" ,
"created_at" : "2024-02-01T14:00:00Z" ,
"url_type" : "branded" ,
"branded_domain" : "go.mycompany.com" ,
"subdomain" : null ,
"custom_alias" : "promo"
}
]
}
UTM tracking analytics may be restricted based on your plan. Free plans have limited access to UTM data. Upgrade to Pro or Enterprise for full UTM tracking capabilities.
Use Cases
Campaign performance comparison
Analyze traffic quality by source and medium combinations. import requests
from collections import defaultdict
def analyze_source_medium ():
response = requests.get(
'https://jmpy.me/api/v1/analytics/utm/all' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' }
)
records = response.json()[ 'data' ][ 'data' ]
# Group by source/medium combination
combos = defaultdict( lambda : { 'clicks' : 0 , 'visitors' : 0 })
for record in records:
key = f " { record[ 'utm_source' ] or 'direct' } / { record[ 'utm_medium' ] or 'none' } "
combos[key][ 'clicks' ] += record[ 'clicks' ]
combos[key][ 'visitors' ] += record[ 'unique_visitors' ]
# Sort by clicks and display
print ( "Source/Medium Analysis" )
print ( "=" * 60 )
for key, stats in sorted (combos.items(), key = lambda x : - x[ 1 ][ 'clicks' ]):
engagement = stats[ 'visitors' ] / stats[ 'clicks' ] if stats[ 'clicks' ] > 0 else 0
print ( f " \n { key } :" )
print ( f " Clicks: { stats[ 'clicks' ] } " )
print ( f " Unique Visitors: { stats[ 'visitors' ] } " )
print ( f " Engagement Rate: { engagement :.1%} " )
A/B content testing with UTM
Compare performance of different content variants using utm_content. interface ContentVariant {
content : string ;
clicks : number ;
visitors : number ;
conversion : number ;
}
async function analyzeContentVariants ( campaignName : string ) : Promise < ContentVariant []> {
const response = await fetch (
'https://jmpy.me/api/v1/analytics/utm/all' ,
{ headers: { 'Authorization' : 'Bearer YOUR_API_KEY' } }
);
const { data } = await response . json ();
// Filter to specific campaign and group by content
const variants : Record < string , ContentVariant > = {};
data . data
. filter ( r => r . utm_campaign === campaignName && r . utm_content )
. forEach ( record => {
const content = record . utm_content ;
if ( ! variants [ content ]) {
variants [ content ] = {
content ,
clicks: 0 ,
visitors: 0 ,
conversion: 0
};
}
variants [ content ]. clicks += record . clicks ;
variants [ content ]. visitors += record . unique_visitors ;
});
// Calculate conversion rates and sort
return Object . values ( variants )
. map ( v => ({
... v ,
conversion: v . clicks > 0 ? ( v . visitors / v . clicks ) * 100 : 0
}))
. sort (( a , b ) => b . clicks - a . clicks );
}
Referrer Analytics See overall traffic sources
Create Short URL Create URLs with UTM parameters
Campaigns Organize URLs into campaigns
Complete Analytics Get all analytics in one request