# Steam API scraper — game details, DLC, packages/bundles, regional prices, user reviews, live + peak player counts, store search & store-front discovery (new releases / deals / top sellers), most-played chart, news, tags, similar games, artwork and public player profiles from store.steampowered.com

> full game metadata from store appdetails (+structured languages; include_tags adds community tags/franchise/links)
> ReefAPI engine `steam-games` · 18 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/steam-games/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed or blocked calls are free.
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /steam-games/v1/app_detail — 2 credits
full game metadata from store appdetails (+structured languages; include_tags adds community tags/franchise/links)

**Parameters:**
- `appid` (integer, required) — Steam application id (the number in a store URL, e.g. 730 = CS2).
- `cc` (string, optional, default "us") — Store region — ISO-3166-1 alpha-2 (lower-cased). Drives currency & regional pricing.
- `lang` (string, optional, default "english") — Steam language name (e.g. english, french, schinese) for localized store text.
- `include_tags` (boolean, optional, default false) — Also fetch community tags + franchise + external links (one extra store-page request).
- `include_raw` (boolean, optional, default false) — Attach the raw Steam appdetails payload under _raw.

**Returns:** app{appid, name, type, required_age, genres, categories, developers, publishers, release_date, price_overview, platforms, controller_support, screenshots, movies, pc/mac/linux_requirements, supported_languages_structured, metacritic, recommendations_total, achievements_total, dlc[], dlc_count, packages[], package_groups[], content_descriptors, ratings, support_info, +tags/franchise/external_links when include_tags}

**Example request body:**
```json
{
  "appid": 730,
  "cc": "us"
}
```

### POST /steam-games/v1/price — 1 credit
regional price + discount (appdetails price_overview)

**Parameters:**
- `appid` (integer, required) — Steam application id (the number in a store URL, e.g. 730 = CS2).
- `cc` (string, optional, default "us") — Store region — ISO-3166-1 alpha-2 (lower-cased). Drives currency & regional pricing.
- `lang` (string, optional, default "english") — Steam language name (e.g. english, french, schinese) for localized store text.

**Returns:** appid, cc, is_free, currency, final, initial, discount_percent, price_overview{}, package_groups

**Example request body:**
```json
{
  "appid": 1245620,
  "cc": "us"
}
```

### POST /steam-games/v1/reviews — 1 credit
user reviews + query_summary; review_type/day_range/trend (day|week|month|year)/sort=funny; redact_pii drops author identity

**Parameters:**
- `appid` (integer, required) — Steam application id (the number in a store URL, e.g. 730 = CS2).
- `language` (string, optional, default "all") — Review language (Steam name, or 'all'). Default all.
- `num_per_page` (integer, optional, default 20) — How many reviews to return (1-100). Clamped to range.
- `filter` (enum, optional, default "recent") — Ordering. recent/updated/all are Steam-native; toprated/top/helpful/best are remapped to 'all'. [one of: recent, updated, all, toprated, helpful]
- `review_type` (enum, optional, default "all") — Recommendation polarity filter. [one of: all, positive, negative]
- `day_range` (integer, optional) — Trending window in days (used with filter=all). Set directly, or via the `trend` shortcut.
- `trend` (enum, optional) — Shortcut that sets day_range + filter=all for a trending window. [one of: day, week, month, year]
- `sort` (enum, optional) — Optional client-side re-sort. Only funny/funniest reorder; otherwise Steam's native order is kept. [one of: funny, funniest]
- `purchase_type` (enum, optional, default "all") — Restrict to reviewers by purchase source. [one of: all, steam, non_steam_purchase]
- `cursor` (string, optional, default "*") — Pagination cursor — pass the previous response's `cursor` for the next page.
- `redact_pii` (boolean, optional, default false) — Drop author identity (steamid/profile/name/avatar/playtime) from each review.

**Returns:** appid, reviews[]{review, votes_up, votes_funny, author{...}}, summary{total_reviews, total_positive}, cursor, count, query{}

**Example request body:**
```json
{
  "appid": 730,
  "num_per_page": 5
}
```

### POST /steam-games/v1/player_stats — 1 credit
steamspy owners + optional current player count

