GET
/
analytics
/
utm
/
:shortUrlId
UTM Analytics
curl --request GET \
  --url https://jmpy.me/api/v1/analytics/utm/:shortUrlId \
  --header 'Authorization: Bearer <token>'
{
  "data": [
    {
      "utm_source": "<string>",
      "utm_medium": "<string>",
      "utm_campaign": "<string>",
      "utm_term": "<string>",
      "utm_content": "<string>",
      "clicks": 123,
      "unique_visitors": 123
    }
  ],
  "total_campaigns": 123
}
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

shortUrlId
string
required
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

urlType
string
default:"all"
Filter by URL type when using all: all, standard, branded, subdomain.See Branded Domains and Subdomains for more information.
startDate
string
Start date for filtering (ISO 8601).
endDate
string
End date for filtering (ISO 8601).
dateRange
string
default:"all_time"
Predefined date range: last_hour, last_24_hours, last_7_days, last_30_days, last_year, all_time, custom.
campaignId
string
Filter by Campaign UUID or name.
tags
string
Comma-separated list of tags to filter by.
country
string
Filter clicks by country name (e.g. Pakistan, United States).
countryCode
string
Filter clicks by ISO country code (e.g. pk, us). Supports alias country_code.
region
string
Filter clicks by region name (e.g. Sindh, California).
city
string
Filter clicks by city name (e.g. Karachi, New York).
deviceType
string
Filter clicks by device type. Options: desktop, mobile, tablet. Supports alias device_type.
browser
string
Filter clicks by browser (e.g. chrome, firefox, safari).
os
string
Filter clicks by OS (e.g. windows, macos, android, ios).
utmSource
string
Filter clicks by UTM Source. Supports alias utm_source.
utmMedium
string
Filter clicks by UTM Medium. Supports alias utm_medium.
utmCampaign
string
Filter clicks by UTM Campaign. Supports alias utm_campaign.
utmTerm
string
Filter clicks by UTM Term. Supports alias utm_term.
utmContent
string
Filter clicks by UTM Content. Supports alias utm_content.
referrer
string
Filter clicks by referrer URL.
referrerDomain
string
Filter clicks by referrer domain (e.g. t.co, facebook.com). Supports alias referrer_domain.

Response

data
array
Array of UTM campaign records.
total_campaigns
integer
Total number of unique UTM campaign combinations.

Request Examples

# 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"

Response Examples

{
  "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
  }
}

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

urlType
string
default:"all"
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

Compare click-through rates across different campaigns.
async function compareCampaigns() {
  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.forEach(record => {
    const name = record.utm_campaign || 'Untagged';
    if (!campaigns[name]) {
      campaigns[name] = { clicks: 0, visitors: 0, sources: new Set() };
    }
    campaigns[name].clicks += record.clicks;
    campaigns[name].visitors += record.unique_visitors;
    campaigns[name].sources.add(record.utm_source);
  });
  
  // Sort and display
  const sorted = Object.entries(campaigns)
    .map(([name, stats]) => ({
      name,
      clicks: stats.clicks,
      visitors: stats.visitors,
      sources: Array.from(stats.sources),
      ctr: ((stats.visitors / stats.clicks) * 100).toFixed(1)
    }))
    .sort((a, b) => b.clicks - a.clicks);
  
  console.table(sorted);
}
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%}")
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