# Kleinanzeigen.de Scraper (`haketa/kleinanzeigen-scraper`) Actor

Kleinanzeigen scraper & API (Germany classifieds): search listings by keyword and category and export title, price, description, location, seller, attributes, photos, date and URL. German marketplace and second-hand market data plus seller lead gen — fast, no login.

- **URL**: https://apify.com/haketa/kleinanzeigen-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Automation, Real estate, Lead generation
- **Features:** Limited permissions
- **Stats:** 22 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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.
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

## Kleinanzeigen.de Scraper — German Classifieds Data Extractor for Cars, Real Estate, Electronics & Marketplace Leads

> **Extract structured classified listings from [Kleinanzeigen.de](https://www.kleinanzeigen.de) — Germany's largest online marketplace (formerly eBay Kleinanzeigen) with 50M+ active ads.** Pull **normalized EUR prices, price types (`VB` / `Festpreis` / `Zu verschenken`), 5-digit German postal codes (`PLZ`), ISO posting dates, seller profiles (`Privat` vs. `Gewerblich`), vehicle specifications (`Kilometerstand`, `Erstzulassung`, `Kraftstoff`, `Leistung`), real estate metrics (`Wohnfläche`, `Zimmer`, `Kaltmiete`, `Nebenkosten`), view counts, and full photo galleries**. Built for DACH price intelligence, used-car arbitrage, rental market analytics, reseller sourcing, and commercial dealer lead generation.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-00C853?style=flat-square\&logo=apify)](https://apify.com/haketa/kleinanzeigen-scraper)
[![Market](https://img.shields.io/badge/Market-Germany%20%F0%9F%87%A9%F0%9F%87%AA%20\(50M%2B%20Ads\)-red?style=flat-square)]()
[![Deep Pagination](https://img.shields.io/badge/Scale-1%2C000%2B%20Listings%20Pagination-orange?style=flat-square)]()
[![Rich Specs](https://img.shields.io/badge/Schema-Autos%20%2B%20Immobilien%20%2B%20Sellers-blue?style=flat-square)]()
[![Data Formats](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel%20%7C%20API-purple?style=flat-square)]()

***

### ⚡ At a glance

| Capability | Details |
| --- | --- |
| **Target Platform** | [Kleinanzeigen.de](https://www.kleinanzeigen.de) (Germany's #1 classifieds platform, formerly eBay Kleinanzeigen) |
| **Input Modes** | Category dropdown · City dropdown (`Berlin`, `München`, `Hamburg`, etc.) · Search keyword · Custom `searchUrls` |
| **Core Data Extracted** | `listingId`, `title`, `price` (EUR), `priceType` (`VB`/`Festpreis`), `location`, `postalCode` (`PLZ`), `postedDate`, `imageUrl`, `listingUrl` |
| **Detail Enrichment (`scrapeDetails`)** | Full description, all gallery photos, `viewCount`, `sellerName`, `sellerType` (`Privat`/`Gewerblich`), `phone`, vehicle & property specs |
| **Category-Specific Schemas** | **Vehicles (`c216`):** `kilometerstand`, `erstzulassung`, `kraftstoff`, `getriebe`, `leistung`, `fahrzeugtyp`, `hubraum`<br>**Real Estate (`c195`/`c203`/`c208`):** `wohnflaeche`, `zimmer`, `kaltmiete`, `nebenkosten`, `etage`, `verfuegbarAb` |
| **Pagination & Scale** | Automatic `/seite:N` pagination (`maxPages: 0` = unlimited, governed by `maxListings` up to **1,000+ listings**) |
| **Deduplication** | Automatic cross-page deduplication by `listingId` (`data-adid`) — 0% duplicate records |
| **Export Formats** | JSON, JSONL, CSV, Excel (XLSX), XML, HTML Table, REST API, Webhooks |

***

### 🔎 Why scrape Kleinanzeigen.de?

With over **50 million active listings** and 35+ million monthly users, **Kleinanzeigen.de** is the pulse of the German consumer and small-business economy. It is the primary marketplace where Germans buy and sell used cars, rent apartments, trade smartphones and electronics, furnish homes, and advertise local services.

However, turning Kleinanzeigen into structured business data is challenging without a purpose-built extractor:

- **German formatting conventions:** Prices use dots as thousands separators and commas for decimals (`18.990,50 € VB`), while dates are written in relative German natural language (`Heute, 14:20`, `Gestern`, `vor 3 Tagen`, `28.04.2026`).
- **Postal codes embedded in strings:** The 5-digit German `Postleitzahl` (`PLZ`) is concatenated inside the location label (`80331 München`) and must be parsed cleanly for geo-analytics.
- **Category-specific attribute tables:** A used BMW in `Autos (c216)` exposes `Kilometerstand`, `Erstzulassung`, and `Kraftstoffart`, whereas a Berlin apartment in `Mietwohnungen (c203)` exposes `Wohnfläche`, `Zimmer`, `Kaltmiete`, and `Nebenkosten`.

This **Kleinanzeigen scraper** normalizes all of these signals automatically into a unified, flat JSON schema — allowing you to run fast list-level sweeps across thousands of ads or enable `scrapeDetails: true` for deep per-listing enrichment.

***

### ✨ Key features of this Kleinanzeigen data extractor

- 🗂️ **Zero-Code Dropdowns + Custom Search URLs:** Pick a category (`Cars`, `Apartments for rent`, `Houses for sale`, `Phones`, `Electronics`, `Home & garden`, `Fashion`, `Jobs`, etc.), select a German city (`Berlin`, `Hamburg`, `München`, `Köln`, `Frankfurt`, `Stuttgart`, `Düsseldorf`, `Leipzig`, etc.), and type an optional keyword — or paste any pre-filtered Kleinanzeigen URL into `searchUrls`.
- 🔓 **Unlocked 1,000+ Deep Pagination:** With `maxPages: 0` by default, the scraper walks `/seite:1`, `/seite:2`, `/seite:3`... automatically until `maxListings` is reached, scaling seamlessly to **1,000+ listings** across categories and cities.
- 💶 **German Price & Price-Type Normalization:** Converts `1.990 € VB` into numeric `price: 1990`, `currency: "EUR"`, and `priceType: "VB"` (`VB` negotiable, `Festpreis` fixed, or `Zu verschenken` free giveaway).
- 📅 **German Relative Date Parser:** Normalizes `"Heute"`, `"Gestern"`, `"vor 4 Tagen"`, and `"DD.MM.YYYY"` strings into standard ISO `YYYY-MM-DD` dates (`postedDate`).
- 🚗 **Complete Automotive Schema (`Autos`):** Extracts `kilometerstand` (even on search cards!), plus `erstzulassung`, `kraftstoff`, `getriebe`, `leistung`, `fahrzeugtyp`, and `hubraum` on detail pages.
- 🏢 **Complete Real Estate Schema (`Immobilien`):** Extracts `wohnflaeche` (`m²`), `zimmer` (room count), `kaltmiete` (base rent in EUR), `nebenkosten` (utilities in EUR), `etage` (floor), and `verfuegbarAb` (move-in date).
- 👤 **Seller & Commercial Dealer Signals:** Distinguishes `Privat` (private C2C seller) from `Gewerblich` (commercial dealer), extracts `sellerName`, `sellerMemberSince`, `viewCount`, and captures `phone` numbers published by commercial sellers.

***

### 🎯 High-value use cases & DACH market intelligence

#### 1. Used-Car Arbitrage & Automotive Dealer Intelligence

Monitor `s-autos/c216` across Germany or specific metros. Combine `price`, `kilometerstand`, `erstzulassung`, `kraftstoff`, and `getriebe` to spot underpriced vehicles within minutes of posting, benchmark dealer inventory, and build B2B lead lists of `Gewerblich` car dealerships.

#### 2. German Real Estate Rental & Purchase Comps

Track `s-wohnung-mieten/c203` and `s-haus-kaufen/c208` across Berlin, München, Hamburg, Frankfurt, and Köln. Compute live **Kaltmiete per m²** by 5-digit `postalCode` (`PLZ`) and monitor `nebenkosten` trends.

#### 3. E-Commerce Reselling, Recommerce & Flipping

Sweep high-demand consumer electronics (`iPhone`, `PlayStation 5`, `MacBook`, `Nintendo Switch`, `Rolex`, `Lego`) or `Zu verschenken` giveaways. Filter downstream on `priceType == "VB"` and `sellerType == "Privat"` to source high-margin second-hand inventory.

#### 4. Brand Protection, Grey-Market & Counterfeit Monitoring

Run automated keyword sweeps for luxury goods, power tools, and branded apparel. Use `sellerType`, `images`, `description`, and `scrapedAt` timestamps to audit unauthorized commercial sellers.

#### 5. Demand Velocity & View-Count Analytics

With `scrapeDetails: true`, every listing includes its live `viewCount`. Combine `viewCount` with `postedDate` to calculate views-per-day and identify the fastest-moving product categories in Germany.

***

### 📥 Input parameters

All input fields are optional. Running with empty filters automatically collects a balanced multi-category sample across Germany's top classified categories.

| Parameter | Type | Default / Prefill | Description |
| --- | --- | --- | --- |
| `category` | `string` | `""` (All categories) | Category preset from the dropdown (`s-autos/c216`, `s-immobilien/c195`, `s-wohnung-mieten/c203`, `s-haus-kaufen/c208`, `s-handy-telekommunikation/c173`, `s-multimedia-elektronik/c161`, `s-haus-garten/c80`, `s-mode-beauty/c153`, `s-jobs/c102`, etc.). |
| `location` | `string` | `""` (All of Germany) | German city from the dropdown (`berlin`, `hamburg`, `muenchen`, `koeln`, `frankfurt`, `stuttgart`, `duesseldorf`, `leipzig`, `dortmund`, `essen`, `bremen`, `dresden`, `hannover`, `nuernberg`, etc.). |
| `keyword` | `string` | `""` | Optional search keyword (e.g., `"bmw 320d"`, `"iphone 15"`, `"balkon"`). Works standalone or combined with `category` and `location`. |
| `locationCustom` | `string` | `""` | **Advanced:** Custom Kleinanzeigen city slug if not in the dropdown (e.g., `"regensburg"`, `"freiburg"`). |
| `searchUrls` | `array<string>` | `[]` | **Advanced:** Direct Kleinanzeigen search or category URLs (e.g., `"https://www.kleinanzeigen.de/s-autos/c216"`). Overrides `category`, `location`, and `keyword` when provided. |
| `scrapeDetails` | `boolean` | `false` | Open each listing's detail page to extract full description, complete image gallery, `viewCount`, seller profile (`Privat`/`Gewerblich`), `phone`, and full vehicle/property attribute tables. |
| `maxListings` | `integer` | Default `0` (Prefill `50`) | Maximum total listings to collect (`0` = unlimited). Set to `1000+` for deep multi-page extraction. |
| `maxPages` | `integer` | `0` | Maximum search result pages per task (~25 listings/page). `0` = unlimited (governed by `maxListings`). |
| `requestDelay` | `integer` | `2000` | Delay between requests in milliseconds (`0` to `15000`). |
| `proxyConfiguration` | `object` | `{ "useApifyProxy": false }` | Optional Apify Proxy configuration. Enable Apify Proxy for very large multi-thousand-listing runs. |

***

### 🛠️ Input recipes & examples

#### Recipe 1: Fast 1,000+ used-car search sweep (`Autos`)

Extract 1,000 used-car listings across Germany with price, location, postal code, and mileage (`kilometerstand`) directly from search cards:

```json
{
  "category": "s-autos/c216",
  "location": "",
  "scrapeDetails": false,
  "maxListings": 1000,
  "maxPages": 0,
  "requestDelay": 1500
}
```

#### Recipe 2: Deep vehicle specs & dealer enrichment in München

Pull BMW listings in Munich with full detail-page enrichment (`erstzulassung`, `kraftstoff`, `getriebe`, `leistung`, `sellerType`, `viewCount`):

```json
{
  "category": "s-autos/c216",
  "location": "muenchen",
  "keyword": "bmw 320d",
  "scrapeDetails": true,
  "maxListings": 150,
  "maxPages": 0
}
```

#### Recipe 3: Berlin apartment rentals (`Mietwohnungen`) with m² & Kaltmiete

Scrape Berlin rental apartments with full property attributes (`wohnflaeche`, `zimmer`, `kaltmiete`, `nebenkosten`, `etage`):

```json
{
  "category": "s-wohnung-mieten/c203",
  "location": "berlin",
  "scrapeDetails": true,
  "maxListings": 250,
  "maxPages": 0
}
```

***

### 📤 Output schema & field reference

Every record shares a consistent flat JSON structure so vehicles, apartments, electronics, and general classifieds can be stored in a single table.

#### 🏷️ Core Listing & Price Fields (Search Card + Detail)

| Field | Type | Coverage | Description |
| --- | --- | --- | --- |
| `listingId` | `string` | 🟢 High (100%) | Unique Kleinanzeigen ad ID (`data-adid`). |
| `title` | `string` | 🟢 High (100%) | Listing title as displayed on Kleinanzeigen. |
| `price` | `number` | 🟢 High (~92%) | Numeric price in EUR (parsed from German format `1.990,50 €` → `1990.5`). `null` on free giveaways or price-on-request ads. |
| `priceType` | `string` | 🟢 High (~80%) | `"VB"` (negotiable), `"Festpreis"` (fixed price), `"Zu verschenken"` (free), or `null`. |
| `currency` | `string` | 🟢 High (~92%) | `"EUR"` whenever a numeric `price` is present. |
| `category` | `string` | 🟢 High (~90%) | Category label from card tags or detail breadcrumbs. |
| `location` | `string` | 🟢 High (100%) | Postal code and city/district string (e.g., `"80331 München"`, `"10405 Berlin"`). |
| `postalCode` | `string` | 🟢 High (~99%) | Extracted 5-digit German postal code (`PLZ`, e.g., `"80331"`). |
| `postedDate` | `string` | 🟢 High (~95%) | Normalized ISO date (`YYYY-MM-DD`) parsed from `"Heute"`, `"Gestern"`, or `"DD.MM.YYYY"`. |
| `imageUrl` | `string` | 🟢 High (~96%) | Primary thumbnail/card image URL. |
| `listingUrl` | `string` | 🟢 High (100%) | Canonical URL to the listing on `kleinanzeigen.de`. |
| `scrapedAt` | `string` | 🟢 High (100%) | ISO-8601 UTC timestamp of extraction. |

#### 👤 Seller & Engagement Fields (`scrapeDetails: true`)

| Field | Type | Coverage (Detail Mode) | Description |
| --- | --- | --- | --- |
| `sellerName` | `string` | 🟢 High (~95%) | Seller display name or commercial dealership name. |
| `sellerType` | `string` | 🟢 High (~95%) | `"Privat"` (private individual) or `"Gewerblich"` (commercial business/dealer). |
| `sellerMemberSince` | `string` | 🟢 High (~90%) | Date the seller joined Kleinanzeigen (e.g., `"März 2017"`, `"12.05.2019"`). |
| `sellerRating` | `string` | 🟡 Conditional | Seller satisfaction badge when exposed on the profile block. |
| `description` | `string` | 🟢 High (~98%) | Full listing description text (up to 2,000 characters). |
| `images` | `array<string>` | 🟢 High (~96%) | Complete array of full-resolution gallery image URLs. |
| `viewCount` | `number` | 🟢 High (~99%) | Total ad view counter (`Aufrufe`). |
| `condition` | `string` | 🟡 Conditional | Item condition (`"Neu"`, `"Gebraucht"`, `"Defekt"`, `"Generalüberholt"`). |
| `phone` | `string` | 🟡 Conditional (`Gewerblich`) | Direct phone number when published by commercial (`Gewerblich`) sellers. |

#### 🚗 Automotive Fields (`s-autos/c216`)

| Field | Type | Coverage (Autos) | Description |
| --- | --- | --- | --- |
| `kilometerstand` | `number` | 🟢 High (~98% Card & Detail) | Vehicle mileage in kilometers (e.g., `112400`). Extracted on both search cards and detail pages! |
| `erstzulassung` | `string` | 🟢 High (~95% Detail) | First registration date (`EZ`, e.g., `"06/2018"`, `"Dezember 2019"`). |
| `kraftstoff` | `string` | 🟢 High (~95% Detail) | Fuel type (`"Benzin"`, `"Diesel"`, `"Elektro"`, `"Hybrid"`, `"LPG"`). |
| `getriebe` | `string` | 🟢 High (~95% Detail) | Transmission (`"Automatik"`, `"Manuell"`). |
| `leistung` | `string` | 🟢 High (~90% Detail) | Engine power output (e.g., `"190 PS"`). |
| `fahrzeugtyp` | `string` | 🟢 High (~90% Detail) | Body style (`"Kombi"`, `"Limousine"`, `"SUV/Geländewagen"`, `"Kleinwagen"`, `"Cabrio"`). |
| `hubraum` | `string` | 🟡 Conditional (Detail) | Engine displacement when provided by seller. |

#### 🏠 Real Estate Fields (`s-immobilien/c195`, `c203`, `c208`)

| Field | Type | Coverage (Immo Detail) | Description |
| --- | --- | --- | --- |
| `wohnflaeche` | `string` | 🟢 High (~95% Detail) | Living area in square meters (e.g., `"82 m²"`). |
| `zimmer` | `number` | 🟢 High (~95% Detail) | Total room count (e.g., `3`). |
| `kaltmiete` | `number` | 🟢 High (Rentals Detail) | Base monthly rent in EUR excluding utilities. |
| `nebenkosten` | `number` | 🟡 Conditional (Detail) | Monthly utility/service charges (`Nebenkosten`) in EUR. |
| `etage` | `string` | 🟡 Conditional (Detail) | Floor number (e.g., `"3"`, `"Erdgeschoss"`, `"Dachgeschoss"`). |
| `verfuegbarAb` | `string` | 🟡 Conditional (Detail) | Available move-in date (e.g., `"01.07.2026"`, `"sofort"`). |

***

### 📋 Sample JSON output

```json
{
  "listingId": "2123456789",
  "title": "BMW 320d Touring M-Sport Pano LED Navi",
  "price": 18990,
  "priceType": "VB",
  "currency": "EUR",
  "category": "Autos",
  "condition": "Gebraucht",
  "location": "80331 München",
  "postalCode": "80331",
  "postedDate": "2026-11-09",
  "sellerName": "Auto Bayern GmbH",
  "sellerType": "Gewerblich",
  "sellerMemberSince": "März 2017",
  "description": "BMW 320d Touring, M-Sportpaket, Panoramadach, LED-Scheinwerfer, Professional Navi, beheizbare Sitze, 1. Hand, scheckheftgepflegt...",
  "imageUrl": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/ab/abc123.jpg",
  "images": [
    "https://img.kleinanzeigen.de/api/v1/prod-ads/images/ab/abc123.jpg"
  ],
  "viewCount": 432,
  "phone": "+49891234567",
  "kilometerstand": 112400,
  "erstzulassung": "06/2018",
  "kraftstoff": "Diesel",
  "getriebe": "Automatik",
  "leistung": "190 PS",
  "fahrzeugtyp": "Kombi",
  "hubraum": "1995 ccm",
  "wohnflaeche": null,
  "zimmer": null,
  "kaltmiete": null,
  "nebenkosten": null,
  "etage": null,
  "verfuegbarAb": null,
  "listingUrl": "https://www.kleinanzeigen.de/s-anzeige/bmw-320d-touring/2123456789-216-5941",
  "scrapedAt": "2026-11-10T02:30:00.000Z"
}
```

***

### 🔁 Pagination, scale & performance

- **Automatic `/seite:N` Deep Pagination:** Each Kleinanzeigen search page returns ~25 listings. When `maxPages` is `0` (the default), the actor automatically walks `/seite:1`, `/seite:2`, `/seite:3`... until `totalSaved` reaches your `maxListings` target (including **1,000+ listings**) or the search results end.
- **Multi-Category & Multi-URL Scaling:** When running with multiple `searchUrls` or in multi-category discovery mode, the scraper processes each search sequentially and deduplicates every ad by `listingId`.
- **Speed Tip:** List-only mode (`scrapeDetails: false`) is **5–8× faster** than detail mode and already captures `title`, `price`, `priceType`, `location`, `postalCode`, `postedDate`, `imageUrl`, `listingUrl`, and `kilometerstand` (for cars). Enable `scrapeDetails: true` when you specifically need full descriptions, seller profiles, view counts, or full vehicle/apartment attribute tables.

***

### 💻 API & integration examples

#### Python (`apify-client`)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("haketa/kleinanzeigen-scraper").call(run_input={
    "category": "s-autos/c216",
    "location": "berlin",
    "keyword": "golf 8",
    "scrapeDetails": False,
    "maxListings": 500,
    "maxPages": 0,
})

for ad in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(ad["listingId"], ad["title"], ad["price"], ad["kilometerstand"], ad["postalCode"])
```

#### Node.js (`apify-client`)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/kleinanzeigen-scraper').call({
    searchUrls: ['https://www.kleinanzeigen.de/s-wohnung-mieten/muenchen/c203l6411'],
    scrapeDetails: true,
    maxListings: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Extracted ${items.length} Munich rental listings`);
```

***

### 🗺️ German categories & city slugs reference

#### Supported Category Dropdown Presets (`category`)

| Category Value | English Label | German Marketplace Section |
| --- | --- | --- |
| `""` | All categories | Nationwide or city-wide search across all 50M+ ads |
| `s-autos/c216` | Cars (`Autos`) | Used & dealer passenger cars (`kilometerstand`, `erstzulassung`, `kraftstoff`, `leistung`) |
| `s-auto-rad-boot/c210` | Vehicles: car, bike & boat | Full automotive, motorcycle, camper, boat & parts vertical |
| `s-immobilien/c195` | Real estate (all) | All residential and commercial real estate listings |
| `s-wohnung-mieten/c203` | Apartments for rent | Rental apartments (`wohnflaeche`, `zimmer`, `kaltmiete`, `nebenkosten`, `etage`) |
| `s-haus-kaufen/c208` | Houses for sale | Single-family and multi-family houses for sale |
| `s-handy-telekommunikation/c173` | Phones & telecom | Smartphones (iPhone, Samsung, Xiaomi), tablets & accessories |
| `s-multimedia-elektronik/c161` | Electronics & multimedia | Laptops, PCs, gaming consoles, cameras, TVs & audio gear |
| `s-haus-garten/c80` | Home & garden | Furniture, kitchen appliances, DIY tools & garden equipment |
| `s-mode-beauty/c153` | Fashion & beauty | Apparel, sneakers, watches, luxury handbags & cosmetics |
| `s-familie-kind-baby/c17` | Family, kids & baby | Strollers, children's clothing, nursery furniture & baby gear |
| `s-musik-filme-buecher/c73` | Music, films & books | Musical instruments, vinyl records, books & media |
| `s-spielzeug/c23` | Toys | Lego sets, board games, action figures & collectibles |
| `s-sport-camping/c230` | Sport & camping | Fitness gear, bicycles, outdoor & camping equipment |
| `s-haustiere/c130` | Pets | Pet supplies, accessories & animal listings |
| `s-eintrittskarten-tickets/c231` | Tickets & events | Concert, festival, theater & Bundesliga sports tickets |
| `s-zu-verschenken-tauschen/c272` | Free stuff / giveaways | `Zu verschenken` zero-cost pickup items & local swaps |
| `s-jobs/c102` | Jobs | Local full-time, part-time, mini-job & trade vacancies |

#### Major German City Presets (`location`)

| City Slug | German Metro | State (`Bundesland`) | Primary Market Signals |
| --- | --- | --- | --- |
| `berlin` | Berlin | Berlin | Largest listing volume in Germany, high-velocity apartment rentals & electronics |
| `muenchen` | München (Munich) | Bayern | Highest property & rental prices, premium used-car and luxury resale market |
| `hamburg` | Hamburg | Hamburg | Northern Germany hub for autos, apartments, furniture & maritime goods |
| `koeln` | Köln (Cologne) | Nordrhein-Westfalen | Dense Rhineland consumer marketplace & student rental market |
| `frankfurt` | Frankfurt am Main | Hessen | Financial hub, high-income electronics, automotive & expat housing |
| `stuttgart` | Stuttgart | Baden-Württemberg | Core automotive region (Mercedes-Benz / Porsche) with deep used-car inventory |
| `duesseldorf` | Düsseldorf | Nordrhein-Westfalen | Fashion, luxury goods, commercial dealers & Rhine-Ruhr real estate |
| `leipzig` / `dresden` | Leipzig / Dresden | Sachsen | Fast-growing Eastern German rental, residential investment & auto markets |
| `dortmund` / `essen` / `duisburg` / `bochum` | Ruhrgebiet Metros | Nordrhein-Westfalen | High-density C2C goods, used vehicles & affordable housing comps |
| `hannover` / `bremen` / `nuernberg` | Regional Capitals | NI / HB / BY | Major regional trade, logistics, automotive & residential hubs |

***

### 🔌 Workflow automation & BI integrations

1. **Automated Used-Car & Arbitrage Alerts (Make / Zapier / n8n):** Schedule the scraper to run every 30–60 minutes on your target category or `searchUrls`, filter new records where `price` is 15%+ below category median, and push instant notifications with `title`, `price`, `kilometerstand`, `postalCode`, and `listingUrl` to Slack or Telegram.
2. **Real Estate Rent-Index Dashboards (Power BI / Looker / Tableau):** Export `s-wohnung-mieten/c203` daily across German cities to compute median `kaltmiete` per `m²` (`wohnflaeche`) grouped by 5-digit `postalCode` (`PLZ`).
3. **CRM Dealer Enrichment (HubSpot / Pipedrive / Salesforce):** Run with `scrapeDetails: true` on commercial categories, filter for `sellerType == "Gewerblich"`, and sync `sellerName`, `phone`, `location`, and `postalCode` into your B2B sales pipeline.

***

### ⚠️ Known limitations

- **Private seller phone numbers:** Kleinanzeigen hides phone numbers for `Privat` (consumer) sellers behind its internal messaging relay; `phone` is populated only when a `Gewerblich` (commercial) seller publishes a direct `tel:` number on the ad.
- **Detail mode runtime:** Because `scrapeDetails: true` opens each listing's individual page in a browser context, keep `maxListings` moderate (`50`–`300`) when detail enrichment is enabled, or use `scrapeDetails: false` for fast 1,000+ listing sweeps.

***

### ❓ Frequently Asked Questions

#### How many listings can I scrape in a single run?

Set `maxListings: 1000` (or `0` for unlimited) and leave `maxPages: 0`. The scraper will paginate through result pages (`/seite:N`) until your target count is reached.

#### Can I use custom Kleinanzeigen filter URLs (price range, radius, seller type)?

Yes! Configure any filter directly on [kleinanzeigen.de](https://www.kleinanzeigen.de) (e.g., price range `preis:1000:5000`, commercial sellers `anbieter:gewerblich`, radius search), copy the browser URL, and paste it into `searchUrls`.

#### Why are vehicle or real-estate fields `null` when `scrapeDetails` is `false`?

Search result cards only display summary data (`title`, `price`, `location`, `postalCode`, `postedDate`, and `kilometerstand` for cars). Full attribute tables (`erstzulassung`, `kraftstoff`, `wohnflaeche`, `kaltmiete`, `sellerName`, `viewCount`) live on the detail page and populate when `scrapeDetails: true`.

***

### 🔗 Related scrapers

- [Marktplaats.nl Scraper (Netherlands)](https://apify.com/haketa/marktplaats-scraper) — Dutch classifieds marketplace data extractor.
- [OLX Poland Classifieds Scraper](https://apify.com/haketa/olx-poland-classifieds-scraper) — Poland's #1 classifieds platform.
- [Kijiji.ca Scraper (Canada)](https://apify.com/haketa/kijiji-scraper) — Canadian classifieds, autos, and real estate.
- [Chotot.com Scraper (Vietnam)](https://apify.com/haketa/chotot-scraper) — Vietnam's largest classifieds & property marketplace.
- [Immoweb.be Scraper (Belgium)](https://apify.com/haketa/immoweb-scraper) — Belgian real estate listings.

***

### 📋 Changelog

| Version | Date | Highlights |
| --- | --- | --- |
| **v1.2** | `2026-11` | **Unlocked 1,000+ deep pagination & faster prefill:** Changed `maxPages` default from `10` to `0` (unlimited, governed by `maxListings`), removed `EMPTY_RUN_ITEM_CAP` clamping when users request `maxListings > 100`, optimized default prefill to `maxListings: 50` for rapid execution, and added `maxItems`/`maxRecords` input alias support. |
| **v1.1** | `2026-11` | Updated search-card and detail-page selectors for Kleinanzeigen's latest markup, added hydration-aware detail waiting for `.addetailslist--detail`, and refined `zimmer` and vehicle attribute extraction. |
| **v1.0** | `2026-05` | Initial release with German price/date normalization, vehicle (`c216`) and real estate (`c195`/`c203`) schemas, and `searchUrls` support. |

# Changelog

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

# Actor input Schema

## `category` (type: `string`):

Pick a category to browse. Leave on 'All categories' to search everything (great with a keyword) or to get a mixed sample.

## `location` (type: `string`):

Limit results to a German city. Leave on 'All of Germany' for nationwide listings.

## `keyword` (type: `string`):

Type what you are looking for, e.g. 'iphone', 'bmw 320d', 'sofa'. Works on its own or together with a category and city. Leave empty to browse the whole category.

## `locationCustom` (type: `string`):

Only if your city is not in the list above. Enter its Kleinanzeigen URL slug, e.g. 'regensburg' or 'freiburg'. Overrides the City dropdown.

## `searchUrls` (type: `array`):

Optional. Paste full Kleinanzeigen search or category URLs to scrape them directly, e.g. 'https://www.kleinanzeigen.de/s-autos/c216'. When provided, the Category, City and Keyword above are ignored.

## `scrapeDetails` (type: `boolean`):

Open each listing for the full description, all photos, seller info, view count and category-specific fields (car km/year/fuel, apartment m²/rooms/rent). Slower but much richer data.

## `maxListings` (type: `integer`):

Maximum number of listings to collect. 0 = unlimited.

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

How many result pages to scrape per search (~25 listings per page). 0 = unlimited (governed by Max Listings).

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

Proxy settings for reliable collection. The default works out of the box; enable Apify Proxy for larger runs.

## `requestDelay` (type: `integer`):

Pause between requests in milliseconds. A small delay keeps collection smooth and polite.

## Actor input object example

```json
{
  "category": "",
  "location": "",
  "keyword": "",
  "locationCustom": "",
  "searchUrls": [],
  "scrapeDetails": false,
  "maxListings": 50,
  "maxPages": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "requestDelay": 2000
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open to view, filter and export all scraped results from this run (JSON, CSV, Excel).

# 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 = {
    "keyword": "",
    "locationCustom": "",
    "searchUrls": [],
    "scrapeDetails": false,
    "maxListings": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    },
    "requestDelay": 2000
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/kleinanzeigen-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 = {
    "keyword": "",
    "locationCustom": "",
    "searchUrls": [],
    "scrapeDetails": False,
    "maxListings": 50,
    "proxyConfiguration": { "useApifyProxy": False },
    "requestDelay": 2000,
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/kleinanzeigen-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 '{
  "keyword": "",
  "locationCustom": "",
  "searchUrls": [],
  "scrapeDetails": false,
  "maxListings": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "requestDelay": 2000
}' |
apify call haketa/kleinanzeigen-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/kleinanzeigen-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/Af6EbV1fy51G4q3a4/builds/GjHZqaT8gkPUGblJw/openapi.json
