Skip to main content
GET
/
api
/
genre-opportunities
curl https://rolearn.dev/api/genre-opportunities \
  -H "X-API-Key: rk_live_XXXX"
[
  {
    "name": "horror",
    "display_name": "Horror",
    "total_games": 3200,
    "total_ccu": 480000,
    "avg_ccu": 150.0,
    "growth_rate": 0.12,
    "saturation_index": 0.58,
    "opportunity_score": 72.4,
    "monetization_depth": 4.1,
    "demand_per_game": 150.0,
    "top3_share": 0.41,
    "newcomer_share": 0.18,
    "entry_verdict": "enter_with_edge",
    "recommendation": "Viable, but you'll need a clear differentiator.",
    "locked": false
  }
]
Returns supply/demand opportunity metrics for each Roblox genre, served straight from the authoritative Genre table (recomputed every 6 hours). Uses Roblox’s official genre taxonomy. See Genre Heatmap for the methodology. Works unauthenticated (returns free-tier names_only shape) or with a session / X-API-Key. Plan gating controls how many fields are populated.
curl https://rolearn.dev/api/genre-opportunities \
  -H "X-API-Key: rk_live_XXXX"
[
  {
    "name": "horror",
    "display_name": "Horror",
    "total_games": 3200,
    "total_ccu": 480000,
    "avg_ccu": 150.0,
    "growth_rate": 0.12,
    "saturation_index": 0.58,
    "opportunity_score": 72.4,
    "monetization_depth": 4.1,
    "demand_per_game": 150.0,
    "top3_share": 0.41,
    "newcomer_share": 0.18,
    "entry_verdict": "enter_with_edge",
    "recommendation": "Viable, but you'll need a clear differentiator.",
    "locked": false
  }
]
saturation_index
float
Supply/demand crowding R / (R + demand_per_game). 0.5 = platform norm, ≥0.6 = crowded.
opportunity_score
float
0–100 composite of demand percentile, growth, and openness (higher = better).
growth_rate
float
CCU change versus a fixed baseline 7 days ago. null if no baseline.
top3_share
float
Share of genre CCU held by the 3 biggest games (concentration).
newcomer_share
float
Of the top-20 games’ CCU, the share held by games launched in the last 12 months (openness).
entry_verdict
string
One of strong | enter_with_edge | avoid | unproven.
Free-tier callers receive only name, display_name, total_games, total_ccu, and locked: true; the analytic fields are null until you upgrade to Builder+.