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
- Upgrade to the Studio plan (API access is included, with 5 seats).
- Create a key in Settings → API keys. The full secret is shown once. Store it somewhere safe.
- 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 rate | 120 requests / minute | Exceeding returns 429 rate_limited. |
| Monthly quota | 100,000 requests / month | Resets 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.
{
"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.
| Code | HTTP | When |
|---|---|---|
| missing_key | 401 | No Authorization header, or it is not formatted as "Bearer brx_…". |
| invalid_key | 401 | The key is unknown or has been revoked. |
| plan_required | 403 | The key owner is not on the Studio plan. |
| bad_request | 400 | A parameter is invalid (e.g. q too short, non-numeric universeId). |
| not_found | 404 | The requested resource is not tracked (e.g. an unknown game). |
| rate_limited | 429 | The per-minute limit was exceeded (or an abusive volume of invalid keys from one IP). |
| quota_exceeded | 429 | The monthly request quota was reached. |
| api_disabled | 503 | The API is temporarily disabled. Retry later. |
| internal | 500 | An unexpected server error. Safe to retry with backoff. |
Endpoints
/api/v1/games/trendingReturns tracked games ordered by Breakout Score (descending), each with its latest CCU and revenue estimate. Only games that have a computed score are included.
Query parameters
| Name | Type | Default | Description |
|---|---|---|---|
| limit | integer | 25 | Maximum number of games to return. Values outside the range are clamped.(1–100) |
| genre | string | optional | Optional exact-match filter on the game genre (e.g. "Simulator", "Obby"). |
Example request
curl -H "Authorization: Bearer $BLOXRADAR_KEY" \
"https://bloxradar.ahmedattigui.com/api/v1/games/trending?limit=10&genre=Simulator"Example response
{
"data": [
{
"universeId": 6938426802,
"name": "Throw Stuff For Money",
"genre": "Simulator",
"breakoutScore": 87.4,
"provisional": false,
"botFlagged": false,
"ccu": 12840,
"revenueEstimate": {
"monthlyRobux": 4200000,
"low": 3100000,
"high": 5600000,
"confidence": "medium"
}
}
],
"meta": { "generatedAt": "2026-07-20T12:00:00.000Z", "source": "bloxradar" }
}Response fields
| Field | Type | Description |
|---|---|---|
| universeId | integer | Roblox universe id (the stable id for the experience). |
| name | string | Experience name. |
| genre | string | null | Primary genre. |
| breakoutScore | number | null | Momentum score 0–100; higher means breaking out faster. |
| provisional | boolean | True when the score is based on limited history and may still move significantly. |
| botFlagged | boolean | Heuristic flag for likely inorganic / botted traffic. |
| ccu | integer | Concurrent players, averaged over the most recent tracked day. |
| revenueEstimate | object | null | Statistical monthly revenue estimate, or null when there is not enough data. |
| revenueEstimate.monthlyRobux | integer | Point estimate of monthly revenue, in Robux. |
| revenueEstimate.low | integer | Lower bound of the confidence interval (Robux/month). |
| revenueEstimate.high | integer | Upper bound of the confidence interval (Robux/month). |
| revenueEstimate.confidence | "low" | "medium" | "high" | How reliable the estimate is, given available signal. |
/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
| Name | Type | Default | Description |
|---|---|---|---|
| universeId* | integer | · | Roblox universe id. |
Example request
curl -H "Authorization: Bearer $BLOXRADAR_KEY" \
"https://bloxradar.ahmedattigui.com/api/v1/games/6938426802"Example response
{
"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
| Field | Type | Description |
|---|---|---|
| universeId | integer | Roblox universe id. |
| rootPlaceId | integer | Root place id. The id used in a roblox.com/games/… link. |
| name | string | Experience name. |
| genre | string | null | Primary genre. |
| creator | object | null | Creator, or null if unknown. |
| creator.name | string | Creator display name. |
| creator.type | "User" | "Group" | Whether the creator is a user or a group. |
| breakoutScore | number | null | Momentum score 0–100. |
| provisional | boolean | True when the score is based on limited history. |
| botFlagged | boolean | Heuristic inorganic-traffic flag. |
| botFlagReason | string | null | Short reason when botFlagged is true; otherwise null. |
| ccu | integer | null | Concurrent players (latest day average). |
| likeRatio | number | null | Like ratio 0–1 (up / (up + down)). |
| createdAt | string (ISO 8601) | null | When the experience was created on Roblox. |
| trackedSince | string (ISO 8601) | When BloxRadar started tracking it. |
| revenueEstimate | object | null | Statistical monthly revenue estimate, or null when there is not enough data. |
| revenueEstimate.monthlyRobux | integer | Point estimate of monthly revenue, in Robux. |
| revenueEstimate.low | integer | Lower bound of the confidence interval (Robux/month). |
| revenueEstimate.high | integer | Upper bound of the confidence interval (Robux/month). |
| revenueEstimate.confidence | "low" | "medium" | "high" | How reliable the estimate is, given available signal. |
/api/v1/games/{universeId}/historyReturns daily aggregates for a game over the requested window, oldest first. An untracked universe simply returns an empty points array.
Path parameters
| Name | Type | Default | Description |
|---|---|---|---|
| universeId* | integer | · | Roblox universe id. |
Query parameters
| Name | Type | Default | Description |
|---|---|---|---|
| days | integer | 30 | Size 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
{
"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
| Field | Type | Description |
|---|---|---|
| universeId | integer | Roblox universe id, echoed from the request. |
| granularity | "daily" | Aggregation granularity (always daily for now). |
| points[].day | string (YYYY-MM-DD) | Calendar day (UTC). |
| points[].avgCcu | integer | Average concurrent players that day. |
| points[].peakCcu | integer | Peak concurrent players that day. |
| points[].visitsDelta | integer | Visits gained that day. |
| points[].favoritesDelta | integer | Favorites gained that day. |
| points[].likeRatio | number | null | Like ratio 0–1 for that day. |
| points[].breakoutScore | number | null | Breakout Score recorded that day. |
/api/v1/games/{universeId}/gamepassesReturns the currently-live gamepasses for a game, cheapest first, with how many price changes BloxRadar has observed for each.
Path parameters
| Name | Type | Default | Description |
|---|---|---|---|
| universeId* | integer | · | Roblox universe id. |
Example request
curl -H "Authorization: Bearer $BLOXRADAR_KEY" \
"https://bloxradar.ahmedattigui.com/api/v1/games/6938426802/gamepasses"Example response
{
"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
| Field | Type | Description |
|---|---|---|
| universeId | integer | Roblox universe id, echoed from the request. |
| passCount | integer | Number of live passes returned. |
| passes[].id | integer | Roblox gamepass id. |
| passes[].name | string | Pass name. |
| passes[].priceRobux | integer | null | Current price in Robux; null if unpriced or off-sale. |
| passes[].isForSale | boolean | Whether the pass is currently for sale. |
| passes[].firstSeenAt | string (ISO 8601) | When BloxRadar first observed the pass. |
| passes[].priceChanges | integer | Number of price changes observed since first seen. |
/api/v1/ugc/trendingReturns UGC items ordered by Velocity Score (descending), with favorites, price and recent average price. Only items with a computed score are included.
Query parameters
| Name | Type | Default | Description |
|---|---|---|---|
| limit | integer | 25 | Maximum number of items to return. Clamped to the range.(1–100) |
| category | string | optional | Optional exact-match filter on the item category (e.g. "Accessories"). |
Example request
curl -H "Authorization: Bearer $BLOXRADAR_KEY" \
"https://bloxradar.ahmedattigui.com/api/v1/ugc/trending?limit=10&category=Accessories"Example response
{
"data": [
{
"itemId": 120987654321,
"name": "Cyber Wings",
"category": "Accessories",
"subcategory": "Back",
"priceRobux": 250,
"isLimited": true,
"favoriteCount": 84200,
"velocityScore": 91.2,
"rap": 480
}
],
"meta": { "generatedAt": "2026-07-20T12:00:00.000Z", "source": "bloxradar" }
}Response fields
| Field | Type | Description |
|---|---|---|
| itemId | integer | Roblox catalog asset id. |
| name | string | Item name. |
| category | string | null | Top-level catalog category. |
| subcategory | string | null | Catalog subcategory. |
| priceRobux | integer | null | List price in Robux; null if off-sale. |
| isLimited | boolean | Whether the item is a limited. |
| favoriteCount | integer | Total favorites. |
| velocityScore | number | null | Favorites-velocity score 0–100; higher means gaining favorites faster. |
| rap | integer | null | Recent Average Price for limiteds (resale), in Robux; null otherwise. |
/api/v1/nichesReturns 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
{
"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
| Field | Type | Description |
|---|---|---|
| slug | string | Stable niche identifier. |
| label | string | Human-readable niche name. |
| asOf | string (YYYY-MM-DD) | null | Date of the latest niche stats snapshot (UTC). |
| demandCcu | integer | null | Aggregate concurrent players across the niche. |
| demandGrowth28d | number | null | 28-day demand growth as a fraction (0.12 = +12%). |
| clones90d | integer | null | New clones detected in the niche over 90 days. |
| saturationScore | number | null | How crowded the niche is, 0–100 (higher = more saturated). |
| opportunityScore | number | null | Overall opportunity, 0–100 (higher = better). |
/api/v1/searchCase-insensitive substring search over tracked game names, ordered by Breakout Score. The q parameter is required and must be at least 2 characters, otherwise the endpoint responds 400 bad_request.
Query parameters
| Name | Type | Default | Description |
|---|---|---|---|
| q* | string | · | Search term matched against the game name (case-insensitive substring).(≥ 2 chars) |
| limit | integer | 20 | Maximum number of results. Clamped to the range.(1–50) |
Example request
curl -H "Authorization: Bearer $BLOXRADAR_KEY" \
"https://bloxradar.ahmedattigui.com/api/v1/search?q=tycoon&limit=20"Example response
{
"data": [
{
"universeId": 6938426802,
"name": "Tycoon Simulator",
"genre": "Tycoon",
"breakoutScore": 71.3
}
],
"meta": { "generatedAt": "2026-07-20T12:00:00.000Z", "source": "bloxradar" }
}Response fields
| Field | Type | Description |
|---|---|---|
| universeId | integer | Roblox universe id. |
| name | string | Experience name. |
| genre | string | null | Primary genre. |
| breakoutScore | number | null | Momentum score 0–100. |
Need API access?
The REST API ships with the Studio plan, 5 seats included.