Epic Games Store Scraper - Game Prices & Discounts
Pricing
from $0.70 / 1,000 game scrapeds
Epic Games Store Scraper - Game Prices & Discounts
Epic Games Store catalogue with price, list price and discount in any country's currency, one flat row per game, edition, add-on or demo: title, sale end date, release date, seller, developer, genres, platforms, images, URL. Sale-only, free-only, search, category and price sorts.
Pricing
from $0.70 / 1,000 game scrapeds
Rating
0.0
(0)
Developer
Superslow Sloth
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Read the Epic Games Store catalogue for any country and get one flat row per game, edition, add-on, demo or app: current price, list price, discount amount and percent, when the sale ends, release dates, seller, developer, publisher, categories, genres, platforms, store art and the store link. Turn on the sale-only switch and schedule it, and it is an Epic Games Store sale alert; run the same search in several countries and it is a PC game price comparison across countries.
No account, no API key, no login, no browser. One request returns 40 offers.
Input
| Field | Notes |
|---|---|
country | Two-letter ISO country (default US). Prices come back in that country's currency: US in USD, DE in EUR, JP in JPY, GB in GBP, BR in BRL. A code Epic does not recognise fails the run with Epic's own message. |
locale | Language of titles and descriptions (default en-US; de, fr, ja, pt-BR ...). Text only: it never changes prices or currency. |
keywords | Optional search, as typed into the store search box (witcher). Empty reads the whole catalogue. |
category | all (default; what the store's browse page lists: games, editions, bundles, add-ons, demos, apps), games (games, editions and bundles), base-games (standard editions only). |
onlyOnSale | Only offers Epic currently discounts. |
onlyFree | Only offers that cost nothing right now (free-to-play, demos, free add-ons, 100%-off promotions). |
sort | newest-release (default, the store's own order), price-asc, price-desc, title-asc. The price sorts use the list price, before any discount, because that is how Epic sorts. |
maxItems | Offers to return (default 100, up to 10,000). |
proxyConfiguration | Apify residential proxy by default. See "How it fetches". |
Output
| Field | Notes |
|---|---|
country_code, locale | What the run asked for. |
offer_id, namespace | Epic's offer id (the same in every country, so it is the key to join countries on) and its catalogue namespace (a game and its add-ons share one). |
title, description, url | Title, short store description, and the https://store.epicgames.com/p/... store page the browse card links to. |
categories | Epic's category paths: games/edition/base, games/edition, addons/durable, games/demo, applications ... This is what tells a base game from an edition, an add-on or a demo. |
seller, developer, publisher | As the store shows them. |
price, original_price, currency | Current price and list price as numbers in currency. Epic sends integer minor units with the currency's decimals (2 for USD, 0 for JPY); these are converted, so 23.99 USD and 2384 JPY. |
discount_amount, discount_percent, is_discounted, sale_ends_at | The sale as an amount, as a whole percent of the list price, a flag, and the end of the promotion as an ISO timestamp. |
is_free | The current price is 0. |
voucher_discount | A voucher Epic applied to the quoted price (0 on everything measured). |
price_formatted, original_price_formatted | The prices exactly as the store displays them ($23.99, ¥2,384; Epic shows a free offer as 0). |
release_date, pc_release_date, effective_date | ISO timestamps as Epic sends them. |
is_code_redemption_only | Sold only as a redemption code. |
genres, platforms, tags, tag_ids | Genre names (Action, Indie), platforms (Windows, Mac OS), every named tag including features (Single Player, Achievements), and Epic's raw tag ids. |
image_wide_url, image_tall_url, thumbnail_url | Store art. Nothing is downloaded. |
Honest nulls
A field Epic did not send is null, never 0 or "":
discount_percentis null for an offer whose list price is 0 (a demo, a free-to-play game): a percent of nothing has no meaning. It is0for a priced offer that is not on sale, because Epic states a zero discount there.sale_ends_atis null when the offer is not on sale.- Every price field is null for an offer Epic sends without a price block (none measured so far; the actor asks only for priced offers, as the store does).
genres,platformsandtagsare null, not empty, in the rare run where Epic's tag-name list could not be read;tag_idsis still filled then. An empty list means the offer has no tag of that kind (many add-ons have no genre).urlis null if Epic gives an offer no page slug (none measured).discount_percentis computed from Epic's discount and list price (Epic sends no percent field) and rounded to a whole number.
Pricing
Pay per event:
- $0.002 per run (
actor-start), charged only after your input is validated, so a run that fails on bad input costs nothing. - $0.0007 per offer row written (
game-scraped), i.e. $0.70 per 1,000 offers.
How it fetches
The store's browse page is built from a GraphQL query (searchStoreQuery) that
the page itself runs; the actor sends that same query, 40 offers per request,
with the country as a parameter. Measured on 2026-10-18:
- The country is a parameter, not the proxy's location. The browse page
itself renders the catalogue of whatever country the visitor's address is in:
nine residential fetches came back as DE, AL, US, DE, IT, US, BR, US and LC,
in EUR, USD and BRL, and a
country=USURL parameter was ignored. The query the actor sends answered US in USD, DE in EUR, JP in JPY, GB in GBP and BR in BRL from every address tried. Every row carries the currency Epic priced it in. - Residential proxy by default. Cloudflare refused 4 of 4 Apify datacenter fetches of the browse page that day (and 7/10, 6/10 on earlier probes); residential passed 20 of 21 GraphQL requests, the one miss a dropped connection that the actor retries from a fresh address. The GraphQL query answered 8 of 8 datacenter requests too, so a datacenter proxy may work and costs less, but it has been measured once only.
- Light on bandwidth. About 0.15 MB per page of 40 offers, against about 1.1 MB for the browse page.
- Self-healing query id. Epic identifies the query by a hash that changes when it redeploys the store. If Epic stops recognising it, the actor reads the current one from the store's own browse page (once per run) and carries on.
- Result reach. Epic lets one query reach 10,000 offers (it clamps the offset at 9,960), though it reports about 13,400 matching the empty search in the US. The actor logs when it stopped at that point; a search term, a category or the sale filter reaches the rest.
- The catalogue size differs by country (13,391 offers for the US, 13,253 for JP, 12,058 for DE, 11,845 for BR), so the same query is not the same set everywhere.
- A 403, 429, 5xx, challenge page or dropped connection is treated as a refusal: the actor rotates to a fresh address and retries. An offer that shows up on two pages is returned and charged once.