# Geizhals Scraper: Product Prices & Shop Offers (`polderdata/geizhals-prices-scraper`) Actor

Scrape Geizhals.de, .at and .eu price comparison: products from any category or filter with lowest price, offer count, availability, rating and specs, plus optional shop-by-shop offers. Export to CSV, JSON or Excel.

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

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Geizhals Scraper: Product Prices & Shop Offers

Scrape the **Geizhals price comparison** (geizhals.de, geizhals.at, geizhals.eu) for any **category and filter**: every product with its **lowest price, number of offers, availability, user rating, part number (MPN) and key specs** — and optionally **every shop offer** (shop, price, stock/delivery, shop rating, price timestamp). Track prices of graphics cards, SSDs, notebooks, TVs, smartphones and thousands of other categories. Export to **CSV, JSON or Excel**, or use the data via **API**.

*Geizhals Preise scrapen: Bestpreis, Angebote, Verfügbarkeit und Händler als Excel/CSV.*

> Unofficial tool. Not affiliated with, endorsed by or sponsored by Geizhals / Preisvergleich Internet Services AG. It collects only public price-comparison data: products and shops (businesses). No user reviews, no reviewer names, no personal data.

### What data you get

One row per product.

| Field | Example | Description |
|---|---|---|
| `productId`, `name`, `url` | `3382344`, `ASUS ROG Astral GeForce RTX 5090 OC…`, `https://geizhals.de/…-a3382344.html` | Product |
| `mpn` | `90YV0LW0-M0NA00` | Manufacturer part number |
| `site`, `country`, `categoryId` | `geizhals.de`, `DE`, `gra16_512` | Where it was found |
| `lowestPrice`, `currency` | `6790`, `EUR` | Lowest current price |
| `offerCount` | `19` | Number of shop offers |
| `availability` | `in_stock` | `in_stock`, `available_soon` or `unavailable` |
| `rating`, `ratingCount` | `4.79`, `14` | User rating (0–5) and number of ratings |
| `specs` | `{"Speicher": "32GB GDDR7", …}` | Key specs from the category list (site language) |
| `variantsUrl`, `imageUrl` | | All variants of the product; product image |
| `offers` | see below | Only with **Include shop offers** (or product URLs), otherwise `null` |
| `sourceUrl`, `scrapedAt` | | Your start URL and scrape time (UTC) |

Each offer: `merchantName`, `merchantCountry`, `price`, `currency`, `availability` (delivery/stock text), `merchantRating`, `merchantRatingCount`, `merchantInfoUrl`, `priceUpdatedAt`.

### How to use

