> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rolearn.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Genre Opportunities

> Get genre opportunity scores and analytics

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](/features/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.

<RequestExample>
  ```bash theme={null}
  curl https://rolearn.dev/api/genre-opportunities \
    -H "X-API-Key: rk_live_XXXX"
  ```
</RequestExample>

<ResponseExample>
  ```json theme={null}
  [
    {
      "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
    }
  ]
  ```
</ResponseExample>

<ResponseField name="saturation_index" type="float">
  Supply/demand crowding `R / (R + demand_per_game)`. 0.5 = platform norm, ≥0.6 = crowded.
</ResponseField>

<ResponseField name="opportunity_score" type="float">
  0–100 composite of demand percentile, growth, and openness (higher = better).
</ResponseField>

<ResponseField name="growth_rate" type="float">
  CCU change versus a fixed baseline 7 days ago. `null` if no baseline.
</ResponseField>

<ResponseField name="top3_share" type="float">
  Share of genre CCU held by the 3 biggest games (concentration).
</ResponseField>

<ResponseField name="newcomer_share" type="float">
  Of the top-20 games' CCU, the share held by games launched in the last 12 months (openness).
</ResponseField>

<ResponseField name="entry_verdict" type="string">
  One of `strong` | `enter_with_edge` | `avoid` | `unproven`.
</ResponseField>

<Note>
  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+.
</Note>
