curl --request GET \
--url https://jmpy.me/api/v1/qranalytics/timeline \
--header 'Authorization: Bearer <token>'{
"data": [
{
"date": "<string>",
"scans": 123,
"uniqueScanners": 123,
"uniqueScans": 123
}
]
}Get time-series scan data for your QR codes
curl --request GET \
--url https://jmpy.me/api/v1/qranalytics/timeline \
--header 'Authorization: Bearer <token>'{
"data": [
{
"date": "<string>",
"scans": 123,
"uniqueScanners": 123,
"uniqueScans": 123
}
]
}hour, day, week.hour - Best for short timeframes (1-7 days)day - Best for medium timeframes (7-90 days)week - Best for long timeframes (30-365 days)# Get daily timeline for last 30 days
curl -X GET "https://jmpy.me/api/v1/qranalytics/timeline?days=30&granularity=day" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get hourly data for last 7 days
curl -X GET "https://jmpy.me/api/v1/qranalytics/timeline?days=7&granularity=hour" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get weekly data for last 90 days
curl -X GET "https://jmpy.me/api/v1/qranalytics/timeline?days=90&granularity=week" \
-H "Authorization: Bearer YOUR_API_KEY"
const fetch = require('node-fetch');
// Get daily timeline
const response = await fetch(
'https://jmpy.me/api/v1/qranalytics/timeline?days=30&granularity=day',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}
);
const data = await response.json();
// Process timeline data
data.data.forEach(point => {
console.log(`${point.date}: ${point.scans} scans, ${point.uniqueScanners} unique`);
});
import axios from 'axios';
interface TimelinePoint {
date: string;
scans: number;
uniqueScanners: number;
uniqueScans: number;
}
const response = await axios.get<{ success: boolean; data: TimelinePoint[] }>(
'https://jmpy.me/api/v1/qranalytics/timeline',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' },
params: {
days: 30,
granularity: 'day'
}
}
);
const timeline = response.data.data;
console.log(`Total data points: ${timeline.length}`);
import requests
response = requests.get(
'https://jmpy.me/api/v1/qranalytics/timeline',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={
'days': 30,
'granularity': 'day'
}
)
timeline = response.json()['data']
# Calculate total scans
total_scans = sum(point['scans'] for point in timeline)
print(f"Total scans over 30 days: {total_scans}")
# Find peak day
peak_day = max(timeline, key=lambda x: x['scans'])
print(f"Peak day: {peak_day['date']} with {peak_day['scans']} scans")
<?php
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://jmpy.me/api/v1/qranalytics/timeline', [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY'
],
'query' => [
'days' => 30,
'granularity' => 'day'
]
]);
$data = json_decode($response->getBody(), true);
$timeline = $data['data'];
foreach ($timeline as $point) {
echo "{$point['date']}: {$point['scans']} scans\n";
}
?>
package main
import (
"fmt"
"net/http"
"net/url"
"io"
)
func main() {
baseURL := "https://jmpy.me/api/v1/qranalytics/timeline"
params := url.Values{}
params.Add("days", "30")
params.Add("granularity", "day")
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/timeline?days=30&granularity=day";
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": [
{
"date": "2025-01-01",
"scans": 78,
"uniqueScanners": 65,
"uniqueScans": 52
},
{
"date": "2025-01-02",
"scans": 92,
"uniqueScanners": 78,
"uniqueScans": 61
},
{
"date": "2025-01-03",
"scans": 156,
"uniqueScanners": 120,
"uniqueScans": 89
}
]
}
{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "User authentication required"
}
}
Build a scan trends chart
async function getChartData() {
const response = await fetch(
'https://jmpy.me/api/v1/qranalytics/timeline?days=30&granularity=day',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
// Format for Chart.js
return {
labels: data.map(point => point.date),
datasets: [
{
label: 'Total Scans',
data: data.map(point => point.scans),
borderColor: '#0D9488',
fill: false
},
{
label: 'Unique Scanners',
data: data.map(point => point.uniqueScanners),
borderColor: '#14B8A6',
fill: false
}
]
};
}
Detect scan patterns
import requests
from collections import defaultdict
def analyze_scan_patterns():
response = requests.get(
'https://jmpy.me/api/v1/qranalytics/timeline',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={'days': 30, 'granularity': 'day'}
)
timeline = response.json()['data']
# Group by day of week
from datetime import datetime
day_totals = defaultdict(int)
for point in timeline:
date = datetime.strptime(point['date'], '%Y-%m-%d')
day_name = date.strftime('%A')
day_totals[day_name] += point['scans']
# Find best day
best_day = max(day_totals, key=day_totals.get)
print(f"Best performing day: {best_day} ({day_totals[best_day]} total scans)")
return dict(day_totals)
Calculate week-over-week growth
async function getWeeklyGrowth(): Promise<number> {
const response = await fetch(
'https://jmpy.me/api/v1/qranalytics/timeline?days=14&granularity=day',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
// Split into two weeks
const thisWeek = data.slice(-7);
const lastWeek = data.slice(0, 7);
const thisWeekTotal = thisWeek.reduce((sum, d) => sum + d.scans, 0);
const lastWeekTotal = lastWeek.reduce((sum, d) => sum + d.scans, 0);
const growth = lastWeekTotal > 0
? ((thisWeekTotal - lastWeekTotal) / lastWeekTotal) * 100
: 0;
console.log(`Week-over-week growth: ${growth.toFixed(1)}%`);
return growth;
}