**Parameters:**
- `appid` (integer, required) — Steam application id (the number in a store URL, e.g. 730 = CS2).
- `include_current_players` (boolean, optional, default true) — Also fetch the live concurrent player count.

**Returns:** appid, owners, average_forever, average_2weeks, median_forever, positive, negative, userscore, current_players

**Example request body:**
```json
{
  "appid": 730
}
```

### POST /steam-games/v1/search — 1 credit
store search → appid+price (+metascore on keyword); faceting: tags/type/category1/supportedlang/maxprice/specials. term OR a facet required.

**Parameters:**
- `term` (string, optional) — Keyword to search. Provide a term OR at least one facet (tags/type/category1/…).
- `count` (integer, optional, default 25) — How many items to return (1-100). Clamped to range.
- `start` (integer, optional, default 0) — Result offset for paging (skip N).
- `cc` (string, optional, default "us") — Store region — ISO-3166-1 alpha-2 (lower-cased). Drives currency & regional pricing.
- `lang` (string, optional, default "english") — Steam language name (e.g. english, french, schinese) for localized store text.
- `tags` (array, optional) — Filter by Steam tag id(s) (e.g. 19=Action) — discover ids via the tags action. Comma-list or array.
- `type` (enum, optional) — Content type → Steam category1 facet. Common values shown; plurals (games/demos/…) also accepted. [one of: game, dlc, software, demo, soundtrack, mod, hardware, video, bundle]
- `category1` (integer, optional) — Advanced: raw Steam category1 facet id (998=Games, 21=DLC). Overrides `type`.
- `supportedlang` (string, optional) — Filter to titles supporting this Steam language facet.
- `maxprice` (string, optional) — Steam maxprice facet (region price cap; Steam's own bucketing).
- `specials` (integer, optional) — Set 1 to restrict to titles currently on sale (Steam specials facet).
- `force_infinite` (boolean, optional, default false) — Force the faceted results_html path even for a short keyword query.

**Returns:** items[]{appid, name, type, price{final, discount_percent, is_free}, platforms, review_summary, metascore}, count, total_results, facets

**Example request body:**
```json
{
  "term": "portal",
  "count": 10
}
```

### POST /steam-games/v1/top_sellers — 1 credit
Steam top sellers chart slice (appid+price per item); same facets as search

**Parameters:**
- `count` (integer, optional, default 25) — How many items to return (1-100). Clamped to range.
- `start` (integer, optional, default 0) — Result offset for paging (skip N).
- `cc` (string, optional, default "us") — Store region — ISO-3166-1 alpha-2 (lower-cased). Drives currency & regional pricing.
- `lang` (string, optional, default "english") — Steam language name (e.g. english, french, schinese) for localized store text.
- `tags` (array, optional) — Filter by Steam tag id(s) (e.g. 19=Action) — discover ids via the tags action. Comma-list or array.
- `type` (enum, optional) — Content type → Steam category1 facet. Common values shown; plurals (games/demos/…) also accepted. [one of: game, dlc, software, demo, soundtrack, mod, hardware, video, bundle]
- `category1` (integer, optional) — Advanced: raw Steam category1 facet id (998=Games, 21=DLC). Overrides `type`.
- `supportedlang` (string, optional) — Filter to titles supporting this Steam language facet.
- `maxprice` (string, optional) — Steam maxprice facet (region price cap; Steam's own bucketing).

**Returns:** items[]{appid, name, type, price{...}, platforms, review_summary}, count, total_results, facets

**Example request body:**
```json
{
  "count": 5
}
```

### POST /steam-games/v1/news — 1 credit
official game news (ISteamNews/GetNewsForApp)

**Parameters:**
- `appid` (integer, required) — Steam application id (the number in a store URL, e.g. 730 = CS2).
- `count` (integer, optional, default 10) — How many items to return (1-100). Clamped to range.
- `maxlength` (integer, optional, default 300) — Truncate each news body to this many characters (0 = no cap from this param).

**Returns:** appid, news[]{title, url, contents, date, source}, count, news_count, source

**Example request body:**
```json
{
  "appid": 730,
  "count": 3
}
```

### POST /steam-games/v1/tags — 1 credit
community tags (InitAppTagModal) + franchise + external links (store page)

**Parameters:**
- `appid` (integer, required) — Steam application id (the number in a store URL, e.g. 730 = CS2).
- `cc` (string, optional, default "us") — Store region — ISO-3166-1 alpha-2 (lower-cased). Drives currency & regional pricing.
- `lang` (string, optional, default "english") — Steam language name (e.g. english, french, schinese) for localized store text.

**Returns:** appid, tags[]{tagid, name, count}, tag_count, franchise{slug, name}, external_links[]{url, label}

**Example request body:**
```json
{
  "appid": 730
}
```

### POST /steam-games/v1/similar_games — 1 credit
recommended similar games (appids) via /recommended/morelike

**Parameters:**
- `appid` (integer, required) — Steam application id (the number in a store URL, e.g. 730 = CS2).
- `count` (integer, optional, default 20) — How many items to return (1-50). Clamped to range.

**Returns:** appid, similar[]{appid}, count, total_found

**Example request body:**
```json
{
  "appid": 1245620,
  "count": 6
}
```

### POST /steam-games/v1/artworks — 1 credit
official art-asset URLs (header/capsule/library/hero/logo/background)

**Parameters:**
- `appid` (integer, required) — Steam application id (the number in a store URL, e.g. 730 = CS2).
- `cc` (string, optional, default "us") — Store region — ISO-3166-1 alpha-2 (lower-cased). Drives currency & regional pricing.
- `lang` (string, optional, default "english") — Steam language name (e.g. english, french, schinese) for localized store text.

**Returns:** appid, name, artworks{header, library_600x900, hero_capsule, logo, background, ...}, count, cdn_base

**Example request body:**
```json
{
  "appid": 730
}
```

### POST /steam-games/v1/guides — 1 credit
Community guides for a game (Steam Workshop guides) — top-rated, trending or most-recent. Each guide: title, author, star rating, preview image and URL.

**Parameters:**
- `appid` (integer, required) — Steam application id (the number in a store URL, e.g. 730 = CS2).
- `sort` (enum, optional, default "trend") — How to order the guides. [one of: trend, toprated, mostrecent]
- `page` (integer, optional, default 1) — Result page.
- `limit` (integer, optional, default 30) — Max guides to return (1–50).

**Returns:** appid, sort, page, count, guides[]{id, url, title, author, short_desc, rating_stars, preview_image}

**Example request body:**
```json
{
  "appid": 570,
  "sort": "trend",
  "limit": 10
}
```

### POST /steam-games/v1/dlc — 1 credit
List a game's DLC with names + regional prices. The base game's DLC appids are resolved to titles/prices (bounded by `resolve` to keep latency sane).

**Parameters:**
- `appid` (integer, required) — Steam application id (the number in a store URL, e.g. 730 = CS2).
- `cc` (string, optional, default "us") — Store region — ISO-3166-1 alpha-2 (lower-cased). Drives currency & regional pricing.
- `lang` (string, optional, default "english") — Steam language name (e.g. english, french, schinese) for localized store text.
- `resolve` (integer, optional, default 25) — How many rows to enrich with names (extra per-id lookups; 0-60). Steam serves one app per detail call, so this bounds latency; un-enriched rows still return their appid.

**Returns:** appid, name, dlc[]{appid, name, is_free, price{currency, final, initial, discount_percent}, release_date, resolved}, count, total_dlc, resolved_count

**Example request body:**
```json
{
  "appid": 1245620,
  "resolve": 5
}
```

### POST /steam-games/v1/package — 1 credit
Steam package / bundle (a.k.a. 'sub') details — the apps it contains, the bundled price, platforms and release date. Use the package ids from app_detail.package_groups.

**Parameters:**
- `packageid` (integer, required) — Steam package/sub id (from app_detail.package_groups[].subs[].packageid).
- `cc` (string, optional, default "us") — Store region — ISO-3166-1 alpha-2 (lower-cased). Drives currency & regional pricing.
- `lang` (string, optional, default "english") — Steam language name (e.g. english, french, schinese) for localized store text.

**Returns:** packageid, name, apps[]{id, name}, app_count, price{currency, final, initial, discount_percent}, platforms, controller, release_date

**Example request body:**
```json
{
  "packageid": 440408
}
```

### POST /steam-games/v1/featured — 1 credit
Store-front discovery lists: specials (current deals), new_releases, coming_soon and top_sellers — each with appid + price. Pick one with `category`, or get all four.

**Parameters:**
- `category` (enum, optional, default "all") — Which store-front list(s) to return. [one of: all, specials, new_releases, coming_soon, top_sellers]
- `count` (integer, optional, default 20) — How many items to return (1-100). Clamped to range.
- `cc` (string, optional, default "us") — Store region — ISO-3166-1 alpha-2 (lower-cased). Drives currency & regional pricing.
- `lang` (string, optional, default "english") — Steam language name (e.g. english, french, schinese) for localized store text.

**Returns:** cc, category, buckets[], categories{specials[], new_releases[], coming_soon[], top_sellers[]}{appid, name, discounted, discount_percent, final_price, original_price, currency, header_image, platforms}, count

**Example request body:**
```json
{
  "category": "specials",
  "count": 5
}
```

### POST /steam-games/v1/most_played — 1 credit
Official Steam most-played chart — live concurrent player count + 24h peak per game (the only keyless source of all-time/period peak). Optionally enrich rows with names.

**Parameters:**
- `count` (integer, optional, default 25) — How many items to return (1-100). Clamped to range.
- `resolve` (integer, optional, default 0) — How many rows to enrich with names (extra per-id lookups; 0-50). Steam serves one app per detail call, so this bounds latency; un-enriched rows still return their appid.
- `cc` (string, optional, default "us") — Store region — ISO-3166-1 alpha-2 (lower-cased). Drives currency & regional pricing.
- `lang` (string, optional, default "english") — Steam language name (e.g. english, french, schinese) for localized store text.

**Returns:** last_update, games[]{rank, appid, name, concurrent_players, peak_players_today}, count

**Example request body:**
```json
{
  "count": 5
}
```

### POST /steam-games/v1/review_histogram — 1 credit
Recommendations up/down over the game's lifetime (Steam's own review histogram) — the data behind the store review-trend graph.

**Parameters:**
- `appid` (integer, required) — Steam application id (the number in a store URL, e.g. 730 = CS2).
- `lang` (string, optional, default "english") — Steam language name (e.g. english, french, schinese) for localized store text.

**Returns:** appid, start_date, end_date, rollup_type, rollups[]{date, recommendations_up, recommendations_down}, recent_weeks[], recommendations_up_total, recommendations_down_total, count

**Example request body:**
```json
{
  "appid": 730
}
```

### POST /steam-games/v1/player_profile — 1 credit
Public Steam profile summary by 64-bit steamid OR vanity name (keyless). Returns persona, avatar, online state, ban flags and the privacy state. Note: owned-games / friends are NOT available on Steam's keyless surface — this is the profile summary.

**Parameters:**
- `steamid` (string, optional) — 64-bit SteamID. Provide this OR `vanity`.
- `vanity` (string, optional) — Custom URL name from steamcommunity.com/id/<name>. Resolved to a steamid. Provide this OR `steamid`.

**Returns:** steamid64, persona_name, online_state, privacy_state, is_public, avatar, real_name, location, member_since, vac_banned, trade_ban_state, is_limited_account

**Example request body:**
```json
{
  "vanity": "gabelogannewell"
}
```

### POST /steam-games/v1/resolve — 1 credit
Turn a human name into ids so callers never hand-find a URL: a game name → matching appids (chains to app_detail), or a vanity name (kind=profile) → steamid64.

**Parameters:**
- `term` (string, required) — Game title (kind=app) or vanity name (kind=profile) to resolve.
- `kind` (enum, optional, default "app") — What to resolve. [one of: app, profile]
- `count` (integer, optional, default 10) — How many items to return (1-50). Clamped to range.

**Returns:** kind, term, matches[]{appid, name, icon, logo} (kind=app) | steamid64, persona_name (kind=profile), count

**Example request body:**
```json
{
  "term": "elden ring"
}
```

## More
- Try it live, no code: https://reefapi.com/playground?engine=steam-games
- Human docs page: https://reefapi.com/docs/steam-games
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
