# ATU Scraper — German Car Parts & Prices (`studio-amba/atu-de-scraper`) Actor

Scrape car parts, prices, brands, stock status and delivery info from atu.de, Germany's largest car-parts and service retailer. Search any keyword and export clean structured automotive-parts data.

- **URL**: https://apify.com/studio-amba/atu-de-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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?

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

## ATU Scraper — German Car Parts, Prices & Stock

Scrape car parts from atu.de, Germany's largest car-parts and service retailer: product names, brands, prices, part numbers, stock status, discounts, and delivery info by keyword search.

### What is ATU Scraper?

A.T.U (Auto-Teile-Unger) runs both a nationwide chain of car workshops and a large online parts catalogue covering engine oil, filters, spark plugs, wipers, tyres, batteries, and accessories. This actor takes any search keyword and returns the full listing-page data set for every matching product: current price (VAT included), the original pre-discount price and discount label when the item is on offer, brand, ATU's internal article number, stock status, delivery timing, and the product image.

- **Price monitoring** — Track ATU pricing and discount depth across oil, filter, wiper, and spark-plug categories
- **Catalog enrichment** — Pull brand, SKU, and image data to enrich a parts database or comparison listing
- **Competitive benchmarking** — Compare ATU against kfzteile24, Mister Auto, or Autodoc pricing for the same or equivalent parts
- **Assortment analysis** — See which brands (Liqui Moly, Castrol, Bosch, ...) ATU stocks per category
- **Deal tracking** — The original-price/discount fields make it easy to find current markdowns

### What data does ATU Scraper extract?

- **Product name** — The product title as listed (e.g. "Liqui Moly Nr. 1 Motorenöl 5W-30, 5 L")
- **Brand** — Parts manufacturer (Liqui Moly, Castrol, Bosch, ...)
- **Price** — Current selling price, VAT included (EUR)
- **Original price** — Pre-discount ("statt") price, when the item is on offer
- **Discount** — Discount label vs. the original price (e.g. "20% gespart")
- **Price per unit** — Unit price label as shown on the listing (e.g. "(8,00 €/l)")
- **SKU / Product ID** — ATU's internal article number ("Art Nr.", e.g. "LM3871")
- **Stock status** — Whether the product is currently available to order (nullable — never guessed as false)
- **Delivery info** — Delivery timing text as shown on the listing (e.g. "Lieferung in 2-4 Werktagen")
- **Image** — Main product image URL
- **Category** — The listing-page heading the product was found under
- **URL** — The canonical atu.de product page

### How to scrape ATU data

1. Enter a search keyword in `searchQuery` — any German car-part term works: "Ölfilter" (oil filter), "Zündkerze" (spark plug), "Scheibenwischer" (wiper blades), "Motoröl" (engine oil).
2. Set `maxResults`. The actor pages through the listing (24 products per page) until it reaches that count or runs out of matching products.
3. Provide a **Bright Data API key** (see "Anti-bot" below).
4. Run the actor. Results stream into the dataset and can be exported as JSON, CSV, Excel, or via the API.

#### Input

| Field | Type | Description |
|-------|------|--------------|
| `searchQuery` | String | Car-part search term (default: `Ölfilter`) |
| `maxResults` | Integer | Maximum number of products to return (default: 100) |
| `brightDataApiKey` | String (secret) | Bright Data Web Unlocker API key — see Anti-bot section |
| `proxyConfiguration` | Object | Apify proxy settings (kept for compatibility — see Anti-bot section) |

#### Example input

```json
{
    "searchQuery": "Zündkerze",
    "maxResults": 100
}
```

#### Output fields

| Field | Type | Example |
|-------|------|---------|
| `name` | String | "Zündkerze 4FR78 x , 1 Stück" |
| `brand` | String | "Bosch" |
| `price` | Number | 8.99 |
| `currency` | String | "EUR" |
| `originalPrice` | Number | null | 49.99 |
| `pricePerUnit` | String | "pro Stück" |
| `discount` | String | "20% gespart" |
| `sku` | String | "BO0910" |
| `productId` | String | "BO0910" |
| `inStock` | Boolean | null | true |
| `deliveryInfo` | String | "Lieferung in 2-4 Werktagen" |
| `imageUrl` | String | image URL |
| `category` | String | "Zündkerze" |
| `url` | String | product page URL |
| `scrapedAt` | String | ISO timestamp |

### Example output

```json
{
    "name": "Zündkerze 4FR78 x , 1 Stück",
    "brand": "Bosch",
    "price": 8.99,
    "currency": "EUR",
    "pricePerUnit": "pro Stück",
    "sku": "BO0910",
    "productId": "BO0910",
    "inStock": true,
    "deliveryInfo": "Lieferung in 2-4 Werktagen",
    "imageUrl": "https://www.atu.de/extern/gfx/artikel/BO0_/BO0910_M.jpg",
    "category": "Zündkerze",
    "url": "https://www.atu.de/produkt/zuendkerze-4fr78-x-1-stueck-bo0910",
    "scrapedAt": "2026-08-27T09:20:03.270Z"
}
```