1. Open [geizhals.de](https://geizhals.de) (or .at / .eu), go to a **category** and set the filters you want (brand, chip, size…). Copy the URL, e.g. `https://geizhals.de/?cat=gra16_512` (graphics cards) or `https://geizhals.de/?cat=gra16_512&xf=9816_03+05+20+-+RTX+5090` (RTX 5090 only).
2. Paste one or more URLs into **Category or product URLs**, set **Maximum number of results**, and switch on **Include shop offers** if you want every shop's price.
3. Click **Start** and download the results as CSV, Excel or JSON, or fetch them via the API.

Example input:

```json
{
    "startUrls": [
        { "url": "https://geizhals.de/?cat=gra16_512&xf=9816_03+05+20+-+RTX+5090" },
        { "url": "https://geizhals.at/?cat=nb" }
    ],
    "maxItems": 1000,
    "includeOffers": false
}
```

You can also paste **product pages** (`https://geizhals.de/…-a1234567.html`) to monitor specific products; they always include the shop offers.

### Pricing

- **Products:** $1.50 per 1,000 products ($0.0015 each). A whole category of 1,000 products costs $1.50.
- **Shop offers (optional add-on):** +$3.00 per 1,000 products ($0.003 each) when **Include shop offers** is on or for product URLs, because every product page is an extra request. 100 products with all their offers cost $0.45.
- Plus Apify's tiny per-run start fee. You never pay more than the **Maximum cost per run** you set in the run options; the Actor stops before fetching offers it can't charge.

Residential proxies (Geizhals blocks datacenter IPs) are included in the price. On the Apify Free plan a run returns at most 100 products.

### Example output

```json
[
  {
    "productId": "3382344",
    "name": "ASUS ROG Astral GeForce RTX 5090 OC, ROG-ASTRAL-RTX5090-O32G-GAMING, 32GB GDDR7, 2x HDMI, 3x DP",
    "url": "https://geizhals.de/asus-rog-astral-geforce-rtx-5090-oc-a3382344.html",
    "mpn": "90YV0LW0-M0NA00",
    "site": "geizhals.de",
    "country": "DE",
    "categoryId": "gra16_512",
    "lowestPrice": 6790,
    "currency": "EUR",
    "offerCount": 6,
    "availability": "in_stock",
    "rating": 4.79,
    "ratingCount": 14,
    "specs": {
      "Modell": "NVIDIA GeForce RTX 5090",
      "Speicher": "32GB GDDR7",
      "Kühlung": "4x Axial-Lüfter",
      "Gesamthöhe": "Quad Slot (3.8 Slots)",
      "Besonderheiten": "Backplate, Dual-BIOS Switch, 0dB-Zero-Fan-Modus"
    },
    "variantsUrl": "https://geizhals.de/asus-geforce-rtx-5090-v186805.html",
    "imageUrl": "https://gzhls.at/pix/d0/79/d079864b4da79627-m.webp",
    "offers": null,
    "sourceUrl": "https://geizhals.de/?cat=gra16_512&xf=9816_03+05+20+-+RTX+5090",
    "scrapedAt": "2026-10-18T14:24:42.447Z"
  },
  {
    "productId": "3430251",
    "name": "ASUS Prime Radeon RX 9070 XT OC, PRIME-RX9070XT-O16G, 16GB GDDR6, HDMI, 3x DP",
    "url": "https://geizhals.de/asus-prime-radeon-rx-9070-xt-oc-a3430251.html",
    "mpn": "90YV0L71-M0NA00",
    "site": "geizhals.de",
    "country": "DE",
    "categoryId": "gra16_512",
    "lowestPrice": 869.97,
    "currency": "EUR",
    "offerCount": 34,
    "availability": "in_stock",
    "rating": 4.66,
    "ratingCount": 50,
    "specs": {
      "Modell": "AMD Radeon RX 9070 XT",
      "Speicher": "16GB GDDR6",
      "Kühlung": "3x Axial-Lüfter (92mm)",
      "Gesamthöhe": "Triple Slot (2.5 Slots)",
      "Besonderheiten": "Backplate, Dual-BIOS Switch, 0dB-Zero-Fan-Modus"
    },
    "variantsUrl": "https://geizhals.de/asus-radeon-rx-9070-xt-v191864.html",
    "imageUrl": "https://gzhls.at/pix/c1/71/c1711435e81ab3c7-m.webp",
    "offers": null,
    "sourceUrl": "https://geizhals.de/?cat=gra16_512&xf=9816_03+05+20+-+RTX+5090",
    "scrapedAt": "2026-10-18T14:24:42.447Z"
  },
  {
    "productId": "3430118",
    "name": "ASRock Radeon RX 9070 Challenger 16GB, RX9070 CL 16G, 16GB GDDR6, HDMI, 3x DP",
    "url": "https://geizhals.de/asrock-radeon-rx-9070-challenger-16gb-a3430118.html",
    "mpn": "90-GA5NZZ-00UANF",
    "site": "geizhals.de",
    "country": "DE",
    "categoryId": "gra16_512",
    "lowestPrice": 664.66,
    "currency": "EUR",
    "offerCount": 20,
    "availability": "in_stock",
    "rating": 4.67,
    "ratingCount": 3,
    "specs": {
      "Modell": "AMD Radeon RX 9070",
      "Speicher": "16GB GDDR6",
      "Kühlung": "3x Axial-Lüfter (90mm)",
      "Gesamthöhe": "Triple Slot (2.9 Slots)",
      "Besonderheiten": "Backplate, 0dB-Zero-Fan-Modus"
    },
    "variantsUrl": "https://geizhals.de/asrock-radeon-rx-9070-v191857.html",
    "imageUrl": "https://gzhls.at/pix/7e/8a/7e8af3560048bc5d-m.webp",
    "offers": null,
    "sourceUrl": "https://geizhals.de/?cat=gra16_512&xf=9816_03+05+20+-+RTX+5090",
    "scrapedAt": "2026-10-18T14:24:42.447Z"
  },
  {
    "productId": "3674212",
    "name": "Netac NV7000-t 2TB, M.2 2280 / M-Key / PCIe 4.0 x4",
    "url": "https://geizhals.eu/netac-nv7000-t-2tb-a3674212.html",
    "mpn": null,
    "site": "geizhals.eu",
    "country": "EU",
    "categoryId": "hdssd",
    "lowestPrice": 240,
    "currency": "EUR",
    "offerCount": 2,
    "availability": "in_stock",
    "rating": null,
    "ratingCount": null,
    "specs": {
      "Kapazität": "2000GB",
      "Formfaktor": "M.2 2280",
      "Schnittstelle": "M.2/M-Key (PCIe 4.0 x4)",
      "Lesen": "7300MB/s",
      "Schreiben": "6700MB/s",
      "TBW": "1200TB"
    },
    "variantsUrl": "https://geizhals.eu/netac-nv7000-t-v222178.html",
    "imageUrl": "https://gzhls.at/pix/eb/ea/ebeaf2588159799f-m.webp",
    "offers": [
      {
        "merchantName": "so-computertechnik",
        "merchantCountry": "DE",
        "price": 240,
        "currency": "EUR",
        "availability": "Lieferzeit 2-7 Werktage",
        "merchantRating": null,
        "merchantRatingCount": null,
        "merchantInfoUrl": "https://geizhals.eu/merchants/so-computertechnik-07-eb-de",
        "priceUpdatedAt": "2026-10-12T22:41:29+0200"
      },
      {
        "merchantName": "Netac Official Store",
        "merchantCountry": "UK",
        "price": 244.32,
        "currency": "EUR",
        "availability": "In stock",
        "merchantRating": null,
        "merchantRatingCount": null,
        "merchantInfoUrl": "https://geizhals.eu/merchants/a22s87ymrwr0xz-am-uk",
        "priceUpdatedAt": "2026-10-16T15:13:39+0200"
      }
    ],
    "sourceUrl": "https://geizhals.eu/?cat=hdssd",
    "scrapedAt": "2026-10-18T14:26:01.581Z"
  }
]
```

### Use cases

- **Price monitoring:** schedule a daily run on your product categories and follow lowest prices, offer counts and availability over time.
- **Retailers and distributors:** see every competitor's price and stock for the products you sell (with shop offers).
- **Market research:** build datasets of all products in a category with specs, ratings and prices (e.g. GPUs by chip, SSDs by capacity).
- **Deal alerts:** detect price drops and products coming back in stock.
- **Procurement:** find the cheapest in-stock shop for a list of part numbers.

### Integrations

- **API:** start runs and download results with the [Apify API](https://docs.apify.com/api/v2) or the Apify JavaScript/Python clients.
- **Scheduling:** run daily or hourly with Apify Schedules.
- **Webhooks:** get notified when a run finishes.
- **Google Sheets, Make, Zapier, n8n:** send results to your tools via Apify integrations.
- **AI agents (MCP):** let Claude, ChatGPT or any MCP client check prices through the [Apify MCP server](https://mcp.apify.com).

### Limits and FAQ

**Is it legal?** The Actor reads only public category and product pages at a polite rate and follows Geizhals' robots.txt: keyword searches (`?fs=`), sorted URLs and some filters (`sort`, price-limit, location, price history) are not crawled — use category URLs with the site's filters instead. Shop click-out links are never followed. No personal data is collected. You are responsible for using the data in line with Geizhals' terms and applicable law.

**Can I search by keyword?** No — Geizhals' robots.txt disallows search pages. Open the category on the site, use its filters (brand, model, chip…) and copy that URL.

**Why residential proxies?** Geizhals blocks datacenter IPs; the Actor automatically uses an Apify residential IP in the site's country (AT for geizhals.at, DE for .de/.eu).

**How fast is it?** About 750 products per minute without offers (915 products in 73 s in testing). With shop offers it is about 20 products per minute (30 in 99 s in testing), because each product page is a separate, polite request.

**Something broke?** Open an issue on the Issues tab with your input and it will be looked at promptly.

### Changelog / maintained

Last verified working: 2026-10-18 (geizhals.de, geizhals.at, geizhals.eu). See the changelog tab for changes.

# Changelog

This Actor's version history is a separate document: https://apify.com/polderdata/geizhals-prices-scraper/changelog.md

# Actor input Schema

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

Category pages from geizhals.de, geizhals.at or geizhals.eu, with any filters you set on the site, e.g. https://geizhals.de/?cat=gra16_512 (graphics cards) or https://geizhals.de/?cat=gra16_512\&xf=9816_03+05+20+-+RTX+5090. All result pages are followed. Product pages (…-a1234567.html) are also accepted and always include the shop offers. Keyword searches (?fs=…) and sorted URLs are not allowed by Geizhals' robots.txt.

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

The run stops after this many products (30 per category page). You pay per product, so this also caps the cost of a run.

## `includeOffers` (type: `boolean`):

Also open each product page and add every shop offer (shop, country, price, availability, shop rating, price timestamp) in the offers field. One extra request per product, so runs are slower; the price per result is the same.

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

Geizhals blocks datacenter IPs, so the Actor uses Apify residential proxies by default and picks an IP in each site's country (AT for geizhals.at, DE for geizhals.de/.eu). Keep the default unless you know what you are doing.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://geizhals.de/?cat=gra16_512"
    }
  ],
  "maxItems": 30,
  "includeOffers": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "startUrls": [
        {
            "url": "https://geizhals.de/?cat=gra16_512"
        }
    ],
    "maxItems": 30,
    "includeOffers": false,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("polderdata/geizhals-prices-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 = {
    "startUrls": [{ "url": "https://geizhals.de/?cat=gra16_512" }],
    "maxItems": 30,
    "includeOffers": False,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("polderdata/geizhals-prices-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 '{
  "startUrls": [
    {
      "url": "https://geizhals.de/?cat=gra16_512"
    }
  ],
  "maxItems": 30,
  "includeOffers": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call polderdata/geizhals-prices-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,polderdata/geizhals-prices-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/hiRJlHfvruyNOrEPZ/builds/NsW2PQHguTVfWlwsq/openapi.json
