curl --request GET \
--url https://jmpy.me/api/v1/analytics/complete/:shortUrlId \
--header 'Authorization: Bearer <token>'{
"basic": {
"total_clicks": 123,
"unique_visitors": 123,
"clicks_by_day": [
{}
]
},
"utm": [
{}
],
"geographic": [
{}
],
"device": {},
"clicks": [
{}
],
"filters": {
"startDate": "<string>",
"endDate": "<string>"
}
}Get all analytics data for a short URL in a single request
curl --request GET \
--url https://jmpy.me/api/v1/analytics/complete/:shortUrlId \
--header 'Authorization: Bearer <token>'{
"basic": {
"total_clicks": 123,
"unique_visitors": 123,
"clicks_by_day": [
{}
]
},
"utm": [
{}
],
"geographic": [
{}
],
"device": {},
"clicks": [
{}
],
"filters": {
"startDate": "<string>",
"endDate": "<string>"
}
}550e8400-e29b-41d4-a716-446655440000abc123my-custom-link# Get complete analytics by UUID
curl -X GET "https://jmpy.me/api/v1/analytics/complete/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get complete analytics with date filter
curl -X GET "https://jmpy.me/api/v1/analytics/complete/abc123?startDate=2024-01-01&endDate=2024-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get complete analytics by custom alias
curl -X GET "https://jmpy.me/api/v1/analytics/complete/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/complete/${shortUrlId}`,
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}
);
const data = await response.json();
// Access different analytics sections
const { basic, utm, geographic, device, clicks } = data.data;
console.log('=== Complete Analytics Summary ===');
console.log(`Total Clicks: ${basic.total_clicks}`);
console.log(`Unique Visitors: ${basic.unique_visitors}`);
console.log(`UTM Campaigns: ${utm.length}`);
console.log(`Locations: ${geographic.length}`);
console.log(`Device Types: ${device.device_types?.length || 0}`);
console.log(`Click Records: ${clicks.length}`);
import axios from 'axios';
interface CompleteAnalytics {
basic: {
total_clicks: number;
unique_visitors: number;
clicks_by_day: Array<{ date: string; clicks: number }>;
};
utm: Array<{
utm_source: string;
utm_medium: string;
utm_campaign: string;
clicks: number;
}>;
geographic: Array<{
country: string;
city: string;
clicks: number;
}>;
device: {
browsers: Array<{ name: string; clicks: number }>;
device_types: Array<{ type: string; clicks: number }>;
};
clicks: Array<{
clicked_at: string;
country: string;
device_type: string;
}>;
filters: {
startDate: string | null;
endDate: string | null;
};
}
const shortUrlId = '550e8400-e29b-41d4-a716-446655440000';
const response = await axios.get<{ success: boolean; data: CompleteAnalytics }>(
`https://jmpy.me/api/v1/analytics/complete/${shortUrlId}`,
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' },
params: {
startDate: '2024-01-01',
endDate: '2024-03-31'
}
}
);
const analytics = response.data.data;
console.log('Complete analytics retrieved:', analytics);
import requests
import json
short_url_id = '550e8400-e29b-41d4-a716-446655440000'
response = requests.get(
f'https://jmpy.me/api/v1/analytics/complete/{short_url_id}',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={
'startDate': '2024-01-01',
'endDate': '2024-03-31'
}
)
analytics = response.json()['data']
print("=== Complete Analytics Report ===\n")
# Basic metrics
print("📊 Basic Metrics:")
print(f" Total Clicks: {analytics['basic']['total_clicks']}")
print(f" Unique Visitors: {analytics['basic']['unique_visitors']}")
# Top countries
print("\n🌍 Top Countries:")
for loc in analytics['geographic'][:5]:
print(f" {loc['country']}: {loc['clicks']} clicks")
# Device breakdown
print("\n📱 Devices:")
for device in analytics['device'].get('device_types', []):
print(f" {device['type']}: {device['clicks']} clicks")
# UTM campaigns
print(f"\n🎯 UTM Campaigns: {len(analytics['utm'])}")
<?php
$client = new GuzzleHttp\Client();
$shortUrlId = '550e8400-e29b-41d4-a716-446655440000';
$response = $client->request('GET',
"https://jmpy.me/api/v1/analytics/complete/{$shortUrlId}", [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY'
],
'query' => [
'startDate' => '2024-01-01',
'endDate' => '2024-03-31'
]
]);
$analytics = json_decode($response->getBody(), true)['data'];
echo "=== Complete Analytics ===\n\n";
echo "Total Clicks: " . $analytics['basic']['total_clicks'] . "\n";
echo "Unique Visitors: " . $analytics['basic']['unique_visitors'] . "\n";
echo "UTM Campaigns: " . count($analytics['utm']) . "\n";
echo "Locations Tracked: " . count($analytics['geographic']) . "\n";
?>
package main
import (
"fmt"
"net/http"
"net/url"
"io"
)
func main() {
shortUrlId := "550e8400-e29b-41d4-a716-446655440000"
baseURL := fmt.Sprintf(
"https://jmpy.me/api/v1/analytics/complete/%s",
shortUrlId,
)
params := url.Values{}
params.Add("startDate", "2024-01-01")
params.Add("endDate", "2024-03-31")
req, _ := http.NewRequest("GET", baseURL+"?"+params.Encode(), 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/complete/%s?startDate=2024-01-01&endDate=2024-03-31",
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());
{
"success": true,
"data": {
"basic": {
"total_clicks": 4523,
"unique_visitors": 3890,
"clicks_by_day": [
{ "date": "2024-01-15", "clicks": 234 },
{ "date": "2024-01-16", "clicks": 289 },
{ "date": "2024-01-17", "clicks": 312 }
]
},
"utm": [
{
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "spring_sale",
"clicks": 1234,
"unique_visitors": 1098
},
{
"utm_source": "facebook",
"utm_medium": "social",
"utm_campaign": "spring_sale",
"clicks": 567,
"unique_visitors": 489
}
],
"geographic": [
{
"country": "United States",
"country_code": "US",
"city": "New York",
"clicks": 534,
"percentage": 11.8
},
{
"country": "United Kingdom",
"country_code": "GB",
"city": "London",
"clicks": 423,
"percentage": 9.4
}
],
"device": {
"browsers": [
{ "name": "Chrome", "clicks": 2345, "percentage": 51.8 },
{ "name": "Safari", "clicks": 1234, "percentage": 27.3 }
],
"operating_systems": [
{ "name": "iOS", "clicks": 1890, "percentage": 41.8 },
{ "name": "Android", "clicks": 1234, "percentage": 27.3 }
],
"device_types": [
{ "type": "Mobile", "clicks": 2654, "percentage": 58.7 },
{ "type": "Desktop", "clicks": 1569, "percentage": 34.7 }
]
},
"clicks": [
{
"id": "click-uuid-1",
"clicked_at": "2024-01-15T14:32:00Z",
"country": "US",
"city": "New York",
"device_type": "mobile",
"browser": "Safari",
"referrer": "https://twitter.com"
}
],
"filters": {
"startDate": "2024-01-01T00:00:00.000Z",
"endDate": "2024-03-31T00:00:00.000Z"
}
}
}
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Short URL not found",
"details": "No short URL found with code or alias: invalid-code"
}
}
Generate a full analytics report
async function generateFullReport(shortUrlId) {
const response = await fetch(
`https://jmpy.me/api/v1/analytics/complete/${shortUrlId}`,
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
const report = {
generatedAt: new Date().toISOString(),
summary: {
totalClicks: data.basic.total_clicks,
uniqueVisitors: data.basic.unique_visitors,
conversionRate: ((data.basic.unique_visitors / data.basic.total_clicks) * 100).toFixed(2) + '%'
},
topCountries: data.geographic.slice(0, 10),
topBrowsers: data.device.browsers.slice(0, 5),
deviceBreakdown: data.device.device_types,
campaignPerformance: data.utm.map(u => ({
campaign: u.utm_campaign,
source: u.utm_source,
clicks: u.clicks
})),
recentClicks: data.clicks.slice(0, 20)
};
return report;
}
Build a dashboard widget
interface DashboardWidget {
clicks: number;
visitors: number;
topCountry: string;
topDevice: string;
activeCampaigns: number;
trend: Array<{ date: string; clicks: number }>;
}
async function getDashboardWidgetData(shortUrlId: string): Promise<DashboardWidget> {
const response = await fetch(
`https://jmpy.me/api/v1/analytics/complete/${shortUrlId}`,
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
return {
clicks: data.basic.total_clicks,
visitors: data.basic.unique_visitors,
topCountry: data.geographic[0]?.country || 'N/A',
topDevice: data.device.device_types[0]?.type || 'N/A',
activeCampaigns: new Set(data.utm.map(u => u.utm_campaign)).size,
trend: data.basic.clicks_by_day.slice(-7) // Last 7 days
};
}
Export to data warehouse
import requests
import json
from datetime import datetime
def export_to_warehouse(short_url_id, warehouse_client):
response = requests.get(
f'https://jmpy.me/api/v1/analytics/complete/{short_url_id}',
headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
analytics = response.json()['data']
export_timestamp = datetime.utcnow().isoformat()
# Prepare records for each table
# Clicks table
click_records = [{
'short_url_id': short_url_id,
'export_timestamp': export_timestamp,
**click
} for click in analytics['clicks']]
# Geographic summary table
geo_records = [{
'short_url_id': short_url_id,
'export_timestamp': export_timestamp,
**loc
} for loc in analytics['geographic']]
# UTM campaigns table
utm_records = [{
'short_url_id': short_url_id,
'export_timestamp': export_timestamp,
**utm
} for utm in analytics['utm']]
# Insert into warehouse
warehouse_client.insert('clicks', click_records)
warehouse_client.insert('geographic_analytics', geo_records)
warehouse_client.insert('utm_campaigns', utm_records)
print(f"Exported {len(click_records)} clicks, {len(geo_records)} locations, {len(utm_records)} campaigns")