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 and referrer analytics for QR code scans
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
}Show Traffic Source Object
Direct, Facebook, Twitter/X, LinkedIn, Instagram, YouTube, TikTok, Google, Bing, Reddit, WhatsApp, Email, Other.# 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());
{
"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"
}
}
}
Analyze social media performance
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
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
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']
}));
}