# Allkeyshop Scraper - Game Key Prices by Store (`scrapewise/allkeyshop-scraper`) Actor

Scrape Allkeyshop game price comparisons by title, platform and price range: lowest price, store, edition, region, coupon, official or key reseller, price history low and buy link for every offer. Currencies EUR, USD, GBP. Error rows are free.

- **URL**: https://apify.com/scrapewise/allkeyshop-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** E-commerce, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.08 / 1,000 game delivereds

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

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Allkeyshop Scraper - Game Key Prices by Store

Scrape Allkeyshop game price comparisons and get, for every game, the lowest price, the store that sells it, the edition and the region, the lowest official-store price, the lowest price the game ever reached, and the full list of store offers with coupon codes, prices with card or PayPal fees and a buy link. Search by title, filter by platform and price range, or paste game pages. Prices come in euro, US dollar or pound.

Use it to track game deals, build a price alert, compare key resellers against official stores, feed a price history sheet, or check what a game costs in each region before you buy.

### At a glance

| | |
|---|---|
| **What you get** | One row per game: lowest price, store, edition, region, official-store low, key-only low, historical low, price by store and every offer |
| **Search** | Game titles, platform, minimum and maximum price, sort order |
| **Game pages** | Paste links such as `https://www.allkeyshop.com/blog/buy-hades-cd-key-compare-prices/` |
| **Platforms** | PC, PlayStation 5, PlayStation 4, Xbox Series X|S, Xbox One, Nintendo Switch, Nintendo Switch 2 |
| **Currencies** | EUR, USD, GBP |
| **Price** | US$ 8.00 per 1,000 games (US$ 0.008 per game delivered) plus a US$ 0.005 start fee per run. The tiered discounts of your Apify plan apply |
| **Free** | Error rows, duplicates and games that have no offer for your filters |
| **Login** | None. Public prices only |
| **Output** | JSON, CSV, Excel, XML or HTML table from the dataset, plus API access |

A run with the default input (one title, up to 50 games) takes under a minute. Each game costs a fraction of a cent, so 1,000 games cost about US$ 8.

### Quick start

1. Open the Actor and press **Try for free** (or **Start** if you already have a plan).
2. Type one or more game titles in **Game titles**, one per line. Leave **Game page links** empty.
3. Pick a **Currency** and, if you want, a **Platform** and a **Maximum price**.
4. Press **Start**, wait for the run to finish and open the **Games** view of the dataset.

Minimal JSON input:

```json
{
  "searchQueries": [
    "hollow knight"
  ],
  "currency": "USD",
  "maxItems": 20
}
```

Cheapest PC games under a price, in dollars:

```json
{
  "searchQueries": ["souls", "racing"],
  "platforms": ["pc"],
  "currency": "USD",
  "maxPrice": 15,
  "sortBy": "price",
  "maxItems": 100
}
```

Prices for specific game pages:

```json
{
  "startUrls": [
    "https://www.allkeyshop.com/blog/buy-hades-cd-key-compare-prices/",
    "https://www.allkeyshop.com/blog/en-gb/buy-stardew-valley-cd-key-compare-prices/"
  ]
}
```

If you start the Actor with an empty input it runs the example search for `hollow knight`, so a first test always returns data.

### Input

| Field | Type | What it does |
|---|---|---|
| `searchQueries` | list of text | Game titles or keywords. Every line is one search. A search returns up to 24 games per page and keeps paging until `maxItems` |
| `startUrls` | list of links | Allkeyshop game pages. Add `/en-us/` or `/en-gb/` after `/blog/` to get dollars or pounds from that link |
| `platforms` | list | `pc`, `playstation-5`, `playstation-4`, `xbox-series-x`, `xbox-one`, `switch`, `switch-2`. Empty means all platforms |
| `currency` | `EUR`, `USD`, `GBP` | Currency of every price in the output. Default `EUR` |
| `minPrice` / `maxPrice` | number | Keep games whose lowest price is inside this range, in the chosen currency |
| `sortBy` | text | `popularity` (default), `price` (cheapest first), `highest price`, `release` (newest first) |
| `officialStoresOnly` | true/false | Keep only offers from official stores such as publisher stores and the big platforms |
| `keysOnly` | true/false | Drop offers that sell a pre-loaded account instead of a key |
| `inStockOnly` | true/false | Keep only offers in stock. Default true |
| `maxOffersPerGame` | number | Keep the cheapest N offers in each game's list. 0 means all. The lowest-price fields still use every offer |
| `maxItems` | number | Total number of games for the whole run. Default 50 |
| `proxyConfiguration` | proxy | The default works. Change it only if you need a specific country |

