curl --request GET \
--url https://jmpy.me/api/v1/analytics/recent \
--header 'Authorization: Bearer <token>'{
"data": [
{
"id": "<string>",
"short_code": "<string>",
"name": "<string>",
"original_url": "<string>",
"click_count": 123,
"created_at": "<string>",
"last_clicked_at": "<string>",
"tracking_enabled": true
}
]
}Get the most recently clicked short URLs
curl --request GET \
--url https://jmpy.me/api/v1/analytics/recent \
--header 'Authorization: Bearer <token>'{
"data": [
{
"id": "<string>",
"short_code": "<string>",
"name": "<string>",
"original_url": "<string>",
"click_count": 123,
"created_at": "<string>",
"last_clicked_at": "<string>",
"tracking_enabled": true
}
]
}Show Recent Activity Object
# Get 10 most recently clicked URLs
curl -X GET "https://jmpy.me/api/v1/analytics/recent?limit=10" \
-H "Authorization: Bearer YOUR_API_KEY"
# Get 5 most recently clicked URLs
curl -X GET "https://jmpy.me/api/v1/analytics/recent?limit=5" \
-H "Authorization: Bearer YOUR_API_KEY"
const fetch = require('node-fetch');
const response = await fetch(
'https://jmpy.me/api/v1/analytics/recent?limit=10',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}
);
const data = await response.json();
console.log('📍 Recent Activity:');
data.data.forEach(url => {
const lastClick = new Date(url.last_clicked_at);
const ago = getTimeAgo(lastClick);
console.log(` ${url.name || url.short_code}: ${url.click_count} clicks (last: ${ago})`);
});
function getTimeAgo(date) {
const seconds = Math.floor((new Date() - date) / 1000);
if (seconds < 60) return `${seconds}s ago`;
if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;
if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;
return `${Math.floor(seconds / 86400)}d ago`;
}
import axios from 'axios';
interface RecentActivity {
id: string;
short_code: string;
name: string | null;
original_url: string;
click_count: number;
created_at: string;
last_clicked_at: string;
tracking_enabled: boolean;
}
const response = await axios.get<{ success: boolean; data: RecentActivity[] }>(
'https://jmpy.me/api/v1/analytics/recent',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' },
params: { limit: 10 }
}
);
const recentUrls = response.data.data;
// Find the most active URL
const mostActive = recentUrls.reduce((max, url) =>
url.click_count > max.click_count ? url : max
);
console.log('Most active:', mostActive.name, '-', mostActive.click_count, 'clicks');
import requests
from datetime import datetime
response = requests.get(
'https://jmpy.me/api/v1/analytics/recent',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={'limit': 10}
)
urls = response.json()['data']
print("📍 Recent Activity")
print("=" * 60)
for url in urls:
name = url['name'] or url['short_code']
clicks = url['click_count']
last_click = datetime.fromisoformat(url['last_clicked_at'].replace('Z', '+00:00'))
# Calculate time ago
delta = datetime.now(last_click.tzinfo) - last_click
if delta.seconds < 60:
ago = f"{delta.seconds}s ago"
elif delta.seconds < 3600:
ago = f"{delta.seconds // 60}m ago"
elif delta.seconds < 86400:
ago = f"{delta.seconds // 3600}h ago"
else:
ago = f"{delta.days}d ago"
print(f" {name[:30]:30} {clicks:>6} clicks (last: {ago})")
<?php
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://jmpy.me/api/v1/analytics/recent', [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY'
],
'query' => [
'limit' => 10
]
]);
$urls = json_decode($response->getBody(), true)['data'];
echo "Recent Activity\n";
echo "===============\n\n";
foreach ($urls as $url) {
$name = $url['name'] ?: $url['short_code'];
$lastClick = new DateTime($url['last_clicked_at']);
$diff = (new DateTime())->diff($lastClick);
if ($diff->d > 0) {
$ago = $diff->d . "d ago";
} elseif ($diff->h > 0) {
$ago = $diff->h . "h ago";
} else {
$ago = $diff->i . "m ago";
}
printf("%-30s %6d clicks (last: %s)\n",
substr($name, 0, 30),
$url['click_count'],
$ago
);
}
?>
package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://jmpy.me/api/v1/analytics/recent?limit=10"
req, _ := http.NewRequest("GET", url, 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 url = "https://jmpy.me/api/v1/analytics/recent?limit=10";
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": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"short_code": "abc123",
"name": "Spring Sale Landing Page",
"original_url": "https://example.com/spring-sale",
"click_count": 4523,
"stored_clicks": 4520,
"actual_clicks": 4523,
"created_at": "2024-01-15T10:30:00Z",
"last_clicked_at": "2024-01-07T14:32:15Z",
"tracking_enabled": true
},
{
"id": "661f9511-f3ac-52e5-b827-557766551111",
"short_code": "def456",
"name": "Product Launch",
"original_url": "https://example.com/new-product",
"click_count": 2345,
"stored_clicks": 2345,
"actual_clicks": 2345,
"created_at": "2024-02-01T14:00:00Z",
"last_clicked_at": "2024-01-07T14:28:42Z",
"tracking_enabled": true
},
{
"id": "772f0622-g4bd-63f6-c938-668877662222",
"short_code": "ghi789",
"name": "Newsletter Signup",
"original_url": "https://example.com/newsletter",
"click_count": 1876,
"stored_clicks": 1876,
"actual_clicks": 1876,
"created_at": "2024-01-20T09:00:00Z",
"last_clicked_at": "2024-01-07T14:15:33Z",
"tracking_enabled": true
}
]
}
{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "User authentication required"
}
}
Real-time activity feed
async function createActivityFeed(containerId, refreshInterval = 30000) {
const container = document.getElementById(containerId);
async function refresh() {
const response = await fetch(
'https://jmpy.me/api/v1/analytics/recent?limit=10',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
container.innerHTML = data.map(url => {
const lastClick = new Date(url.last_clicked_at);
const ago = formatTimeAgo(lastClick);
return `
<div class="activity-item">
<div class="activity-dot ${getRecencyClass(lastClick)}"></div>
<div class="activity-content">
<strong>${url.name || url.short_code}</strong>
<span class="time">${ago}</span>
</div>
<div class="click-count">${url.click_count}</div>
</div>
`;
}).join('');
}
function getRecencyClass(date) {
const minutes = (new Date() - date) / 60000;
if (minutes < 5) return 'live';
if (minutes < 60) return 'recent';
return 'old';
}
await refresh();
setInterval(refresh, refreshInterval);
}
Notification system
interface WatchedURL {
id: string;
name: string;
lastKnownClick: string;
}
async function watchForNewClicks(
watchedUrls: WatchedURL[],
onNewClick: (url: WatchedURL, newClicks: number) => void
) {
const response = await fetch(
'https://jmpy.me/api/v1/analytics/recent?limit=50',
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const { data } = await response.json();
for (const recent of data) {
const watched = watchedUrls.find(w => w.id === recent.id);
if (watched && recent.last_clicked_at !== watched.lastKnownClick) {
// New click detected
const newClickTime = new Date(recent.last_clicked_at);
const oldClickTime = new Date(watched.lastKnownClick);
if (newClickTime > oldClickTime) {
onNewClick(watched, recent.click_count);
watched.lastKnownClick = recent.last_clicked_at;
}
}
}
}
// Example usage
const urlsToWatch: WatchedURL[] = [
{ id: 'uuid-1', name: 'Important Campaign', lastKnownClick: '' }
];
setInterval(() => {
watchForNewClicks(urlsToWatch, (url, clicks) => {
console.log(`🔔 New click on "${url.name}"! Total: ${clicks}`);
// Send push notification, Slack message, etc.
});
}, 10000);
Dashboard quick glance widget
import requests
from datetime import datetime, timezone
def get_quick_glance():
response = requests.get(
'https://jmpy.me/api/v1/analytics/recent',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={'limit': 5}
)
urls = response.json()['data']
now = datetime.now(timezone.utc)
# Calculate stats
total_clicks = sum(u['click_count'] for u in urls)
# Find most recent click
if urls:
most_recent = max(urls, key=lambda u: u['last_clicked_at'])
last_click = datetime.fromisoformat(
most_recent['last_clicked_at'].replace('Z', '+00:00')
)
seconds_ago = (now - last_click).total_seconds()
else:
seconds_ago = float('inf')
# Determine activity level
if seconds_ago < 300:
activity = "🟢 Very Active"
elif seconds_ago < 3600:
activity = "🟡 Active"
elif seconds_ago < 86400:
activity = "🟠 Moderate"
else:
activity = "⚪ Quiet"
return {
'activity_level': activity,
'top_5_total_clicks': total_clicks,
'most_recent_link': urls[0]['name'] if urls else None,
'seconds_since_last_click': int(seconds_ago)
}
# Usage
stats = get_quick_glance()
print(f"Activity: {stats['activity_level']}")
print(f"Recent 5 URLs: {stats['top_5_total_clicks']} total clicks")