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 UTM tracking analytics for campaign performance
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
}all as the shortUrlId to get aggregated UTM analytics across all your short URLs.550e8400-e29b-41d4-a716-446655440000abc123my-custom-linkall: Get aggregated UTM data for all your URLsall: all, standard, branded, subdomain.See Branded Domains and Subdomains for more information.Show UTM Record Object
# 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("\nTraffic 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());
{
"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
}
}
}
GET /analytics/urls-with-utm
all, standard, branded, subdomain.curl -X GET "https://jmpy.me/api/v1/analytics/urls-with-utm?urlType=all" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"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"
}
]
}
Campaign performance comparison
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);
}
Source/Medium analysis
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
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);
}