Traffic Sources
curl --request GET \
--url https://jmpy.me/api/v1/qranalytics/referrers \
--header 'Authorization: Bearer <token>'{
"trafficSources": [
{
"source": "<string>",
"scans": 123,
"uniqueScanners": 123,
"percentage": 123
}
],
"referrerDomains": [
{
"domain": "<string>",
"scans": 123,
"uniqueScanners": 123
}
],
"totalScans": 123
}QR Code Analytics
Traffic Sources
Get traffic source and referrer analytics for QR code scans
GET
/
qranalytics
/
referrers
Traffic Sources
curl --request GET \
--url https://jmpy.me/api/v1/qranalytics/referrers \
--header 'Authorization: Bearer <token>'{
"trafficSources": [
{
"source": "<string>",
"scans": 123,
"uniqueScanners": 123,
"percentage": 123
}
],
"referrerDomains": [
{
"domain": "<string>",
"scans": 123,
"uniqueScanners": 123
}
],
"totalScans": 123
}Get traffic source analytics for your QR code scans, including categorized traffic sources and referrer domain breakdown.
This endpoint returns user-level aggregated referrer data across all your QR codes. Traffic sources are automatically categorized (e.g., Social, Search, Direct).
Query Parameters
Number of days to include in analytics (1-365).
Response
Traffic sources categorized by type.
Show Traffic Source Object
Show Traffic Source Object
Traffic source category. Returns the custom UTM Campaign Source (
utm_source) if set, otherwise falls back to parsed referrer categories: Direct, Facebook, Twitter/X, LinkedIn, Instagram, YouTube, TikTok, Google, Bing, Reddit, WhatsApp, Email, Other.Number of scans from this source.
Number of unique visitors from this source.
Percentage of total scans.
Referrer domain or campaign medium breakdown (top 20).
Total number of scans with referrer data.
Traffic source analytics may be restricted based on your plan. Users on free plans may have limited access to detailed referrer breakdowns. Upgrade to access full traffic analytics.
Request Examples
- cURL
- Node.js
- TypeScript
- Python
- PHP
- Go
- Java
# Get traffic source analytics for last 30 days
curl -X GET "https://jmpy.me/api/v1/qranalytics/referrers?days=30" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get traffic source analytics for last 90 days
curl -X GET "https://jmpy.me/api/v1/qranalytics/referrers?days=90" \
-H "Authorization: Bearer YOUR_API_KEY"
const fetch = require('node-fetch');
const response = await fetch(
'https://jmpy.me/api/v1/qranalytics/referrers?days=30',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}
);
const data = await response.json();
// Display traffic sources
console.log('Traffic Sources:');
data.data.trafficSources.forEach(source => {
console.log(` ${source.source}: ${source.scans} (${source.percentage}%)`);
});
// Display top referrer domains
console.log('\nTop Referrer Domains:');
data.data.referrerDomains.slice(0, 5).forEach(domain => {
console.log(` ${domain.domain}: ${domain.scans} scans`);
});
import axios from 'axios';
interface ReferrerAnalytics {
trafficSources: Array<{
source: string;
scans: number;
uniqueScanners: number;
percentage: number
}>;
referrerDomains: Array<{
domain: string;
scans: number;
uniqueScanners: number
}>;
totalScans: number;
}
const response = await axios.get<{ success: boolean; data: ReferrerAnalytics }>(
'https://jmpy.me/api/v1/qranalytics/referrers',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' },
params: { days: 30 }
}
);
const { trafficSources, referrerDomains, totalScans } = response.data.data;
console.log(`Total scans: ${totalScans}`);
console.log(`Top source: ${trafficSources[0]?.source}`);
console.log(`Top domain: ${referrerDomains[0]?.domain}`);
import requests
response = requests.get(
'https://jmpy.me/api/v1/qranalytics/referrers',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={'days': 30}
)
data = response.json()['data']
print("Traffic Sources:")
for source in data['trafficSources']:
print(f" {source['source']}: {source['scans']} ({source['percentage']}%)")
print("\nTop Referrer Domains:")
for domain in data['referrerDomains'][:5]:
print(f" {domain['domain']}: {domain['scans']} scans")
<?php
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://jmpy.me/api/v1/qranalytics/referrers', [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY'
],
'query' => [
'days' => 30
]
]);
$data = json_decode($response->getBody(), true)['data'];
echo "Traffic Sources:\n";
foreach ($data['trafficSources'] as $source) {
echo " {$source['source']}: {$source['scans']} ({$source['percentage']}%)\n";
}
?>
package main
import (
"fmt"
"net/http"
"net/url"
"io"
)
func main() {
baseURL := "https://jmpy.me/api/v1/qranalytics/referrers"
params := url.Values{}
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/referrers?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());
Response Examples
- 200 OK
- 401 Unauthorized
- 403 Feature Disabled
{
"success": true,
"data": {
"trafficSources": [
{
"source": "Direct",
"scans": 1234,
"uniqueScanners": 1000,
"percentage": 52.6
},
{
"source": "Facebook",
"scans": 456,
"uniqueScanners": 380,
"percentage": 19.4
},
{
"source": "Twitter/X",
"scans": 234,
"uniqueScanners": 190,
"percentage": 10.0
},
{
"source": "Google",
"scans": 189,
"uniqueScanners": 156,
"percentage": 8.1
},
{
"source": "WhatsApp",
"scans": 120,
"uniqueScanners": 98,
"percentage": 5.1
},
{
"source": "Other",
"scans": 112,
"uniqueScanners": 90,
"percentage": 4.8
}
],
"referrerDomains": [
{ "domain": "Direct", "scans": 1234, "uniqueScanners": 1000 },
{ "domain": "facebook.com", "scans": 456, "uniqueScanners": 380 },
{ "domain": "t.co", "scans": 234, "uniqueScanners": 190 },
{ "domain": "google.com", "scans": 189, "uniqueScanners": 156 },
{ "domain": "wa.me", "scans": 120, "uniqueScanners": 98 }
],
"totalScans": 2345
}
}
{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "User authentication required"
}
}
{
"success": false,
"error": {
"code": "FEATURE_DISABLED",
"message": "Traffic source analytics is not available on your current plan",
"details": {
"feature": "Traffic source analytics",
"currentPlan": "Free"
}
}
}
Use Cases
Analyze social media performance
Analyze social media performance
Identify which social platforms drive the most QR engagement.
async function analyzeSocialPerformance() {
const response = await fetch(
'https://jmpy.me/api/v1/qranalytics/referrers?days=30',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
const socialPlatforms = ['Facebook', 'Twitter/X', 'LinkedIn', 'Instagram', 'TikTok'];
const socialTraffic = data.trafficSources.filter(s =>
socialPlatforms.includes(s.source)
);
const totalSocial = socialTraffic.reduce((sum, s) => sum + s.scans, 0);
console.log('Social Media Performance:');
socialTraffic.forEach(platform => {
console.log(` ${platform.source}: ${platform.scans} scans (${platform.percentage}%)`);
});
console.log(`\nTotal social scans: ${totalSocial}`);
console.log(`Social % of traffic: ${(totalSocial / data.totalScans * 100).toFixed(1)}%`);
}
Direct vs referred traffic
Direct vs referred traffic
Compare direct scans (QR codes scanned directly) vs referred traffic.
import requests
def analyze_traffic_types():
response = requests.get(
'https://jmpy.me/api/v1/qranalytics/referrers?days=30',
headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
data = response.json()['data']
sources = data['trafficSources']
direct = next((s for s in sources if s['source'] == 'Direct'), {'scans': 0})
referred = sum(s['scans'] for s in sources if s['source'] != 'Direct')
total = data['totalScans']
print("Traffic Type Analysis:")
print(f" Direct scans: {direct['scans']} ({direct['scans']/total*100:.1f}%)")
print(f" Referred scans: {referred} ({referred/total*100:.1f}%)")
if direct['scans'] > referred:
print("\nInsight: Most users scan QR codes directly without any referrer.")
else:
print("\nInsight: Most traffic comes from shared links or social media.")
Build traffic source chart
Build traffic source chart
Prepare data for a pie or donut chart visualization.
interface ChartDataPoint {
label: string;
value: number;
percentage: number;
color: string;
}
async function getTrafficSourceChartData(): Promise<ChartDataPoint[]> {
const response = await fetch(
'https://jmpy.me/api/v1/qranalytics/referrers?days=30',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
// Color mapping for traffic sources
const colors: Record<string, string> = {
'Direct': '#6366f1',
'Facebook': '#3b5998',
'Twitter/X': '#1da1f2',
'LinkedIn': '#0077b5',
'Instagram': '#e1306c',
'Google': '#4285f4',
'Other': '#9ca3af'
};
return data.trafficSources.map(source => ({
label: source.source,
value: source.scans,
percentage: source.percentage,
color: colors[source.source] || colors['Other']
}));
}
Related Endpoints
UTM Analytics
Track campaign performance with UTM parameters
Device Analytics
Get device, browser, and OS breakdown
Location Analytics
Get geographic distribution of scans
Analytics Overview
Get aggregated summary statistics
⌘I