Steam market opportunity research
Assess a defined game concept against comparable titles, activity, pricing, and
player feedback. Keep observed metrics, third-party estimates, and commercial
hypotheses separate.
Setup
Set CRAWLORA_API_KEY to your key from crawlora.net.
Run the bundled scripts/crawlora.sh from this skill directory or by absolute
path. It sends x-api-key to https://api.crawlora.net/api/v1; keep the key in
the environment. Read reference/endpoints.md for
selected Steam live tools and stored game, chart, player-count, news, and review data.
Build and compare a defensible cohort
- Define the concept's player experience, genre/tags, platform, business model,
release cohort, and region. Use
/datasets/steam-games/facets to discover
dataset labels, then /datasets/steam-games/search with type=game and the
relevant filters. q searches names/developers/publishers; use tag for
gameplay taxonomy. Live numeric community tag IDs come from /steam/tags/list.
- Inspect candidate titles instead of treating all matches as competitors.
Separate base games, DLC, demos, free-to-play titles, and unreleased games.
Resolve
appid; dataset searches for history use app_id, while live
/steam/app, /steam/reviews, /steam/players, and /steam/news use appid.
- Refresh shortlist metadata and prices with
/steam/app or /steam/items
(up to 100 IDs). Keep cc and currency consistent. Prices in cents require
conversion to major units for display; compare regular versus discounted
prices separately and retain observation dates.
- Read
/datasets/steam-playercounts/search?app_id=... for observed daily
concurrent-player samples. These are not daily unique users or automatically
daily peaks. For /datasets/steam-charts/search, keep chart and country
fixed: concurrent, most_played (weekly peak), or top_sellers (country-
specific sales ranking). Single-app history uses app_id and sort=date_desc;
ordinary latest requests echo snapshot_date, which may lag today.
- Inspect release dates and
/steam/news before describing activity changes.
Updates, discounts, and events are possible explanations, not proven causes.
Match game age and observation windows; an established live-service game's
concurrent usage is not directly comparable to a short single-player release.
- Use live
/steam/reviews for a bounded, comparable sample; preserve language,
purchase/review filters, playtime, and recommendation IDs. Start with cursor=*;
aggregate query_summary totals populate only on that first page. Stored
/datasets/steam-reviews/search emphasizes helpful reviews, not a random sample.
Report theme counts as unique eligible reviews n/N, with short cited examples.
scripts/crawlora.sh /datasets/steam-games/search \
type=game tag=Roguelike min_total_reviews=100 page_size=5
# Use a returned appid as app_id when requesting dataset player-count history.
Opportunity brief and limits
Return cohort selection rules, comparable-title table, matched activity series,
prices, review themes, supported positioning gaps, conflicting evidence, and a
next validation step for each opportunity hypothesis.
- Dataset owner ranges/midpoints come from SteamSpy estimates. They are not
audited sales counts. Do not multiply an owner midpoint by today's price and
call the result realized revenue; discounts, keys, refunds, and free access differ.
review_score is a 0–1 positive-review ratio; Metacritic uses a different scale.
Missing chart entries mean unobserved/unranked within coverage, not zero players.
- A daily concurrent count cannot establish retention or unique audience size.
Do not sum overlapping weekly snapshots or infer revenue from chart positions.
- Dataset pages max at 100 and the result window is 10,000. Stop on repeated
cursors/pages or the sample bound. Back off on
429, retry transient 5xx once,
stop on 401/403, and check application code before interpreting empty data.
1---2name: steam-market-opportunity-research3description: Evaluate Steam game niches using Crawlora's game catalog, chart and player-count history, live pricing, reviews, and release news. Use for comparable-title studies, positioning and price research, and evidence-backed game opportunity hypotheses.4---56# Steam market opportunity research78Assess a defined game concept against comparable titles, activity, pricing, and9player feedback. Keep observed metrics, third-party estimates, and commercial10hypotheses separate.1112## Setup1314Set `CRAWLORA_API_KEY` to your key from [crawlora.net](https://crawlora.net).15Run the bundled `scripts/crawlora.sh` from this skill directory or by absolute16path. It sends `x-api-key` to `https://api.crawlora.net/api/v1`; keep the key in17the environment. Read [reference/endpoints.md](reference/endpoints.md) for18selected Steam live tools and stored game, chart, player-count, news, and review data.1920## Build and compare a defensible cohort21221. Define the concept's player experience, genre/tags, platform, business model,23 release cohort, and region. Use `/datasets/steam-games/facets` to discover24 dataset labels, then `/datasets/steam-games/search` with `type=game` and the25 relevant filters. `q` searches names/developers/publishers; use `tag` for26 gameplay taxonomy. Live numeric community tag IDs come from `/steam/tags/list`.272. Inspect candidate titles instead of treating all matches as competitors.28 Separate base games, DLC, demos, free-to-play titles, and unreleased games.29 Resolve `appid`; dataset searches for history use `app_id`, while live30 `/steam/app`, `/steam/reviews`, `/steam/players`, and `/steam/news` use `appid`.313. Refresh shortlist metadata and prices with `/steam/app` or `/steam/items`32 (up to 100 IDs). Keep `cc` and currency consistent. Prices in cents require33 conversion to major units for display; compare regular versus discounted34 prices separately and retain observation dates.354. Read `/datasets/steam-playercounts/search?app_id=...` for observed daily36 concurrent-player samples. These are not daily unique users or automatically37 daily peaks. For `/datasets/steam-charts/search`, keep `chart` and `country`38 fixed: `concurrent`, `most_played` (weekly peak), or `top_sellers` (country-39 specific sales ranking). Single-app history uses `app_id` and `sort=date_desc`;40 ordinary latest requests echo `snapshot_date`, which may lag today.415. Inspect release dates and `/steam/news` before describing activity changes.42 Updates, discounts, and events are possible explanations, not proven causes.43 Match game age and observation windows; an established live-service game's44 concurrent usage is not directly comparable to a short single-player release.456. Use live `/steam/reviews` for a bounded, comparable sample; preserve language,46 purchase/review filters, playtime, and recommendation IDs. Start with `cursor=*`;47 aggregate `query_summary` totals populate only on that first page. Stored48 `/datasets/steam-reviews/search` emphasizes helpful reviews, not a random sample.49 Report theme counts as unique eligible reviews `n/N`, with short cited examples.5051```sh52scripts/crawlora.sh /datasets/steam-games/search \53 type=game tag=Roguelike min_total_reviews=100 page_size=554# Use a returned appid as app_id when requesting dataset player-count history.55```5657## Opportunity brief and limits5859Return cohort selection rules, comparable-title table, matched activity series,60prices, review themes, supported positioning gaps, conflicting evidence, and a61next validation step for each opportunity hypothesis.6263- Dataset owner ranges/midpoints come from SteamSpy estimates. They are not64 audited sales counts. Do not multiply an owner midpoint by today's price and65 call the result realized revenue; discounts, keys, refunds, and free access differ.66- `review_score` is a 0–1 positive-review ratio; Metacritic uses a different scale.67 Missing chart entries mean unobserved/unranked within coverage, not zero players.68- A daily concurrent count cannot establish retention or unique audience size.69 Do not sum overlapping weekly snapshots or infer revenue from chart positions.70- Dataset pages max at 100 and the result window is 10,000. Stop on repeated71 cursors/pages or the sample bound. Back off on `429`, retry transient `5xx` once,72 stop on `401`/`403`, and check application `code` before interpreting empty data.