# Xbox Store Scraper (`crawlerbros/xbox-store-scraper`) Actor

Scrape the official Xbox Store (xbox.com/games/store) - search games, browse the storefront with sort options, and fetch rich game detail (price, discount, ESRB rating, genres, platforms, media) by product ID.

- **URL**: https://apify.com/crawlerbros/xbox-store-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Xbox Store Scraper

Scrape the official Xbox Store (xbox.com/games/store) — search games by
keyword, browse the storefront with real sort orders (most popular, price,
newest, most wishlisted, biggest discount), or fetch rich game detail (price,
discount, ESRB rating, genres, platforms, box art, trailers) by product ID.
No login, no cookies, no proxy required.

### What this actor does

- **Three modes:** `search`, `browse`, `byProductId`
- **Real storefront sort orders** — relevance, release date, popularity, price, wishlist count, discount, title
- **Filters:** genre (21 real Xbox Store genres), platform, ESRB age rating, subscription (Game Pass tiers/EA Play/Ubisoft+), multiplayer feature, technical feature (4K/HDR/ray tracing/etc), handheld compatibility, on-sale-only, price range, free-only, min rating — genre/platform/age-rating/subscription/multiplayer/technical/handheld/on-sale are applied server-side (the same storefront facets xbox.com itself uses), so results are genuinely narrowed rather than just post-filtered
- **Real store pricing** including active discounts and MSRP
- **Empty fields are omitted**

### Output per game

