The Roblox datayou keep re-scraping.
Live player counts, every discovery chart, rank history. One GET, plain JSON.
Sixty seconds to your first row
Make a free account, mint a key in your account, send it as a bearer token.
curl -s "https://rblxmaven.com/api/v1/games/1962086868/ccu?granularity=day&from=2026-07-21" \ -H "Authorization: Bearer $RBLXMAVEN_KEY"
- Success is
{ data, meta? } - Errors are
{ error: { code, message } } - Timestamps are ISO-8601 UTC, in and out
- Every response carries X-RateLimit-*
{
"data": {
"gameId": 1962086868,
"granularity": "day",
"points": [
{ "t": "2026-07-21T00:00:00Z", "ccu": 41207, "peakCcu": 58310, "minCcu": 22984, "samples": 48 },
{ "t": "2026-07-22T00:00:00Z", "ccu": 39884, "peakCcu": 55102, "minCcu": 21760, "samples": 48 },
{ "t": "2026-07-23T00:00:00Z", "ccu": 42551, "peakCcu": 59780, "minCcu": 23915, "samples": 48 },
{ "t": "2026-07-24T00:00:00Z", "ccu": 48902, "peakCcu": 68441, "minCcu": 27330, "samples": 48 },
{ "t": "2026-07-25T00:00:00Z", "ccu": 61338, "peakCcu": 84207, "minCcu": 35612, "samples": 48 },
{ "t": "2026-07-26T00:00:00Z", "ccu": 64771, "peakCcu": 88915, "minCcu": 37004, "samples": 48 },
{ "t": "2026-07-27T00:00:00Z", "ccu": 52338, "peakCcu": 71892, "minCcu": 29615, "samples": 48 }
]
},
"meta": {
"from": "2026-07-21T00:00:00Z",
"to": "2026-07-28T00:00:00Z"
}
}import os, requests S = requests.Session() S.headers["Authorization"] = f"Bearer {os.environ['RBLXMAVEN_KEY']}" BASE = "https://rblxmaven.com/api/v1" def catalog(): """Walk every game on file. Cursor is opaque; None means done.""" cursor = None while True: r = S.get(f"{BASE}/games", params={"cursor": cursor, "limit": 100}) r.raise_for_status() body = r.json() yield from body["data"] cursor = body["meta"]["nextCursor"] if cursor is None: return
What it's for
Dashboards
Pre-bucketed average, peak and min. Drops into a chart library unreshaped.
GET /v1/games/{id}/ccu?granularity=hourAlerts
Poll a shelf on a cron, diff it, fire on the change.
GET /v1/sorts/{sortId}/leaderboardWarehouse
Keyset-walk the catalog into BigQuery and join it to your own numbers.
GET /v1/games?cursor=…&limit=100Research
Scored breakout signals daily, and the events behind a rival's spike.
GET /v1/trends · GET /v1/games/{id}/events| endpoint | what it gives you | scope |
|---|---|---|
| Games & players | ||
/v1/games?q= | Search by name, with live CCU and best-ever rank attached | games:read |
/v1/games?cursor= | Cursor through the entire catalog for a warehouse sync | games:read |
/v1/games/{id} | One game: name, creator, description, vote counts | games:read |
/v1/games/{id}/ccu | Concurrent players over time — raw, hourly or daily buckets | games:read |
| Discovery charts | ||
/v1/sorts | Every discovery shelf we sample | charts:read |
/v1/sorts/{id}/leaderboard | A shelf as it stands now, or as it stood then | charts:read |
/v1/sorts/{id}/snapshots | The snapshot index, for diffing two points in time | charts:read |
/v1/games/{id}/ranks | One game's rank history across every shelf | charts:read |
| Breakout signalsindie and up | ||
/v1/trends | Today's ranked signals: rank velocity, CCU surges, new entrants | trends:read |
/v1/trends/{id} | The methodology plus scored, explained exemplar games | trends:read |
| Experience eventsindie and up | ||
/v1/games/{id}/events | In-game events with start/end times, to align against a spike | events:read |
YouTube and Twitch influencer endpoints exist, but aren't sold self-serve. Ask us if you need them.
No surprises
It rejects, it never silently clamps
Past the cap you get a 400 that names the cap, not a truncated window.
Keyset pagination, not OFFSET
Cursors are opaque and stable. A long walk can't skip or repeat a row.
History is immutable, so it's cacheable
A window that ended over an hour ago carries a day-long Cache-Control.
Additive-only inside v1
Fields get added, never renamed or removed. Breaking changes ship as /v2.
Limits you can see
X-RateLimit-* on every response, Retry-After on every 429.
A spec, not just prose
OpenAPI 3.1 and a try-it console. Hand either to codegen or an agent.
Free
Enough to find out if the data is what you need.
no card
- ▸1,000 requests a day
- ▸Live player counts + every discovery chart
- ▸14 days of history
- ▸25 API keys
60 req/min
Indie
most pickedYour games, your rivals, one dashboard.
$290 billed yearly · 2 mo free
- ▸50,000 requests a day
- ▸Daily breakout signals + experience events
- ▸92 days of history
- ▸25 API keys
- ▸Email support
300 req/min
Studio
Production tooling, full archive.
$990 billed yearly · 2 mo free
- ▸500,000 requests a day
- ▸Every day we've ever recorded
- ▸25 API keys, one per environment
- ▸Warehouse-friendly catalog walks
- ▸Priority support
1,200 req/min
Enterprise
customHigher ceilings, an uptime commitment, influencer data after a terms review, or a bulk export instead of an API.
Prices in USD, billed through Stripe. Cancel any time — you keep access until the period you already paid for ends. Every plan carries the same 25 API keys, so changing plans moves your limits, never your keys.
Questions
›Where does the data come from?
Roblox's own public discovery charts and game endpoints, sampled every ~30 minutes and stored. The archive is the part that's hard to get.
›How fresh is it?
Charts and player counts land every ~30 minutes. Breakout signals recompute daily. Every response carries the timestamp it describes.
›What counts as a request?
One HTTP call to one endpoint. A paginated walk costs one per page. Requests the rate limiter rejects don't count against your quota.
›What happens if I go over?
A 429 with Retry-After, then your quota resets. Nothing is auto-charged and no overage lands on your bill.
›Can I cache or re-publish the data?
Cache it freely — we send Cache-Control headers that encourage it. Building a tool or a report on top is in scope; reselling the raw dataset isn't. The terms draw the line.
›Can I get the YouTube and Twitch data?
Not self-serve. Those platforms' terms restrict redistributing their data, so it goes through a terms review rather than a checkout. Email us and we'll talk it through.
›Do I need a credit card to try it?
No. The free plan is a real plan, not a trial that expires — 1,000 requests a day, indefinitely.
›What if I cancel?
You keep everything until the period you already paid for ends, then drop to free. Your keys keep working at free-plan limits; nothing is deleted.