# Epic Games Scraper (`sallbro/epicgames-scraper`) Actor

Scrapes game listings and news articles from the Epic Games Store. Supports optional full detail enrichment (system requirements, screenshots, tag groups) per game.

- **URL**: https://apify.com/sallbro/epicgames-scraper.md
- **Developed by:** [Salman Asu](https://apify.com/sallbro) (community)
- **Categories:** Automation, Other, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.007 / actor start

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Epic Games Store Scraper  (Apify Actor v3)

Scrapes game listings and news articles from the **Epic Games Store** using its internal GraphQL and REST APIs.

---

### Project structure

````

src/
├── main.js                     Entry point — dispatches to list or news mode
├── scraper/
│   ├── list.js                 Paginated game list (async generator, searchStoreQuery)
│   ├── gameDetails.js          3-step per-game enrichment → single flat output record
│   ├── catalog.js              Standalone getCatalogOffer fetcher (used by gameDetails)
│   └── news.js                 Paginated EGS blog-posts (async generator, REST API)
└── utility/
├── http.js                 All raw API calls + exponential back-off retry
├── tags.js                 Platform/genre tag maps, VALID\_COUNTRIES, PRICE\_OPTIONS
└── transform.js            Pure data transforms — list, config, catalog, news, merge

````

---

### Input fields

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `mode` | dropdown | `list` | `list` = game listings · `news` = blog articles |
| `keywords` | text | `""` | Search term to filter game results |
| `fetchDetails` | toggle | `false` | Enrich each game with config + catalog data (2–3 extra API calls per game) |
| `platforms` | dropdown | `["windows"]` | Windows · Mac · iOS · Android |
| `genres` | dropdown | `[]` | 18 genres, multi-select, OR-combined |
| `priceFilter` | dropdown | `0-75000` | Free only · Under ₹750 · Above ₹1,099 |
| `country` | dropdown | `IN` | IN · US · GB · DE |
| `startPage` | number | `0` | Zero-based page index for game list (40 results/page) |
| `maxPages` | number | `1` | Number of game list pages to fetch |
| `newsStartPage` | number | `0` | Zero-based page index for news articles (10 articles/page) |
| `newsMaxPage` | number | `1` | Number of news pages to fetch |

---

### Modes

#### `list` (default)

Fetches pages of game listings. When **Fetch full detail info** is enabled, each game goes through a 3-step enrichment chain before being saved.

```json
{
  "mode": "list",
  "startPage": 0,
  "maxPages": 3,
  "platforms": ["windows"],
  "genres": ["action", "rpg"],
  "priceFilter": "0-75000",
  "country": "IN",
  "keywords": "",
  "fetchDetails": true
}
````

#### `news`

Fetches EGS blog-post articles from the content REST API.

```json
{
  "mode": "news",
  "newsStartPage": 0,
  "newsMaxPage": 3
}
```

Endpoint: `GET https://store-content-ipv4.ak.epicgames.com/api/en-US/content/blog-posts?count=10&start=0`

***

### Detail enrichment — 3-step API chain

Activated when `fetchDetails: true` in `list` mode.

| Step | Operation | Input | Adds to output |
|------|-----------|-------|----------------|
| 1 | `getMappingByPageSlug` | `offerPageSlug` | `_mapping` (sandboxId, productId, offerId) |
| 2 | `getStoreConfig` | `sandboxId` | `shortDescription`, `legalText`, `socialLinks`, `supportedAudio`, `supportedText`, `theme`, `logo`, `icon`, `systemRequirements` |
| 3 | `getCatalogOffer` | `offerId` + `sandboxId` | `longDescription`, `screenshots`, `videos`, `allImages`, `genres`, `platforms`, `features`, `refundType`, `countriesBlacklist`, `catalog_price` |

All output is **flat** — no nested sub-objects.

***

### priceFilter behaviour

| Value | API effect |
|-------|-----------|
| `free` | Sets `freeGame: true` in query (no priceRange) |
| `0-75000` | Sets `priceRange: "(0, 75000)"` |
| `more-than-109900` | Sets `priceRange: "[109900,]"` |

***

### Tag maps

#### Platforms

| Dropdown value | Epic tag ID |
|----------------|-------------|
| windows | 9547 |
| mac | 10719 |
| ios | 39070 |
| android | 39071 |

#### Genres

| Dropdown value | Tag | Dropdown value | Tag |
|----------------|-----|----------------|-----|
| action | 1216 | horror | 1218 |
| action-adventure | 1336 | open-world | 1307 |
| adventure | 1117 | puzzle | 1298 |
| card-game | 1181 | racing | 1212 |
| casual | 1296 | rpg | 1367 |
| comedy | 1116 | simulation | 1393 |
| exploration | 1381 | space | 1121 |
| fantasy | 1287 | sports | 1283 |
| fighting | 1344 | survival | 1080 |

***

### GraphQL operations & hashes

| Operation | Hash |
|-----------|------|
| `searchStoreQuery` | `7d58e12d…437` |
| `getMappingByPageSlug` | `781fd69e…f30` |
| `getStoreConfig` | `6a3c3cf3…716` |
| `getCatalogOffer` | `ec112951…26e` |

All GraphQL → `https://store.epicgames.com/graphql` (GET, persisted-query)
News REST   → `https://store-content-ipv4.ak.epicgames.com/api/en-US/content/blog-posts`

# Actor input Schema

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

list = scrape game listings. news = scrape EGS blog articles.

## `keywords` (type: `string`):

Search term to filter game results (list mode only).

## `fetchDetails` (type: `boolean`):

When enabled, each game is enriched with store config (system requirements, social links, logo) and catalog offer (long description, screenshots, videos, tag groups). Makes 2 extra API calls per game.

## `platforms` (type: `array`):

Filter results by platform (list mode only).

## `genres` (type: `array`):

Filter results by genre. Multiple selections are OR-combined (list mode only).

## `priceFilter` (type: `string`):

Filter results by price range (list mode only).

## `country` (type: `string`):

Country for regional pricing (list mode only).

## `startPage` (type: `integer`):

Zero-based page index to start fetching game listings from. Each page = 40 results.

## `maxPages` (type: `integer`):

Number of game listing pages to fetch.

## `newsStartPage` (type: `integer`):

Zero-based page index to start fetching news articles from. Each page = 10 articles.

## `newsMaxPage` (type: `integer`):

Number of news pages to fetch.

## `proxyConfiguration` (type: `object`):

Apify proxy settings. Recommended for large catalog runs (500+ games).

## Actor input object example

```json
{
  "mode": "list",
  "keywords": "",
  "fetchDetails": false,
  "platforms": [
    "windows"
  ],
  "genres": [],
  "priceFilter": "0-75000",
  "country": "IN",
  "startPage": 0,
  "maxPages": 1,
  "newsStartPage": 0,
  "newsMaxPage": 1,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("sallbro/epicgames-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("sallbro/epicgames-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 '{}' |
apify call sallbro/epicgames-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Epic Games Scraper",
        "description": "Scrapes game listings and news articles from the Epic Games Store. Supports optional full detail enrichment (system requirements, screenshots, tag groups) per game.",
        "version": "3.0",
        "x-build-id": "Jmfz2SNMyLNMaZLDK"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sallbro~epicgames-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sallbro-epicgames-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/sallbro~epicgames-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sallbro-epicgames-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/sallbro~epicgames-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sallbro-epicgames-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "list",
                            "news"
                        ],
                        "type": "string",
                        "description": "list = scrape game listings. news = scrape EGS blog articles.",
                        "default": "list"
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "string",
                        "description": "Search term to filter game results (list mode only).",
                        "default": ""
                    },
                    "fetchDetails": {
                        "title": "Fetch full detail info",
                        "type": "boolean",
                        "description": "When enabled, each game is enriched with store config (system requirements, social links, logo) and catalog offer (long description, screenshots, videos, tag groups). Makes 2 extra API calls per game.",
                        "default": false
                    },
                    "platforms": {
                        "title": "Platform",
                        "type": "array",
                        "description": "Filter results by platform (list mode only).",
                        "items": {
                            "type": "string",
                            "enum": [
                                "windows",
                                "mac",
                                "ios",
                                "android"
                            ],
                            "enumTitles": [
                                "Windows",
                                "Mac",
                                "iOS",
                                "Android"
                            ]
                        },
                        "default": [
                            "windows"
                        ]
                    },
                    "genres": {
                        "title": "Genre",
                        "type": "array",
                        "description": "Filter results by genre. Multiple selections are OR-combined (list mode only).",
                        "items": {
                            "type": "string",
                            "enum": [
                                "action",
                                "action-adventure",
                                "adventure",
                                "card-game",
                                "casual",
                                "comedy",
                                "exploration",
                                "fantasy",
                                "fighting",
                                "horror",
                                "open-world",
                                "puzzle",
                                "racing",
                                "rpg",
                                "simulation",
                                "space",
                                "sports",
                                "survival"
                            ],
                            "enumTitles": [
                                "Action",
                                "Action-Adventure",
                                "Adventure",
                                "Card Game",
                                "Casual",
                                "Comedy",
                                "Exploration",
                                "Fantasy",
                                "Fighting",
                                "Horror",
                                "Open World",
                                "Puzzle",
                                "Racing",
                                "RPG",
                                "Simulation",
                                "Space",
                                "Sports",
                                "Survival"
                            ]
                        },
                        "default": []
                    },
                    "priceFilter": {
                        "title": "Price",
                        "enum": [
                            "free",
                            "0-75000",
                            "more-than-109900"
                        ],
                        "type": "string",
                        "description": "Filter results by price range (list mode only).",
                        "default": "0-75000"
                    },
                    "country": {
                        "title": "Country",
                        "enum": [
                            "IN",
                            "US",
                            "GB",
                            "DE"
                        ],
                        "type": "string",
                        "description": "Country for regional pricing (list mode only).",
                        "default": "IN"
                    },
                    "startPage": {
                        "title": "Start page",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Zero-based page index to start fetching game listings from. Each page = 40 results.",
                        "default": 0
                    },
                    "maxPages": {
                        "title": "Max pages",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Number of game listing pages to fetch.",
                        "default": 1
                    },
                    "newsStartPage": {
                        "title": "News start page",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Zero-based page index to start fetching news articles from. Each page = 10 articles.",
                        "default": 0
                    },
                    "newsMaxPage": {
                        "title": "News max pages",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Number of news pages to fetch.",
                        "default": 1
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify proxy settings. Recommended for large catalog runs (500+ games).",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