### Anti-bot: why a Bright Data key is required

atu.de sits behind a real DataDome wall — a plain request to the homepage returns HTTP 403 with `x-datadome: protected`, and Apify's own datacenter/residential proxies get the same challenge. This actor routes every page fetch through Bright Data's Web Unlocker zone (`web_unlocker1`), which solves the challenge server-side and returns the real page. You need a Bright Data account and a Web Unlocker API key (get one at [brightdata.com](https://brightdata.com)) — provide it via the `brightDataApiKey` input field or the `BRIGHT_DATA_API_KEY` environment variable. The `proxyConfiguration` input is kept for compatibility with the standard Apify actor shape but has no effect on scraping — Bright Data handles the anti-bot layer, not Apify's proxy.

### How many results per run?

The listing page returns exactly 24 products per page, and each page is a single Bright Data request. A 100-product run needs about 5 requests; a 1,000-product run needs about 42. There is no per-product detail-page fetch — every field above comes straight off the listing page, so run time and cost scale with page count, not product count.

### Cost estimate

This actor charges Apify's standard platform fee (based on run duration/memory) plus Bright Data Web Unlocker usage (~$0.0015 per request). Because one request returns 24 results, Bright Data's cost is a small fraction of the per-result price — a 100-result run makes ~5 Bright Data requests (~$0.0075), and a 1,000-result run makes ~42 (~$0.063). Your run's usage cost only settles once the run reports **SUCCEEDED** — reading the dataset mid-run understates what you'll actually be charged.

### A note on search terms

Not every keyword routes to the parts catalogue. A few brake- and battery-related terms ("Bremsbeläge", "Bremsscheiben", "Batterie") redirect to ATU's vehicle-selector workshop-service booking flow instead — ATU sells these as an installed service, not just a part, and the site's own search prioritizes that flow for those specific terms. If a search returns 0 results, try a more specific part name (e.g. "Bremsscheibe hinten" instead of "Bremsbeläge") or a different category term like "Ölfilter", "Zündkerze", "Scheibenwischer", or "Motoröl" — all confirmed working during build.

### Limitations

- **Germany only.** atu.de has no other country storefronts.
- **No ratings.** ATU's customer-rating widget is rendered client-side by a third-party JS widget and is not present in the server-rendered HTML this actor reads.
- **Brake/battery search terms can redirect to a service page.** See "A note on search terms" above.
- **24 products per page.** This is a fixed server-side page size — the actor compensates by paginating automatically.

### Related Scrapers

- [kfzteile24 Scraper](https://apify.com/jelle.desramaults/kfzteile24-scraper) — Car parts, prices, and stock from Germany's other major independent parts retailer
- [Mister Auto Scraper](https://apify.com/jelle.desramaults/mister-auto-scraper) — Car parts and prices from the pan-European Mister Auto storefront
- [Oscaro Scraper](https://apify.com/jelle.desramaults/oscaro-scraper) — Car parts from the French Oscaro storefront

### FAQ

**Do I need an ATU account or cookies?**
No. Everything comes from public listing pages, fetched through Bright Data Web Unlocker.

**Do I need my own Bright Data account?**
Yes — atu.de's DataDome protection requires a Bright Data Web Unlocker API key. See the Anti-bot section above.

**Can I search by part number instead of keyword?**
Yes — ATU's search resolves manufacturer and internal part numbers the same way it resolves keywords; put the part number in `searchQuery`.

**Why do some categories return fewer results than requested?**
`maxResults` is capped by how many matching products the site actually has for that search term — the actor stops once it runs out, it never fabricates data.

**Is scraping atu.de legal?**
This actor extracts publicly available listing-page data (prices, part numbers, stock status). You are responsible for how you use the data; check the terms that apply to your use case.

# Actor input Schema

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

Search atu.de for parts by keyword, in German (e.g. 'Ölfilter', 'Zündkerze', 'Scheibenwischer', 'Motoröl'). Each listing page returns 24 products; the scraper paginates until it reaches Max Results. Note: a few brake/battery-related terms redirect to ATU's workshop-service booking flow instead of the parts catalog — if a search returns 0 results, try a more specific part name.

## `maxResults` (type: `integer`):

Maximum number of products to return.

## `brightDataApiKey` (type: `string`):

Your Bright Data API key for the Web Unlocker zone (web\_unlocker1). Required to bypass atu.de's DataDome anti-bot protection. Get one at https://brightdata.com. Can also be provided via the BRIGHT\_DATA\_API\_KEY environment variable.

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

Proxy settings. Kept for compatibility — page fetching is handled by Bright Data Web Unlocker, so this does not affect scraping.

## Actor input object example

```json
{
  "searchQuery": "Ölfilter",
  "maxResults": 20,
  "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 = {
    "searchQuery": "Ölfilter",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/atu-de-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 = {
    "searchQuery": "Ölfilter",
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/atu-de-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 '{
  "searchQuery": "Ölfilter",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/atu-de-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/atu-de-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/CGE7VL3FcuQgaGvhG/builds/m1DjaNhaC49GxDdLG/openapi.json
