curl --request GET \
--url https://jmpy.me/api/v1/qranalytics/utm \
--header 'Authorization: Bearer <token>'{
"data": {
"utmParameter": "<string>",
"utmData": [
{
"utm_[parameter]": "<string>",
"scans": 123,
"uniqueScanners": 123,
"percentage": 123,
"qrCodes": [
{}
]
}
],
"totals": {
"totalScans": 123,
"totalUniqueScanners": 123,
"uniqueValues": 123
},
"period": {
"days": 123,
"startDate": "<string>",
"endDate": "<string>"
}
}
}Get UTM campaign analytics for QR code scans
curl --request GET \
--url https://jmpy.me/api/v1/qranalytics/utm \
--header 'Authorization: Bearer <token>'{
"data": {
"utmParameter": "<string>",
"utmData": [
{
"utm_[parameter]": "<string>",
"scans": 123,
"uniqueScanners": 123,
"percentage": 123,
"qrCodes": [
{}
]
}
],
"totals": {
"totalScans": 123,
"totalUniqueScanners": 123,
"uniqueValues": 123
},
"period": {
"days": 123,
"startDate": "<string>",
"endDate": "<string>"
}
}
}utm_source, utm_medium, utm_campaign, utm_term, and utm_content.source - Where the traffic originates (e.g., google, facebook, newsletter)medium - Marketing medium (e.g., email, cpc, social)campaign - Campaign name (e.g., spring_sale, product_launch)term - Paid search keywordscontent - Specific ad or link variationall for all QR codes.Show UTM Data Object
Show UTM Value Object
utm_source).# Get UTM source analytics for last 30 days
curl -X GET "https://jmpy.me/api/v1/qranalytics/utm?utmParameter=source&days=30" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get UTM campaign analytics
curl -X GET "https://jmpy.me/api/v1/qranalytics/utm?utmParameter=campaign&days=90" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get UTM analytics for a specific QR code
curl -X GET "https://jmpy.me/api/v1/qranalytics/utm?utmParameter=source&qrCodeId=550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer YOUR_API_KEY"
const fetch = require('node-fetch');
// Get UTM source breakdown
const response = await fetch(
'https://jmpy.me/api/v1/qranalytics/utm?utmParameter=source&days=30',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}
);
const { data } = await response.json();
console.log('UTM Source Analytics:');
data.data.utmData.forEach(item => {
console.log(` ${item.utm_source}: ${item.scans} scans (${item.percentage}%)`);
});
console.log(`\nTotal: ${data.data.totals.totalScans} scans`);
console.log(`Unique values: ${data.data.totals.uniqueValues}`);
import axios from 'axios';
interface UTMAnalytics {
data: {
utmParameter: string;
utmData: Array<{
[key: string]: string | number | Array<any>;
scans: number;
uniqueScanners: number;
percentage: number;
qrCodes: Array<{ qr_id: string; qr_name: string; scans: number }>;
}>;
totals: {
totalScans: number;
totalUniqueScanners: number;
uniqueValues: number;
};
period: {
days: number;
startDate: string;
endDate: string;
};
};
}
const response = await axios.get<{ success: boolean; data: UTMAnalytics }>(
'https://jmpy.me/api/v1/qranalytics/utm',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' },
params: {
utmParameter: 'source',
days: 30
}
}
);
const utmData = response.data.data.data;
console.log(`Analyzing UTM ${utmData.utmParameter}`);
console.log(`Total scans with UTM: ${utmData.totals.totalScans}`);
import requests
# Get UTM campaign analytics
response = requests.get(
'https://jmpy.me/api/v1/qranalytics/utm',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={
'utmParameter': 'campaign',
'days': 30
}
)
data = response.json()['data']['data']
print(f"UTM {data['utmParameter']} Analytics:")
print(f"Period: {data['period']['days']} days")
print()
for item in data['utmData']:
campaign = item.get('utm_campaign', 'Unknown')
print(f"Campaign: {campaign}")
print(f" Scans: {item['scans']} ({item['percentage']}%)")
print(f" Unique: {item['uniqueScanners']}")
print()
print(f"Total: {data['totals']['totalScans']} scans")
<?php
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://jmpy.me/api/v1/qranalytics/utm', [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY'
],
'query' => [
'utmParameter' => 'source',
'days' => 30
]
]);
$data = json_decode($response->getBody(), true)['data']['data'];
echo "UTM Source Analytics:\n";
foreach ($data['utmData'] as $item) {
$source = $item['utm_source'];
echo " {$source}: {$item['scans']} scans ({$item['percentage']}%)\n";
}
echo "\nTotal: {$data['totals']['totalScans']} scans\n";
?>
package main
import (
"fmt"
"net/http"
"net/url"
"io"
)
func main() {
baseURL := "https://jmpy.me/api/v1/qranalytics/utm"
params := url.Values{}
params.Add("utmParameter", "source")
params.Add("days", "30")
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;
HttpClient client = HttpClient.newHttpClient();
String url = "https://jmpy.me/api/v1/qranalytics/utm" +
"?utmParameter=source&days=30";
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": {
"utmParameter": "source",
"utmData": [
{
"utm_source": "facebook",
"scans": 456,
"uniqueScanners": 380,
"percentage": 35.2,
"qrCodes": [
{
"qr_id": "550e8400-e29b-41d4-a716-446655440000",
"qr_name": "Product Launch",
"short_code": "abc123",
"scans": 234
}
]
},
{
"utm_source": "google",
"scans": 312,
"uniqueScanners": 260,
"percentage": 24.1,
"qrCodes": [
{
"qr_id": "660e8400-e29b-41d4-a716-446655440001",
"qr_name": "Store Display",
"short_code": "def456",
"scans": 189
}
]
},
{
"utm_source": "email",
"scans": 234,
"uniqueScanners": 190,
"percentage": 18.1,
"qrCodes": []
},
{
"utm_source": "linkedin",
"scans": 156,
"uniqueScanners": 130,
"percentage": 12.0,
"qrCodes": []
}
],
"totals": {
"totalScans": 1296,
"totalUniqueScanners": 1050,
"uniqueValues": 5
},
"period": {
"days": 30,
"startDate": "2024-12-08T00:00:00Z",
"endDate": "2025-01-07T15:30:00Z"
}
}
}
}
{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "User authentication required"
}
}
{
"success": false,
"error": {
"code": "FEATURE_DISABLED",
"message": "UTM analytics is not available on your current plan",
"details": {
"feature": "UTM analytics",
"currentPlan": "Free"
}
}
}
Compare marketing channels
async function compareChannels() {
const response = await fetch(
'https://jmpy.me/api/v1/qranalytics/utm?utmParameter=medium&days=30',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
const channels = data.data.utmData.map(item => ({
channel: item.utm_medium,
scans: item.scans,
unique: item.uniqueScanners,
conversionRate: (item.uniqueScanners / item.scans * 100).toFixed(1) + '%'
}));
console.log('Channel Performance:');
channels.forEach(ch => {
console.log(`${ch.channel}: ${ch.scans} scans (${ch.unique} unique)`);
});
// Find best performing
const best = channels.sort((a, b) => b.scans - a.scans)[0];
console.log(`\nBest channel: ${best.channel}`);
}
Track campaign ROI
import requests
def track_campaign_roi(campaign_name, cost_per_scan_target=0.10):
response = requests.get(
'https://jmpy.me/api/v1/qranalytics/utm',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={
'utmParameter': 'campaign',
'days': 30
}
)
data = response.json()['data']['data']
# Find specific campaign
campaign = next(
(c for c in data['utmData'] if c.get('utm_campaign') == campaign_name),
None
)
if not campaign:
print(f"Campaign '{campaign_name}' not found")
return
print(f"Campaign: {campaign_name}")
print(f"Total Scans: {campaign['scans']}")
print(f"Unique Visitors: {campaign['uniqueScanners']}")
print(f"Share of Traffic: {campaign['percentage']}%")
# Calculate cost effectiveness
# If you spent $100 on this campaign
budget = 100
cost_per_scan = budget / campaign['scans'] if campaign['scans'] > 0 else 0
print(f"\nCost per Scan: ${cost_per_scan:.2f}")
print(f"Target: ${cost_per_scan_target:.2f}")
if cost_per_scan <= cost_per_scan_target:
print("✅ Campaign is cost-effective!")
else:
print("⚠️ Campaign exceeds target cost per scan")
Build UTM dashboard
interface UTMDashboard {
sources: any[];
mediums: any[];
campaigns: any[];
summary: {
totalTracked: number;
topSource: string;
topCampaign: string;
};
}
async function buildUTMDashboard(): Promise<UTMDashboard> {
const [sources, mediums, campaigns] = await Promise.all([
fetch('https://jmpy.me/api/v1/qranalytics/utm?utmParameter=source&days=30', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}).then(r => r.json()),
fetch('https://jmpy.me/api/v1/qranalytics/utm?utmParameter=medium&days=30', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}).then(r => r.json()),
fetch('https://jmpy.me/api/v1/qranalytics/utm?utmParameter=campaign&days=30', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}).then(r => r.json())
]);
return {
sources: sources.data.data.utmData,
mediums: mediums.data.data.utmData,
campaigns: campaigns.data.data.utmData,
summary: {
totalTracked: sources.data.data.totals.totalScans,
topSource: sources.data.data.utmData[0]?.utm_source || 'N/A',
topCampaign: campaigns.data.data.utmData[0]?.utm_campaign || 'N/A'
}
};
}