leaderboards.trending()
Get feeds ranked by revenue velocity - feeds with the fastest recent revenue growth.
Signature
leaderboards.trending(query?: LeaderboardBaseQuery): Promise<LeaderboardResponse<TrendingFeed>>Parameters
query (optional)
- Type:
LeaderboardBaseQuery
interface LeaderboardBaseQuery {
page_size?: number; // Results per page (default: 20)
}Returns
- Type:
Promise<LeaderboardResponse<TrendingFeed>>
interface LeaderboardResponse<TrendingFeed> {
data: TrendingFeed[];
period?: string;
}
interface TrendingFeed {
rank: string;
id: string;
owner_id: string;
owner_wallet: string;
owner_username?: string | null;
category_id?: string | null;
category_name?: string | null;
name: string;
description?: string | null;
image_cid?: string | null;
is_active: boolean;
total_entries: number;
total_purchases: number;
total_revenue: string;
tags?: string[] | null;
created_at: number;
updated_at: number;
// Trending-specific fields
purchases_last_7d: string;
revenue_last_7d: string;
unique_buyers_last_7d: string;
}Usage
Basic Example
const trending = await grapevine.leaderboards.trending();
trending.data.forEach((feed, index) => {
console.log(`#${index + 1}: ${feed.name}`);
console.log(` Revenue (7d): ${formatUSDC(feed.revenue_last_7d)}`);
console.log(` Purchases (7d): ${feed.purchases_last_7d}`);
});Get Top 10
const top10 = await grapevine.leaderboards.trending({ page_size: 10 });
console.log('Top 10 Trending Feeds:');
top10.data.forEach(feed => {
console.log(`${feed.rank}. ${feed.name} by ${feed.owner_username || 'Anonymous'}`);
});Trending Feed Card Component
function TrendingFeedCard({ feed }: { feed: TrendingFeed }) {
return (
<div className="trending-card">
<span className="rank">#{feed.rank}</span>
{feed.image_cid && (
<img
src={`https://gateway.pinata.cloud/ipfs/${feed.image_cid}`}
alt={feed.name}
/>
)}
<h3>{feed.name}</h3>
<p className="author">by {feed.owner_username || feed.owner_wallet.slice(0, 8)}...</p>
<div className="stats">
<div>
<span className="value">{formatUSDC(feed.revenue_last_7d)}</span>
<span className="label">Revenue (7d)</span>
</div>
<div>
<span className="value">{feed.purchases_last_7d}</span>
<span className="label">Purchases</span>
</div>
<div>
<span className="value">{feed.unique_buyers_last_7d}</span>
<span className="label">Buyers</span>
</div>
</div>
{feed.category_name && (
<span className="category">{feed.category_name}</span>
)}
</div>
);
}
function formatUSDC(weiAmount: string): string {
const usdc = Number(BigInt(weiAmount)) / 1e6;
return `${usdc.toFixed(2)}`;
}Compare with Historical
async function analyzeTrending() {
const trending = await grapevine.leaderboards.trending({ page_size: 20 });
return trending.data.map(feed => {
const weeklyRevenue = BigInt(feed.revenue_last_7d);
const totalRevenue = BigInt(feed.total_revenue);
// Calculate what % of all-time revenue came in the last 7 days
const recentPercentage = totalRevenue > 0n
? Number((weeklyRevenue * 100n) / totalRevenue)
: 0;
return {
name: feed.name,
recentRevenue: formatUSDC(feed.revenue_last_7d),
totalRevenue: formatUSDC(feed.total_revenue),
recentPercentage: `${recentPercentage}%`,
isHot: recentPercentage > 50 // More than half revenue in last week
};
});
}Trending Algorithm
Trending is based on:
- Revenue generated in the last 7 days
- Purchase velocity (rate of new purchases)
- Unique buyer count
Feeds with sudden spikes in activity rank higher than consistently performing feeds.
Notes
- Authentication: Not required - public endpoint
- Caching: Results may be cached for a few minutes
- Ranking: Based on 7-day revenue velocity
- Active Only: Only includes active feeds
Related
- leaderboards.mostPopular() - By purchase count
- leaderboards.topRevenue() - By total revenue
- feeds.list() - Browse all feeds