Leaderboards
Best and worst Hatch-scored launches in a time window. Public, no auth.
Surfaces
- UI: gohatch.fun/leaderboards/today
- API:
GET /api/v1/leaderboards?window=24h|7d|all&limit=1..50 - OG image:
/api/og/leaderboards/today— 1200×630 PNG for X/TG unfurls
Windows
| Window | Horizon | Use case |
|---|---|---|
24h (default) |
Last 24 hours | "What launched today" — viral object |
7d |
Last 7 days | Weekly recap |
all |
All time | Hall of fame + shame |
The UI always shows 24h — "today" is the hook that drives repeat visits.
Best vs worst
A single JSON response returns both:
GET /api/v1/leaderboards?window=24h&limit=10
{
"window": "24h",
"limit": 10,
"best": [{ "id": "...", "aggregate": 92, "band": "green", ... }, ...],
"worst": [{ "id": "...", "aggregate": 18, "band": "red", ... }, ...],
"bestCount": 10,
"worstCount": 7
}
Two columns — one trip to the API. Bands are visible in every row so you can see a "best" row that's amber (day with no greens) vs a true green top.
Honesty rules
hasStubs: truerows are excluded. You can't lead a board with a half-real number. The board gets denser automatically once Bitquery + GoPlus keys land.- Duplicate creator addresses are allowed. A creator with two strong launches in a day earns two spots.
- Ties broken by
createdAt— newer row wins.
See scoring guide for why preliminary rows are excluded everywhere meaningful.
Data freshness
- API response is not cached (queries Postgres live).
- OG image fetches live data and re-renders. This is expensive but non-negotiable — a stale OG would undermine the "today" promise.
- Sprint-tracker target for adding a 30s CDN cache: deferred until we see a traffic pattern that needs it.
Client code
import { HatchClient } from '@hatch/sdk';
const hatch = new HatchClient();
const { best, worst } = await hatch.getLeaderboards({ window: '24h', limit: 10 });
console.log(`Top today: ${best[0].aggregate} (${best[0].contractAddress})`);
Sharing a board
Share the URL: https://gohatch.fun/leaderboards/today. Twitter, Telegram,
Discord all unfurl the OG image showing top-5 each side.
For deeper timeframes, share ?window=7d — the page adapts.