# Kleinanzeigen Scraper - Listings, Real Estate, Cars & Sellers (`topapi/kleinanzeigen-scraper`) Actor

Scrape kleinanzeigen.de listings by keyword, category, location, price and filters, or from search, listing and seller URLs: price, location, date, seller, photos. Add-ons: listing details with real-estate and car fields, seller profiles, price stats. Monitor new listings. $0.33 per 1,000 listings.

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

## Pricing

from $0.33 / 1,000 listings

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

### What does Kleinanzeigen Scraper do?

**Kleinanzeigen Scraper** extracts listings from kleinanzeigen.de (formerly eBay Kleinanzeigen), Germany's largest classifieds site, in all 160 categories: real estate (Immobilien), cars and motorbikes, jobs, electronics, furniture, fashion and everything else. Search by keyword, category, location, radius, price and the site's own filters, paste any kleinanzeigen.de search URL, or give listing ids, seller ids and PRO shops. One row per listing: price and price type, old price, zip code and district, posting date, seller and shop, top-ad flags, buy-now, shipping, attribute chips and photos.

Kleinanzeigen scraper · Kleinanzeigen API alternative · eBay Kleinanzeigen scraper · Immobilien and Autos export

- **Every category, every filter:** keyword, category, location (city, zip code, state) + radius, price range, private / commercial seller, offers / wanted ads, buy-now, shipping, sort order; real-estate rooms and area; car make, model, first registration, mileage, power, fuel and gearbox; any other category filter the site has. Or paste a search URL with your filters already set.
- **Typed columns per vertical** with Listing details on: real estate (cold / warm rent, ancillary and heating costs, deposit, house money, purchase price, living area, rooms, plot, floor, year built, house / flat type, balcony, garden, garage, lift ...), vehicles (make, model, first registration, mileage, PS, fuel, gearbox, inspection date, emission class, colour, equipment) and jobs (type, hours, experience, hourly wage), plus the site's raw machine attributes next to the German labels.
- **Sellers and PRO shops:** every listing of a seller or shop, and one seller-profile row per seller with rating, badges, reply time, followers, listings online and in total, and for PRO shops the phone, address, opening hours and website shown on the shop page.
- **Past the 1,250-result window:** kleinanzeigen.de shows at most 50 pages per search; Deep scan splits a big search by the site's own location list, then by price bands (3,000 sofa listings in one run, measured).
- **Price statistics per search:** min, quartiles, median, average and max price, negotiable / reduced / shipping / commercial shares and top locations.
- **Monitor mode:** scheduled runs return only new listings (and price drops if you want), with webhook, Slack, Discord or Telegram alerts.
- **No login, cookies or API key.** Pay only for delivered rows: no start fee.

### What data can you get from Kleinanzeigen?

<table>
<tr><td>🏷️ Title, URL, listing id</td><td>💶 Price, price type (VB, fixed, free)</td><td>📉 Old price, price reduced</td></tr>
<tr><td>📍 Zip code, district, location line</td><td>🗓️ Posted date and time</td><td>🗂️ Category id, location id</td></tr>
<tr><td>👤 Seller id, private / commercial</td><td>🏪 PRO shop name, link, company logo</td><td>⭐ Top ad, highlight, priority flags</td></tr>
<tr><td>🛒 Buy now, shipping</td><td>🏷️ Attribute chips ("438 m²", "EZ 12/2014")</td><td>📷 Photos and photo count</td></tr>
<tr><td>📝 Full description (details)</td><td>📋 All attributes + raw attributes (details)</td><td>🌍 GPS, street, state (details)</td></tr>
<tr><td>👁️ Views, status: active / reserved / sold (details)</td><td>🏠 Rent, costs, area, rooms, year (details)</td><td>🚗 Make, model, mileage, PS, fuel (details)</td></tr>
<tr><td>📜 Legal notice with e-mail, phone, website (details)</td><td>☎️ PRO shop phone, address, hours (seller profiles)</td><td>📊 Median / quartile prices (price summary)</td></tr>
</table>

### How to scrape Kleinanzeigen

1. Type keywords in **Search keywords** (for example `iphone 15`), or pick a **Category** and a **Location**, or paste kleinanzeigen.de URLs.
2. Narrow it with the **Filters** (price, seller type, radius, rooms, car make ...) or paste a search URL that already has them.
3. Set **Max listings**, switch on any add-on you need, and press **Start**.
4. Download the dataset as JSON, CSV or Excel, or connect it to your tools.