A search term is matched against game names, so `elden ring` also returns the expansions, bundles and the account editions of that game. Use `platforms` and `maxPrice` to narrow it down.

### Output fields

One row per game. All prices use the currency you chose.

| Field | Meaning |
|---|---|
| `gameId` | Allkeyshop product id |
| `game` | Game or product name, as listed |
| `platform` | Platform of the listing, for example PC or PlayStation 5 |
| `gameType` | `game`, `dlc` and other product types |
| `releaseDate` | Release date (search results) |
| `currency` | EUR, USD or GBP |
| `lowestPrice` | Cheapest offer after the store coupon |
| `lowestPriceStore` | Store that sells it |
| `lowestPriceEdition` | Edition of that offer, for example Standard or Deluxe |
| `lowestPriceRegion` | Region or activation type of that offer, for example Steam Global, Steam EU or Steam Account |
| `lowestPriceUrl` | Buy link of that offer |
| `lowestKeyPrice`, `lowestKeyStore` | Cheapest offer that sells a key, leaving out pre-loaded accounts |
| `lowestOfficialPrice`, `lowestOfficialStore` | Cheapest offer from an official store |
| `highestPrice` | Most expensive offer in the list |
| `historicalLowPrice`, `historicalLowDate`, `historicalLowStore` | Lowest price the game reached and when (search results) |
| `offersCount`, `storesCount` | Number of offers and of different stores |
| `priceByStore` | Object with the best price of each store, cheapest first |
| `offers` | Full list of offers, cheapest first (see below) |
| `imageUrl` | Cover image link |
| `url` | Allkeyshop page of the game |
| `sourceQuery` | The search term or link that produced the row |
| `scrapedAt` | UTC time of the run |
| `errorCode`, `error` | Empty on a game row. Filled on an error row |

Each item of `offers`:

| Field | Meaning |
|---|---|
| `store`, `officialStore`, `storeRating` | Store name, official or reseller, store rating from 0 to 5 |
| `price` | Price after the coupon |
| `priceBeforeCoupon` | Price before the coupon |
| `couponCode`, `couponDiscount` | Coupon code and discount, for example `14%` |
| `priceWithCard`, `priceWithPaypal` | Final price with the payment fees |
| `edition`, `region` | Edition and region of the offer |
| `delivery` | `key` or `account` |
| `activationPlatform` | Where the key activates, for example steam |
| `inStock` | Whether the offer is in stock |
| `url` | Buy link |

Games found by search also carry the release date and the historical low. Rows read from a pasted page leave those empty.

### Example output

Real row from a run with `"startUrls": ["https://www.allkeyshop.com/blog/en-us/buy-hades-cd-key-compare-prices/"]`. The `offers` list is cut to two offers here; the dataset keeps all of them.

