Studio plan · v1

REST API reference

Pull BloxRadar intelligence into your own dashboards, models and pipelines. The API returns derived analytics . Breakout scores, revenue estimates, monetization ladders, UGC velocity and niche opportunity, never raw platform data dumps.

Getting started

  1. Upgrade to the Studio plan (API access is included, with 5 seats).
  2. Create a key in Settings → API keys. The full secret is shown once. Store it somewhere safe.
  3. Call any endpoint with the key as a Bearer token. Every endpoint is a plain HTTPS GET.

Your first request

curl -H "Authorization: Bearer $BLOXRADAR_KEY" \
  "https://bloxradar.ahmedattigui.com/api/v1/games/trending?limit=10"

Authentication

Every request must include an API key as a Bearer token in the Authorization header. Keys look like brx_ followed by 40 hexadecimal characters. Only a hash is stored. The full secret is shown once at creation and cannot be retrieved again; revoke and recreate if you lose it.

Authorization: Bearer brx_0123456789abcdef0123456789abcdef01234567
  • Keys are tied to your account and require an active Studio subscription.
  • Keep keys server-side. Never embed them in client-side or public code.
  • Manage and revoke keys anytime in Settings → API keys.

Rate limits & quota

Limits are enforced per API key:

Per-minute rate120 requests / minuteExceeding returns 429 rate_limited.
Monthly quota100,000 requests / monthResets at the start of each calendar month (UTC). Exceeding returns 429 quota_exceeded.

On a 429, back off and retry. Requests rejected at the authentication or rate-limit layer (401, 403 and 429) do not count against your monthly quota; a request that authenticates successfully counts even if it then returns 400 or 404.

Conventions

  • Base URL: https://bloxradar.ahmedattigui.com
  • All endpoints are HTTPS GET and require authentication.
  • Responses are JSON wrapped in a consistent envelope (see below).
  • Timestamps are ISO 8601 in UTC; bare dates are YYYY-MM-DD (UTC).
  • Monetary values are integer Robux; scores are numbers on a 0–100 scale.
  • Unknown or not-yet-computed values are null rather than omitted.
  • The limit parameter is the only pagination control. There are no cursors; out-of-range values are clamped, not rejected.
  • The API is versioned by path (/api/v1); breaking changes ship under a new version.

Response envelope

Successful responses wrap the payload in data alongside a meta object. data is an array for list endpoints and an object for single-resource endpoints.

200 · application/json
{
  "data": [ /*  */ ],
  "meta": {
    "generatedAt": "2026-07-20T12:00:00.000Z",
    "source": "bloxradar"
  }
}

Errors replace it with an error object:

{ "error": { "code": "rate_limited", "message": "Limit 120 req/min." } }

Errors

The HTTP status reflects the class of error; the machine-readable error.code lets you branch precisely.

CodeHTTPWhen
missing_key401No Authorization header, or it is not formatted as "Bearer brx_…".
invalid_key401The key is unknown or has been revoked.
plan_required403The key owner is not on the Studio plan.
bad_request400A parameter is invalid (e.g. q too short, non-numeric universeId).
not_found404The requested resource is not tracked (e.g. an unknown game).
rate_limited429The per-minute limit was exceeded (or an abusive volume of invalid keys from one IP).
quota_exceeded429The monthly request quota was reached.
api_disabled503The API is temporarily disabled. Retry later.
internal500An unexpected server error. Safe to retry with backoff.

Endpoints

GET/api/v1/games/{universeId}

Returns scores, creator, engagement and revenue for one tracked game. Responds 404 if the universe is not tracked by BloxRadar.

Path parameters

NameTypeDefaultDescription
universeId*integer·Roblox universe id.

Example request

curl -H "Authorization: Bearer $BLOXRADAR_KEY" \
  "https://bloxradar.ahmedattigui.com/api/v1/games/6938426802"

Example response

200 · application/json
{
  "data": {
    "universeId": 6938426802,
    "rootPlaceId": 128384929278910,
    "name": "Throw Stuff For Money",
    "genre": "Simulator",
    "creator": { "name": "Cool Studio", "type": "Group" },
    "breakoutScore": 87.4,
    "provisional": false,
    "botFlagged": false,
    "botFlagReason": null,
    "ccu": 12840,
    "likeRatio": 0.92,
    "createdAt": "2024-03-11T09:14:00.000Z",
    "trackedSince": "2026-01-05T00:00:00.000Z",
    "revenueEstimate": {
      "monthlyRobux": 4200000, "low": 3100000, "high": 5600000, "confidence": "medium"
    }
  },
  "meta": { "generatedAt": "2026-07-20T12:00:00.000Z", "source": "bloxradar" }
}

Response fields

FieldTypeDescription
universeIdintegerRoblox universe id.
rootPlaceIdintegerRoot place id. The id used in a roblox.com/games/… link.
namestringExperience name.
genrestring | nullPrimary genre.
creatorobject | nullCreator, or null if unknown.
creator.namestringCreator display name.
creator.type"User" | "Group"Whether the creator is a user or a group.
breakoutScorenumber | nullMomentum score 0–100.
provisionalbooleanTrue when the score is based on limited history.
botFlaggedbooleanHeuristic inorganic-traffic flag.
botFlagReasonstring | nullShort reason when botFlagged is true; otherwise null.
ccuinteger | nullConcurrent players (latest day average).
likeRationumber | nullLike ratio 0–1 (up / (up + down)).
createdAtstring (ISO 8601) | nullWhen the experience was created on Roblox.
trackedSincestring (ISO 8601)When BloxRadar started tracking it.
revenueEstimateobject | nullStatistical monthly revenue estimate, or null when there is not enough data.
revenueEstimate.monthlyRobuxintegerPoint estimate of monthly revenue, in Robux.
revenueEstimate.lowintegerLower bound of the confidence interval (Robux/month).
revenueEstimate.highintegerUpper bound of the confidence interval (Robux/month).
revenueEstimate.confidence"low" | "medium" | "high"How reliable the estimate is, given available signal.
GET/api/v1/games/{universeId}/history