### ⬇️ Input

| Input | What it does |
|---|---|
| `searchQueries` | Keywords, one per line (kleinanzeigen.de URLs also work here). Each keyword is searched with the filters below. |
| `startUrls` | kleinanzeigen.de search / category pages with their filters, listing pages (`/s-anzeige/...`), seller pages (`/s-bestandsliste.html?userId=...`) and PRO shops (`/pro/...`). |
| `listingIds` | Anzeigen-IDs or listing URLs: each returns the full listing page (details included, one listing charge). |
| `sellerIds` | Seller user ids, seller page URLs or PRO shop names: every listing they have online. |
| `urlsFromFile` | Many URLs at once, one per line, or a link to a .txt / .csv file. |
| `category` | One of the site's 160 categories (id or name). Empty = all. |
| `location`, `zipCodes`, `radius` | City, district, zip code or state (matched with the site's own location list), several zip codes, and the radius (1-200 km). |
| `minPrice`, `maxPrice` | Price range in euros. |
| `sellerType` | `all`, `private`, `commercial`. |
| `adType` | `all`, `offered` (Angebote), `wanted` (Gesuche). |
| `buyNowOnly`, `shipping` | Only "Direkt kaufen" listings; shipping possible or pickup only. |
| `sorting` | `newest`, `price_asc`, `price_desc`, `distance`, `relevance`. |
| `minRooms`, `maxRooms`, `minArea`, `maxArea` | Real-estate filters (the category's own `zimmer_d` / `qm_d` filters). Without a category, Mietwohnungen is searched. |
| `carMake`, `carModel`, `minYear`, `maxYear`, `minMileage`, `maxMileage`, `minPowerPs`, `maxPowerPs`, `fuel`, `transmission` | Vehicle filters. Without a category, Autos is searched. |
| `filters` | Any other category filter as the site names it, e.g. `{"versand_s": "ja"}`, `{"autos.schaden_s": "f"}`. |
| `includeKeywords`, `excludeKeywords` | Keep / drop listings by words in the title or description. |
| `postedWithinHours`, `postedAfter` | Only recent listings; a newest-first search stops at the first older page. |
| `includeTopAds`, `onlyPriceReduced`, `photosOnly` | Drop paid top ads, keep only price-reduced listings, drop listings without a photo. |
| `includeDetails` | Add-on: open each listing page (full description, attributes, GPS, views, status, seller, legal notice, typed columns). |
| `includeSellerDetails` | Add-on: one seller-profile row per unique seller. |
| `priceSummary` | Add-on: one price-statistics row per search. |
| `monitorMode`, `monitorStoreName`, `alertOnPriceDrop`, `minPriceDropPct`, `skipFirstRun`, `resetMonitor` | Only listings not delivered by earlier runs; optional price drops. |
| `webhookUrl`, `webhookHeaders`, `slackWebhookUrl`, `discordWebhookUrl`, `telegramToken` + `telegramChatId`, `notificationLimit` | Alerts with the new listings after each run. |
| `maxResults`, `maxResultsPerSearch`, `maxListingsPerSeller` | Caps (0 = no limit). |
| `deepScan` | Read past the 1,250-listing window. |
| `compact` | Core fields only (for AI agents, sheets, MCP). |
| `proxyConfiguration`, `maxConcurrency` | Not needed; see Limits. |

#### Input JSON

```json
{
    "category": "208",
    "location": "Hamburg",
    "radius": "30",
    "maxResults": 100,
    "includeDetails": true,
    "includeSellerDetails": true,
    "priceSummary": true
}
```

#### Paste a kleinanzeigen.de link to reuse the filters you set on the site

Set every filter on kleinanzeigen.de in your browser, copy the address (for example `https://www.kleinanzeigen.de/s-wohnung-mieten/berlin/c203l3331r10+wohnung_mieten.zimmer_d:2,3`) and paste it into `startUrls`. The actor reads it with its own filters; page numbers in the link are ignored and every page is read.

#### More than 1,250 listings from one search

kleinanzeigen.de shows at most 50 pages of 25 listings per search. With **Deep scan** on, a bigger search is split by the site's own location list (states, then cities, then districts) and, where that does not help, by price bands, until every slice fits. Measured: "sofa" (204,923 results) → 3,976 listings from 186 pages; "schrank" → 2,000 listings in 76 s. Listings without a price drop out of a price-band slice, as on the website.

### ⬆️ Output

A listing from a search ("fahrrad", prefill run):

```json
{
    "record_type": "listing",
    "id": 3554625768,
    "url": "https://www.kleinanzeigen.de/s-anzeige/scott-damen-fahrrad-in-sehr-gutem-zustand/3554625768-217-8019",
    "title": "Scott Damen Fahrrad in sehr gutem Zustand",
    "description": "Ich verkaufe hier mein gepflegtes Damen-Fahrrad der Marke Scott, das sich in einem sehr guten...",
    "price": 30,
    "price_text": "30 €",
    "price_type": "FIXED",
    "price_currency": "EUR",
    "original_price": null,
    "price_reduced": false,
    "zip_code": "74842",
    "city": "Billigheim",
    "location": "Baden-Württemberg - Billigheim",
    "posted_at": "2026-10-28T10:51:00+01:00",
    "posted_date": "2026-10-28",
    "posted_text": "Heute, 10:51",
    "category_id": 217,
    "location_id": 8019,
    "seller_id": "71088613",
    "poster_type": "PRIVATE",
    "is_top_ad": false,
    "buy_now": false,
    "tags": [],
    "image_url": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/61/61573469-5302-4a94-a62f-f2ec746f3b28?rule=$_59.AUTO",
    "image_count": 3,
    "search_query": "\"fahrrad\"",
    "position": 3,
    "details_fetched": false
}
```

The same row with **Listing details** on (a house for sale in Hamburg, excerpt):

```json
{
    "id": 3477133875,
    "title": "Lukratives MFH mit Zusatzpotenzial in Hamburg",
    "price": 995000,
    "price_type": "FIXED",
    "zip_code": "22143",
    "city": "Hamburg Rahlstedt",
    "region": "Hamburg",
    "latitude": 53.5974121536285,
    "longitude": 10.158718835781924,
    "views": 1400,
    "status": "active",
    "category": "Häuser zum Kauf",
    "vertical": "real_estate",
    "property_type": "buy_house",
    "purchase_price": 995000,
    "size": 298.75,
    "rooms": 14,
    "lot_area": 658,
    "year_constructed": 1979,
    "house_type_label": "Mehrfamilienhaus",
    "provision": true,
    "balcony": true,
    "garage": true,
    "seller_name": "KAPVEST Real Estate GmbH",
    "seller_account_type": "Gewerblicher Anbieter",
    "seller_since": "27.07.2021",
    "seller_followers": 168,
    "store_url": "https://www.kleinanzeigen.de/pro/kapvest",
    "imprint_emails": ["info@kapvest.de"],
    "imprint_phones": ["0171 2687041"],
    "posted_via": "openimmo",
    "image_count": 40,
    "details_fetched": true
}
```

A seller-profile row (**Seller profiles** on):

```json
{
    "record_type": "seller",
    "seller_id": "86985015",
    "seller_name": "KAPVEST Real Estate GmbH",
    "poster_type": "COMMERCIAL",
    "seller_since": "27.07.2021",
    "seller_followers": 168,
    "seller_online_listings": 38,
    "seller_total_listings": 669,
    "is_pro_shop": true,
    "store_phone": "0991 27098638",
    "store_address": "Hafenstraße 26\n94469 Deggendorf - Einkind",
    "store_opening_hours": ["Mo - Do: 09:00 - 18:00", "Fr: 09:00 - 14:00"],
    "store_website": "http://www.kapvest.de"
}
```

A price-summary row (**Price summary** on): `listings_analysed` 100, `total_results_on_site` 5,737, `min_price` 180,000, `median_price` 718,900, `avg_price` 939,262.9, `max_price` 9,149,000, `commercial_share_pct` 95, `top_locations` \[{"name": "Hamburg Schnelsen", "count": 8}, ...].

#### Fields and how often they are filled

Measured on real runs (513 search-result rows from 19 searches across 12 categories; 100 house listings with details and 41 sellers from the Hamburg run above):

| Field | Filled |
|---|---|
| `id`, `url`, `title`, `zip_code`, `city`, `posted_date`, `category_id`, `location_id`, `seller_id`, `poster_type` | 100% |
| `price` | 84% (the rest are "VB" without a number, free items or jobs; `price_type` still says so) |
| `image_url` | 96% |
| `store_name` (commercial sellers with a shop) | 37% |
| details: `description`, `attributes`, `attributes_raw`, `images`, `latitude`, `longitude`, `views`, `category_path`, `seller_name`, `seller_since`, `posted_via` | 100% |
| details on houses for sale: `purchase_price` 99%, `size` 100%, `rooms` 95%, `lot_area` 96%, `house_type` 97%, `year_constructed` 31% | as the sellers fill them |
| details: `imprint` (commercial sellers' legal notice) | 95% of these house listings |
| seller profiles: `seller_followers` 100%, `seller_online_listings` 95%, `store_address` 71%, `store_phone` 59%, `store_website` 59% | |

Empty means the listing or seller does not show it: the actor writes null, never a made-up value.

### How much does it cost to scrape Kleinanzeigen?

Pay per event, no start fee:

| Event | Price | When |
|---|---|---|
| Listing | **$0.00033** ($0.33 per 1,000) | every listing row delivered |
| Listing details | $0.00033 | each listing page read with Listing details on (a listing URL / id input includes its page in the listing price) |
| Seller profile | $0.0018 | each unique seller with Seller profiles on |
| Price summary | $0.009 | each search with Price summary on |

Listings removed by a filter, duplicates and listings delivered by earlier monitor runs are never charged. Measured runs: 20 listings $0.0066; 1,000 listings $0.33; 100 houses with details + 41 seller profiles + 1 price summary $0.149. Set a maximum charge per run in Apify and the run stops cleanly when it is reached.

### Run it on a schedule

Turn on **Only new listings (monitor)** and save the input as a task, then add an Apify schedule (for example every hour). Each run returns only listings that no earlier run delivered for the same search; a run with nothing new reads one page, writes nothing and charges nothing (measured: 1.7 s). Add a webhook, Slack, Discord or Telegram target to get the new listings pushed to you. `alertOnPriceDrop` also returns listings whose price went down (`change_type: "price_drop"`, `previous_price`). A listing an earlier run delivered without Listing details is delivered once more with them when a later run turns Listing details on (`change_type: "details"`).

### Integrations, API & MCP

Run it from the Apify API, any Apify client (Python, JavaScript), Make, Zapier, n8n, Google Sheets, or as a tool for AI agents through the Apify MCP server. `compact: true` returns the core fields only. Example (Python):

```python
from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("TopApi/kleinanzeigen-scraper").call(run_input={"searchQueries": ["iphone 15"], "location": "Berlin", "radius": "20", "maxResults": 200})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["price"], item["title"], item["url"])
```

### Limits & empty runs

- 1,250 listings per search without Deep scan (the site's own 50-page limit).
- Phone numbers that the site only shows after a login or behind the call button are not read; PRO shop phones and the contacts in a commercial seller's legal notice are, because the page shows them.
- Listing details, views and the posted time: the site shows a date (and a time only for today / yesterday in search results).
- The actor reads kleinanzeigen.de directly and moves to Apify datacenter proxies (a fresh IP when one is blocked), then residential proxies on its own. Listing pages are not read over residential proxies; when only those answer, rows ship without details and the details are not charged (the status message says so).
- A search that matches nothing ends SUCCEEDED with a message saying what to change; nothing is charged.

### FAQ

#### How many listings can Kleinanzeigen Scraper collect in one run?

As many as you set in Max listings: 1,250 per search, and past that with Deep scan (3,976 listings in one measured run).

#### Which categories are supported?

All 160 of the site's own categories, from Mietwohnungen and Häuser zum Kauf to Autos, Jobs, Smartphones and Verschenken.

#### Can I get only new listings?

Yes: monitor mode returns only listings not delivered before, optionally with price drops and alerts.

#### Does it return the full description, all photos and the views?

With Listing details on: the full description, every photo, all attributes, GPS, the view count (read without adding a view) and the listing's status.

#### Can I scrape a seller's or a PRO shop's whole inventory?

Yes: put the seller id, the seller page URL or the PRO shop name into Sellers.

#### Does it return real-estate and car fields as columns?

Yes, with Listing details on: rent, costs, area, rooms, year built and amenities for real estate; make, model, first registration, mileage, power, fuel and equipment for vehicles; job type, hours and wage for jobs.

#### Do I need a Kleinanzeigen account, cookies or an API key?

No.

#### Can I use it with the Apify API or an MCP server?

Yes, see Integrations.

#### Why did my run return no listings?

The status message says why: a search with no results, filters that removed every listing (with the counts per filter), a location the site does not know, or nothing new since the last monitor run.

#### Your feedback

Missing a field or a filter? Open an issue on the actor page and it gets looked at.

# Actor input Schema

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

What you would type in the kleinanzeigen.de search box, one per line, e.g. "iphone 15", "e-bike", "3 zimmer wohnung". Leave empty to browse a category or location.

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

Search or category pages copied from your browser with every filter set (kleinanzeigen.de/s-wohnung-mieten/berlin/c203l3331), listing pages (/s-anzeige/...), seller pages (/s-bestandsliste.html?userId=...) and PRO shops (/pro/...).

## `listingIds` (type: `array`):

Anzeigen-IDs or listing URLs, one per line, e.g. 3549201628. Each returns the full listing page (details included, one listing charge).

## `sellerIds` (type: `array`):

Seller user ids (e.g. 81106945), seller page URLs or PRO shop names / URLs (e.g. Verbeek-Immobilien): every listing the seller has online.

## `urlsFromFile` (type: `string`):

Many URLs at once: paste them one per line, or one link to a .txt / .csv file that lists them.

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

Search inside one category (all 160 of the site's own). Empty = all categories.

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

City, district, zip code or state, e.g. "Berlin", "80331", "Bayern" (matched with the site's own location list). Empty = all of Germany.

## `zipCodes` (type: `array`):

Search each zip code separately (with the radius below), e.g. 10115, 20095. Used together with Location when both are set.

## `radius` (type: `string`):

Distance around the location or zip code. Needs a location.

## `minPrice` (type: `integer`):

Lowest price in euros. As on the website, listings without a price drop out once a price limit is set.

## `maxPrice` (type: `integer`):

Highest price in euros.

## `sellerType` (type: `string`):

Private sellers (privat) or commercial sellers (gewerblich).

## `adType` (type: `string`):

kleinanzeigen.de shows offers and wanted ads together; pick one to narrow it.

## `buyNowOnly` (type: `boolean`):

Only listings with "Direkt kaufen" (buy now with buyer protection).

## `shipping` (type: `string`):

Whether the seller ships (Versand möglich) or only offers pickup.

## `sorting` (type: `string`):

Order the listings are collected in. Monitor mode and the posted-within filter always read newest first.

## `minRooms` (type: `number`):

Real estate: fewest rooms (Zimmer), e.g. 2. Without a category, Mietwohnungen is searched.

## `maxRooms` (type: `number`):

Real estate: most rooms.

## `minArea` (type: `integer`):

Real estate: smallest living / plot area in m², e.g. 50.

## `maxArea` (type: `integer`):

Real estate: largest area in m².

## `carMake` (type: `string`):

Cars / motorbikes: make as on the site, e.g. "BMW", "Mercedes Benz", "Volkswagen". Without a category, Autos is searched.

## `carModel` (type: `string`):

Cars: model, e.g. "Golf", "A4" (needs a make).

## `minYear` (type: `integer`):

Cars / motorbikes: earliest first-registration year (Erstzulassung), e.g. 2015.

## `maxYear` (type: `integer`):

Cars / motorbikes: latest first-registration year.

## `minMileage` (type: `integer`):

Cars / motorbikes: lowest mileage.

## `maxMileage` (type: `integer`):

Cars / motorbikes: highest mileage, e.g. 100000.

## `minPowerPs` (type: `integer`):

Cars / motorbikes: lowest power in PS.

## `maxPowerPs` (type: `integer`):

Cars / motorbikes: highest power in PS.

## `fuel` (type: `string`):

Cars: fuel type.

## `transmission` (type: `string`):

Cars / motorbikes: transmission.

## `filters` (type: `object`):

Any other filter of the chosen category, as the site names it in its URLs, e.g. {"zimmer_d": "2,3", "versand_s": "ja", "autos.schaden_s": "f"}. Names without a prefix get the category's own.

## `includeKeywords` (type: `array`):

Keep only listings whose title or description contains at least one of these words, e.g. "ovp", "garantie".

## `excludeKeywords` (type: `array`):

Drop listings whose title or description contains any of these words, e.g. "defekt", "tausch".

## `postedWithinHours` (type: `integer`):

Only listings posted in the last N hours, e.g. 24. The search stops at the first older page, so daily runs stay small and cheap.

## `postedAfter` (type: `string`):

Only listings posted on or after this date (YYYY-MM-DD).

## `includeTopAds` (type: `boolean`):

Paid top ads appear above the results on every page. Off = organic listings only.

## `onlyPriceReduced` (type: `boolean`):

Only listings whose seller lowered the price (a crossed-out old price is shown).

## `photosOnly` (type: `boolean`):

Drop listings without a photo.

## `includeDetails` (type: `boolean`):

Opens each listing page: full description, all attributes, GPS + street, views, status, seller name / since / rating, imprint, plus typed real-estate, vehicle and job columns. $0.00033 per listing extra.

## `includeSellerDetails` (type: `boolean`):

One extra row per unique seller: rating, badges, reply time, followers, listings online / total and, for PRO shops, phone, address, opening hours, website. $0.0018 per seller.

## `priceSummary` (type: `boolean`):

One statistics row per search: min / p25 / median / average / p75 / max price, negotiable, reduced, shipping and commercial shares, top locations. $0.009 per search.

## `monitorMode` (type: `boolean`):

Remembers delivered listings per search in a named key-value store and returns only new ones (newest first; a poll with nothing new reads one page and charges nothing). Pairs with a schedule.

## `monitorStoreName` (type: `string`):

Named key-value store that keeps what was delivered. Use one name per schedule.

## `alertOnPriceDrop` (type: `boolean`):

Monitor mode: also return a listing seen before when its price went down (change_type = price_drop, previous_price).

## `minPriceDropPct` (type: `number`):

Only report a price drop of at least this many percent.

## `skipFirstRun` (type: `boolean`):

The first monitor run only remembers the current listings (nothing delivered or charged); later runs return what is new.

## `resetMonitor` (type: `boolean`):

Forget what earlier runs delivered for these searches.

## `webhookUrl` (type: `string`):

POST the run's new listings (JSON) to this URL after the run.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook, e.g. {"Authorization": "Bearer ..."}.

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL for a message with the new listings.

## `discordWebhookUrl` (type: `string`):

Discord webhook URL for a message with the new listings.

## `telegramToken` (type: `string`):

Telegram bot token (with the chat id below).

## `telegramChatId` (type: `string`):

Chat or user id the bot writes to (send /start to your bot first).

## `notificationLimit` (type: `integer`):

How many listings an alert message lists (the count is always included).

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

Listings delivered in the whole run (0 = no limit). kleinanzeigen.de shows at most 1,250 per search (50 pages); turn on Deep scan for more.

## `maxResultsPerSearch` (type: `integer`):

Cap per keyword / URL / location when the run has several (empty = no per-search cap).

## `maxListingsPerSeller` (type: `integer`):

Cap per seller or PRO shop (empty = all their listings).

## `deepScan` (type: `boolean`):

kleinanzeigen.de shows at most 1,250 listings per search. On = a bigger search is split by the site's own location list (states, cities, districts), then by price bands, until every slice fits.

## `compact` (type: `boolean`):

Core fields only (id, url, title, price, location, date, seller, image) - smaller rows for AI agents, sheets and MCP.

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

Not needed: the actor reads kleinanzeigen.de directly and moves to Apify datacenter, then residential proxies on its own when a route is refused. Set a proxy here to force one.

## `maxConcurrency` (type: `integer`):

Pages read at the same time per search.

## Actor input object example

```json
{
  "searchQueries": [
    "fahrrad"
  ],
  "category": "",
  "radius": "",
  "sellerType": "all",
  "adType": "all",
  "buyNowOnly": false,
  "shipping": "all",
  "sorting": "newest",
  "fuel": "",
  "transmission": "",
  "includeTopAds": true,
  "onlyPriceReduced": false,
  "photosOnly": false,
  "includeDetails": false,
  "includeSellerDetails": false,
  "priceSummary": false,
  "monitorMode": false,
  "monitorStoreName": "kleinanzeigen-monitor",
  "alertOnPriceDrop": false,
  "minPriceDropPct": 0,
  "skipFirstRun": false,
  "resetMonitor": false,
  "notificationLimit": 10,
  "maxResults": 20,
  "deepScan": false,
  "compact": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 8
}
```

# Actor output Schema

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

One item per kleinanzeigen.de listing, plus seller-profile and price-summary rows when those add-ons are on (record_type tells them apart).

## `summary` (type: `string`):

Per-search counts (read, delivered, filtered, duplicates, seen before), egress route, requests and charges.

# 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": [
        "fahrrad"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/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 = {
    "searchQueries": ["fahrrad"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("topapi/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 '{
  "searchQueries": [
    "fahrrad"
  ],
  "maxResults": 20
}' |
apify call topapi/kleinanzeigen-scraper --silent --output-dataset

```

## MCP server setup

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