rblx.maven api · v1 · rest · json

The Roblox datayou keep re-scraping.

Live player counts, every discovery chart, rank history. One GET, plain JSON.

games on file
1,932
refresh cadence
30 min
free tier
1,000/day
§1

Sixty seconds to your first row

Make a free account, mint a key in your account, send it as a bearer token.

requestshell
curl -s "https://rblxmaven.com/api/v1/games/1962086868/ccu?granularity=day&from=2026-07-21" \
  -H "Authorization: Bearer $RBLXMAVEN_KEY"
shape of the contract
  • Success is { data, meta? }
  • Errors are { error: { code, message } }
  • Timestamps are ISO-8601 UTC, in and out
  • Every response carries X-RateLimit-*
responseapplication/json
{
  "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"
  }
}
the same seven rows, drawnccu · daily average
017.2K34.3K51.5K68.7KPEAK 64,771LOW 39,884jul 21jul 22jul 23jul 24jul 25jul 27
or walk the whole catalogpython
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
§2

What it's for

Dashboards

Pre-bucketed average, peak and min. Drops into a chart library unreshaped.

GET /v1/games/{id}/ccu?granularity=hour

Alerts

Poll a shelf on a cron, diff it, fire on the change.

GET /v1/sorts/{sortId}/leaderboard

Warehouse

Keyset-walk the catalog into BigQuery and join it to your own numbers.

GET /v1/games?cursor=…&limit=100

Research

Scored breakout signals daily, and the events behind a rival's spike.

GET /v1/trends · GET /v1/games/{id}/events
§3

What's in it

openapi 3.1 spec ↗
endpointwhat it gives youscope
Games & players
/v1/games?q=Search by name, with live CCU and best-ever rank attachedgames:read
/v1/games?cursor=Cursor through the entire catalog for a warehouse syncgames:read
/v1/games/{id}One game: name, creator, description, vote countsgames:read
/v1/games/{id}/ccuConcurrent players over time — raw, hourly or daily bucketsgames:read
Discovery charts
/v1/sortsEvery discovery shelf we samplecharts:read
/v1/sorts/{id}/leaderboardA shelf as it stands now, or as it stood thencharts:read
/v1/sorts/{id}/snapshotsThe snapshot index, for diffing two points in timecharts:read
/v1/games/{id}/ranksOne game's rank history across every shelfcharts:read
Breakout signalsindie and up
/v1/trendsToday's ranked signals: rank velocity, CCU surges, new entrantstrends:read
/v1/trends/{id}The methodology plus scored, explained exemplar gamestrends:read
Experience eventsindie and up
/v1/games/{id}/eventsIn-game events with start/end times, to align against a spikeevents:read

YouTube and Twitch influencer endpoints exist, but aren't sold self-serve. Ask us if you need them.

§4

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.

$0forever

no card

  • 1,000 requests a day
  • Live player counts + every discovery chart
  • 14 days of history
  • 25 API keys
rate ceiling
start free

Studio

Production tooling, full archive.

$99/ month

billed monthly

  • 500,000 requests a day
  • Every day we've ever recorded
  • 25 API keys, one per environment
  • Warehouse-friendly catalog walks
  • Priority support
rate ceiling
contact us

Enterprise

custom

Higher ceilings, an uptime commitment, influencer data after a terms review, or a bulk export instead of an API.

talk to us

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.

§6

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.

Stop maintaining a scraper.
Start shipping the thing.

create a free account →browse the endpointsfree plan · no card · 1,000 req/day