```json
{
  "type": "game",
  "gameId": 26712,
  "game": "Hades",
  "platform": "PC",
  "gameType": null,
  "releaseDate": null,
  "currency": "USD",
  "lowestPrice": 0.85,
  "lowestPriceStore": "Kinguin",
  "lowestPriceEdition": "Standard",
  "lowestPriceRegion": "Steam Account",
  "lowestPriceUrl": "https://www.allkeyshop.com/redirection/offer/usd/1745554?locale=en&merchant=47",
  "lowestOfficialPrice": 24.99,
  "lowestOfficialStore": "Steam",
  "lowestKeyPrice": 13.65,
  "lowestKeyStore": "CJS CDKeys",
  "highestPrice": 62.35,
  "historicalLowPrice": null,
  "historicalLowDate": null,
  "historicalLowStore": null,
  "offersCount": 27,
  "storesCount": 11,
  "priceByStore": {
    "Kinguin": 0.85,
    "K4G": 0.97,
    "GAMIVO": 0.99,
    "G2A": 1.09,
    "GAMESEAL": 1.15
  },
  "offers": [
    {
      "store": "Kinguin",
      "officialStore": false,
      "storeRating": 3.78,
      "price": 0.85,
      "priceBeforeCoupon": 1.12,
      "couponCode": "AKSACC",
      "couponDiscount": "24%",
      "priceWithCard": 1.62,
      "priceWithPaypal": 1.54,
      "edition": "Standard",
      "region": "Steam Account",
      "delivery": "account",
      "activationPlatform": "steam",
      "inStock": true,
      "url": "https://www.allkeyshop.com/redirection/offer/usd/1745554?locale=en&merchant=47"
    },
    {
      "store": "K4G",
      "officialStore": false,
      "storeRating": 4.45,
      "price": 0.97,
      "priceBeforeCoupon": 1.13,
      "couponCode": "AKS14DEAL",
      "couponDiscount": "14%",
      "priceWithCard": 1.45,
      "priceWithPaypal": 1.48,
      "edition": "Standard",
      "region": "Steam Account",
      "delivery": "account",
      "activationPlatform": "steam",
      "inStock": true,
      "url": "https://www.allkeyshop.com/redirection/offer/usd/1745549?locale=en&merchant=324"
    }
  ],
  "imageUrl": "https://www.allkeyshop.com/blog/wp-content/uploads/Hades-8.jpg",
  "url": "https://www.allkeyshop.com/blog/en-us/buy-hades-cd-key-compare-prices/",
  "sourceQuery": "https://www.allkeyshop.com/blog/en-us/buy-hades-cd-key-compare-prices/",
  "scrapedAt": "2026-11-01T22:02:10Z",
  "errorCode": null,
  "error": null
}
```

### How it works

1. Each title in `searchQueries` runs as a search on Allkeyshop with your platform, price and sort settings, page after page.
2. For every game found, the Actor opens the game page and reads the full price table, one line for each store offer.
3. It adds the summary fields (lowest price, lowest key, lowest official, price by store), applies your filters and writes the row.
4. Games without any offer that matches your filters are skipped and not charged.

Prices are the public prices Allkeyshop shows at the moment of the run. They change during the day, so schedule the Actor if you follow a price.

### Errors

Error rows have `type` set to `error`, an `errorCode` and a readable `error`. They are never charged.

| `errorCode` | When |
|---|---|
| `INVALID_INPUT` | A value in the input is wrong, for example an unknown platform or currency |
| `INVALID_URL` | The link is not an Allkeyshop game page |
| `NOT_FOUND` | The game page does not exist |
| `NO_RESULTS` | The search returned nothing, or no offer matches your filters |
| `BLOCKED` | Allkeyshop did not answer after several attempts. Run again in a few minutes |

### Integrations, scheduling and AI agents

- **Schedules:** run the Actor every day or every hour from the **Schedules** tab to follow the price of the games on your list. Keep the same `startUrls` and compare `lowestPrice` between runs.
- **Export:** download the dataset as JSON, CSV, Excel, XML or HTML, or read it from the API at `https://api.apify.com/v2/datasets/<datasetId>/items`.
- **Make, n8n and Zapier:** use the Apify module to start a run and read the dataset. A typical flow sends a Discord or Telegram message when `lowestPrice` drops below your target.
- **Google Sheets:** use the Apify integration to append every run to a sheet and chart the price over time.
- **Webhooks:** call your own service when a run succeeds, for example to update a price database.
- **AI agents:** the Actor works as a tool in the Apify MCP server, so an assistant can ask for "the cheapest official-store price of Elden Ring on PlayStation 5" and read the answer from the dataset.