Returns daily aggregates for a game over the requested window, oldest first. An untracked universe simply returns an empty points array.

Path parameters

NameTypeDefaultDescription
universeId*integer·Roblox universe id.

Query parameters

NameTypeDefaultDescription
daysinteger30Size of the look-back window in days. Clamped to the range.(1–365)

Example request

curl -H "Authorization: Bearer $BLOXRADAR_KEY" \
  "https://bloxradar.ahmedattigui.com/api/v1/games/6938426802/history?days=30"

Example response

200 · application/json
{
  "data": {
    "universeId": 6938426802,
    "granularity": "daily",
    "points": [
      {
        "day": "2026-07-19",
        "avgCcu": 12040,
        "peakCcu": 19800,
        "visitsDelta": 1010000,
        "favoritesDelta": 6100,
        "likeRatio": 0.92,
        "breakoutScore": 86.7
      }
    ]
  },
  "meta": { "generatedAt": "2026-07-20T12:00:00.000Z", "source": "bloxradar" }
}

Response fields

FieldTypeDescription
universeIdintegerRoblox universe id, echoed from the request.
granularity"daily"Aggregation granularity (always daily for now).
points[].daystring (YYYY-MM-DD)Calendar day (UTC).
points[].avgCcuintegerAverage concurrent players that day.
points[].peakCcuintegerPeak concurrent players that day.
points[].visitsDeltaintegerVisits gained that day.
points[].favoritesDeltaintegerFavorites gained that day.
points[].likeRationumber | nullLike ratio 0–1 for that day.
points[].breakoutScorenumber | nullBreakout Score recorded that day.
GET/api/v1/games/{universeId}/gamepasses

Returns the currently-live gamepasses for a game, cheapest first, with how many price changes BloxRadar has observed for each.

Path parameters

NameTypeDefaultDescription
universeId*integer·Roblox universe id.

Example request

curl -H "Authorization: Bearer $BLOXRADAR_KEY" \
  "https://bloxradar.ahmedattigui.com/api/v1/games/6938426802/gamepasses"

Example response

200 · application/json
{
  "data": {
    "universeId": 6938426802,
    "passCount": 2,
    "passes": [
      {
        "id": 776150000,
        "name": "x2 Cash",
        "priceRobux": 199,
        "isForSale": true,
        "firstSeenAt": "2026-01-05T00:00:00.000Z",
        "priceChanges": 1
      },
      {
        "id": 776150011,
        "name": "VIP",
        "priceRobux": 499,
        "isForSale": true,
        "firstSeenAt": "2026-01-05T00:00:00.000Z",
        "priceChanges": 0
      }
    ]
  },
  "meta": { "generatedAt": "2026-07-20T12:00:00.000Z", "source": "bloxradar" }
}

Response fields

FieldTypeDescription
universeIdintegerRoblox universe id, echoed from the request.
passCountintegerNumber of live passes returned.
passes[].idintegerRoblox gamepass id.
passes[].namestringPass name.
passes[].priceRobuxinteger | nullCurrent price in Robux; null if unpriced or off-sale.
passes[].isForSalebooleanWhether the pass is currently for sale.
passes[].firstSeenAtstring (ISO 8601)When BloxRadar first observed the pass.
passes[].priceChangesintegerNumber of price changes observed since first seen.
GET/api/v1/niches

Returns all active niches with their latest demand, growth, saturation and opportunity metrics, ordered by Opportunity Score (descending). Takes no parameters.

Example request

curl -H "Authorization: Bearer $BLOXRADAR_KEY" \
  "https://bloxradar.ahmedattigui.com/api/v1/niches"

Example response

200 · application/json
{
  "data": [
    {
      "slug": "tycoon",
      "label": "Tycoon",
      "asOf": "2026-07-19",
      "demandCcu": 1840000,
      "demandGrowth28d": 0.12,
      "clones90d": 34,
      "saturationScore": 62.0,
      "opportunityScore": 74.5
    }
  ],
  "meta": { "generatedAt": "2026-07-20T12:00:00.000Z", "source": "bloxradar" }
}

Response fields

FieldTypeDescription
slugstringStable niche identifier.
labelstringHuman-readable niche name.
asOfstring (YYYY-MM-DD) | nullDate of the latest niche stats snapshot (UTC).
demandCcuinteger | nullAggregate concurrent players across the niche.
demandGrowth28dnumber | null28-day demand growth as a fraction (0.12 = +12%).
clones90dinteger | nullNew clones detected in the niche over 90 days.
saturationScorenumber | nullHow crowded the niche is, 0–100 (higher = more saturated).
opportunityScorenumber | nullOverall opportunity, 0–100 (higher = better).

Need API access?

The REST API ships with the Studio plan, 5 seats included.

See pricing