- `productId` — Xbox Store / Microsoft Store product ID
- `title`, `shortDescription`, `description`
- `developerName`, `publisherName`, `releaseDate`
- `genres[]` — up to 21 real Xbox Store genres
- `platforms[]` — raw storefront platform tokens as xbox.com itself reports them, e.g. `XboxOne` / `XboxSeriesX` / `PC` / `Handheld` / `XCloud` / `MobileDevice` / `HoloLens` (may include more than the `platform` input filter's options)
- `listPrice`, `msrp`, `discountPercentage`, `currency`, `isFree`
- `averageRating`, `ratingCount`
- `ageRatingBoard`, `ageRatingLabel`, `ageRatingMinAge`, `contentDescriptors[]`
- `boxArtUrl`, `posterUrl`, `heroArtUrl`, `videos[]`
- `sourceUrl` — canonical Xbox Store page
- `recordType: "xboxGame"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `browse` / `byProductId` |
| `searchQuery` | string | `halo` | Free-text query (mode=search) |
| `sortBy` | string | `MOST_POPULAR` | Sort order (mode=browse) |
| `productIds` | array | – | Product IDs (mode=byProductId) |
| `genre` | string | `ANY` | One of 21 real Xbox Store genres (server-side filter) |
| `platform` | string | `ANY` | Platform filter (server-side filter) |
| `ageRating` | string | `ANY` | ESRB age rating filter (server-side filter) |
| `subscription` | string | `ANY` | Game Pass tier / EA Play / Ubisoft+ filter (server-side filter) |
| `multiplayerFeature` | string | `ANY` | Multiplayer/co-op feature filter (server-side filter) |
| `technicalFeature` | string | `ANY` | Technical feature filter — 4K, HDR, ray tracing, etc. (server-side filter) |
| `handheldCompatibility` | string | `ANY` | Handheld-device compatibility rating filter (server-side filter) |
| `onSaleOnly` | bool | `false` | Only currently-discounted games (server-side filter) |
| `minPrice` / `maxPrice` | int | – | Price range in USD |
| `freeOnly` | bool | `false` | Only free games |
| `minRating` | int | – | Min average rating, 1-5 |
| `maxItems` | int | `25` | Hard cap (1-100). `search`/`browse` return at most ~25 results per run (one storefront page); use `byProductId` for larger ID batches. |

#### Example: browse the biggest current discounts

```json
{
  "mode": "browse",
  "sortBy": "DISCOUNT_DESC",
  "maxItems": 25
}
```

#### Example: RPGs under $30 on Xbox Series X|S

```json
{
  "mode": "search",
  "searchQuery": "rpg",
  "genre": "Role playing",
  "platform": "XboxSeriesX|S",
  "maxPrice": 30
}
```

### Data source & reliability

Search, browse, and detail pages are parsed from the store's server-rendered
Redux state (`window.__PRELOADED_STATE__`) embedded in every
xbox.com/games/store page — the same data the storefront itself renders from.
No browser automation, cookies, login, or paid proxy dependency is required.

### FAQs

**Do I need an Xbox Live / Microsoft account?** No — this actor only reads
the public storefront, exactly as an anonymous visitor sees it.

**Why is `search`/`browse` capped around 25 results?** The Xbox Store website
loads the first page of results server-side and fetches further pages
client-side after the page loads; only the first page is available without
running a full browser. `genre`/`platform`/`ageRating` are sent as real
storefront query parameters, so that first page is already narrowed to the
requested facets (not just post-filtered), which helps surface more relevant
titles within the ~25-item cap. Use `byProductId` with a list of IDs to fetch
specific games beyond that.

**What are the genre options?** `Action & adventure`, `Card & board`,
`Casino`, `Classics`, `Companion`, `Educational`, `Family & kids`, `Fighting`,
`Multi-Player Online Battle Arena`, `Music`, `Other`, `Platformer`,
`Puzzle & trivia`, `Racing & flying`, `Role playing`, `Shooter`, `Simulation`,
`Sports`, `Strategy`, `Tools`, `Word` — these mirror the real genre filter on
xbox.com.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `searchQuery` (type: `string`):

Free-text game title or keyword to search for.

## `sortBy` (type: `string`):

Sort order for the storefront browse listing.

## `productIds` (type: `array`):

Xbox Store product IDs, e.g. `9NP1P1WFS0LB` (found in a game's store URL: xbox.com/en-US/games/store/<slug>/<productId>).

## `genre` (type: `string`):

Only keep games tagged with this genre.

## `platform` (type: `string`):

Only keep games available on this platform.

## `ageRating` (type: `string`):

Only keep games with this ESRB age rating. Applied server-side (narrows the SSR'd result page itself), so it can surface titles beyond the default top ~25.

## `subscription` (type: `string`):

Only keep games included in this subscription (Game Pass tiers, EA Play, Ubisoft+). Applied server-side.

## `multiplayerFeature` (type: `string`):

Only keep games supporting this multiplayer feature. Applied server-side.

## `technicalFeature` (type: `string`):

Only keep games supporting this technical feature. Applied server-side.

## `handheldCompatibility` (type: `string`):

Only keep games with this handheld-device compatibility rating. Applied server-side.

## `onSaleOnly` (type: `boolean`):

Only keep games currently discounted. Applied server-side.

## `minPrice` (type: `integer`):

Drop games priced below this.

## `maxPrice` (type: `integer`):

Drop games priced above this.

## `freeOnly` (type: `boolean`):

Only keep games that are currently free.

## `minRating` (type: `integer`):

Drop games with an average rating below this (1-5).

## `maxItems` (type: `integer`):

Hard cap on emitted records. Note: `search`/`browse` return at most ~25 results per run (a single storefront page); use `byProductId` for larger batches by ID.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "halo",
  "sortBy": "MOST_POPULAR",
  "productIds": [
    "9NP1P1WFS0LB"
  ],
  "genre": "ANY",
  "platform": "ANY",
  "ageRating": "ANY",
  "subscription": "ANY",
  "multiplayerFeature": "ANY",
  "technicalFeature": "ANY",
  "handheldCompatibility": "ANY",
  "onSaleOnly": false,
  "freeOnly": false,
  "maxItems": 25
}
```

# Actor output Schema

## `games` (type: `string`):

Dataset containing all scraped Xbox Store games.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "search",
    "searchQuery": "halo",
    "sortBy": "MOST_POPULAR",
    "productIds": [
        "9NP1P1WFS0LB"
    ],
    "genre": "ANY",
    "platform": "ANY",
    "ageRating": "ANY",
    "subscription": "ANY",
    "multiplayerFeature": "ANY",
    "technicalFeature": "ANY",
    "handheldCompatibility": "ANY",
    "onSaleOnly": false,
    "freeOnly": false,
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/xbox-store-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "search",
    "searchQuery": "halo",
    "sortBy": "MOST_POPULAR",
    "productIds": ["9NP1P1WFS0LB"],
    "genre": "ANY",
    "platform": "ANY",
    "ageRating": "ANY",
    "subscription": "ANY",
    "multiplayerFeature": "ANY",
    "technicalFeature": "ANY",
    "handheldCompatibility": "ANY",
    "onSaleOnly": False,
    "freeOnly": False,
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/xbox-store-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "searchQuery": "halo",
  "sortBy": "MOST_POPULAR",
  "productIds": [
    "9NP1P1WFS0LB"
  ],
  "genre": "ANY",
  "platform": "ANY",
  "ageRating": "ANY",
  "subscription": "ANY",
  "multiplayerFeature": "ANY",
  "technicalFeature": "ANY",
  "handheldCompatibility": "ANY",
  "onSaleOnly": false,
  "freeOnly": false,
  "maxItems": 25
}' |
apify call crawlerbros/xbox-store-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/xbox-store-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/zaolGzKfFYRGzXQBo/builds/em4ndeebPJFqHF1ue/openapi.json