### FAQ

**Does it need a login or an Allkeyshop account?** No. It reads public prices only.

**Which price should I use as the cheapest?** `lowestPrice` includes pre-loaded account offers, which are often the cheapest. If you only want keys, use `lowestKeyPrice`, or set `keysOnly` to true so accounts never appear.

**What is the difference between `price` and `priceWithCard`?** `price` is the store price after its coupon. `priceWithCard` and `priceWithPaypal` add the fees of the payment method, as the site shows them at checkout.

**Why does one title return several rows?** The site lists a base game, its expansions, bundles and account editions as separate products. Use `platforms`, `maxPrice` and `maxItems` to cut the list.

**Why are some `historicalLow` fields empty?** They come with search results. A pasted game page has no historical low, and a few new games do not have one yet.

**Can I get prices in Brazilian reais?** Not directly: the site shows euro, dollar and pound. Convert the output with your own rate.

**Are the buy links affiliate links?** They are the links the site uses to send a buyer to the store. Use them as they are.

**How many games can I get in one run?** `maxItems` has no hard cap. A run with 1,000 games takes a few minutes. The Actor stops cleanly if the run time is almost over and keeps what it collected.

**What happens if the run restarts on the platform?** The Actor reads the games already in the dataset and does not deliver or charge them again.

### Limitations

- Prices are a snapshot of the moment of the run.
- A search term finds up to the games the site lists for it. Very broad terms return thousands of products, so set `maxItems`.
- Stock status and coupon codes depend on each store and can change in minutes.
- Only the currencies EUR, USD and GBP exist on the site.
- The Actor reads prices only. It does not buy, log in or create alerts.

### Changelog

- **1 Nov 2026 (v0.1):** first release. Search by title, platform and price range, game pages, three currencies, all store offers per game, lowest key and lowest official price.

# Actor input Schema

## `searchQueries` (type: `array`):

Game titles or keywords, one per line, for example hollow knight or cyberpunk 2077. Each line is one search. Leave empty when you paste game links below.

## `startUrls` (type: `array`):

Optional. Links to Allkeyshop game pages, for example https://www.allkeyshop.com/blog/buy-hades-cd-key-compare-prices/. The link decides the currency when it has /en-us/ (USD) or /en-gb/ (GBP) in it.

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

Keep only these platforms. Empty = all platforms.

## `currency` (type: `string`):

Currency of every price in the output.

## `minPrice` (type: `number`):

Keep only games whose lowest price is at least this value, in the chosen currency. Empty = no minimum.

## `maxPrice` (type: `number`):

Keep only games whose lowest price is at most this value, in the chosen currency. Useful for deal hunting. Empty = no maximum.

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

Order of the games in each search.

## `officialStoresOnly` (type: `boolean`):

Keep only offers from official stores (publisher stores and big platforms), not key resellers.

## `keysOnly` (type: `boolean`):

Drop offers that sell a pre-loaded account instead of a key.

## `inStockOnly` (type: `boolean`):

Keep only offers that are in stock.

## `maxOffersPerGame` (type: `integer`):

Cap the offers list of each game to the cheapest N. 0 or empty = all offers. The lowest price fields always use every offer.

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

Stop after this many games in total, counting all searches and links. You pay per game delivered.

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

Apify Proxy settings. The default works.

## Actor input object example

```json
{
  "searchQueries": [
    "hollow knight"
  ],
  "currency": "EUR",
  "sortBy": "popularity",
  "officialStoresOnly": false,
  "keysOnly": false,
  "inStockOnly": true,
  "maxOffersPerGame": 0,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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 = {
    "searchQueries": [
        "hollow knight"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/allkeyshop-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 = {
    "searchQueries": ["hollow knight"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "hollow knight"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/allkeyshop-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/allkeyshop-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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