Recent Activity
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
}
]
}Short URL Analytics
Recent Activity
Get the most recently clicked short URLs
GET
/
analytics
/
recent
Recent Activity
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 a list of your short URLs ordered by their most recent click. Perfect for monitoring real-time activity and identifying currently active links.
Query Parameters
Maximum number of URLs to return (1-100).
Response
Array of recently clicked URLs.
Show Recent Activity Object
Show Recent Activity Object
Unique identifier (UUID).
The short code.
Display name for the URL.
Destination URL.
Total clicks for this URL.
Creation timestamp (ISO 8601).
Timestamp of the most recent click (ISO 8601).
Whether analytics tracking is enabled.
Request Examples
- cURL
- Node.js
- TypeScript
- Python
- PHP
- Go
- Java
# 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());
Response Examples
- 200 OK
- 401 Unauthorized
{
"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"
}
}
Use Cases
Real-time activity feed
Real-time activity feed
Build a live activity feed showing recent clicks.
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
Notification system
Send notifications when specific URLs receive clicks.
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
Dashboard quick glance widget
Create a compact widget showing recent activity at a glance.
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")
Related Endpoints
Top Performing URLs
Get URLs ranked by total clicks
Clicks Timeline
See click trends over time
Click Details
Get individual click records
Analytics Overview
Get aggregated statistics
⌘I