# Kleinanzeigen Scraper: Past the 1,250 Limit (`luzivanlt/kleinanzeigen-listings-scraper`) Actor

Every ad of a Kleinanzeigen search, past the 1,250 the site shows, checked against its count. $1.50 per 1,000 ads. Prices, places, sellers; ad pages optional.

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

## Pricing

from $1.05 / 1,000 ads

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 Scraper: Past the 1,250 Limit

Get every ad of a Kleinanzeigen search, not just the 1,250 the site shows
you: by search words, or from any results link with your own place, radius,
category and filters. The run's last message checks the ads saved against
Kleinanzeigen's own count for each search. No Kleinanzeigen account, login or
cookies needed.

Tested daily. Latest check: Hamburg's road bikes, 3,669 of the 3,669 ads the
site counted, in 8.5 minutes.

### What does this Actor do?

You give it search words (searched across Germany) or links to Kleinanzeigen
results pages. For each search it saves one row per ad, until it has every ad
Kleinanzeigen counts for that search or reaches your limit.

Kleinanzeigen's own site stops at 50 pages of 25 ads (1,250) for any search.
This Actor keeps going: a bigger search is read place by place (and by price
where needed), so a whole city or category comes back in one run, and its
final message says, per search, whether it got all of Kleinanzeigen's count
("3,669 of 3,669").

Each row comes with:

- the ad id, the ad's link, its title and the start of its description
- the price, the price as shown, whether it is fixed, negotiable (VB) or free
  (zu verschenken), and an earlier price when the seller cut it
- the date (and time, for ads from today and yesterday), the ZIP code, the
  town or district and the region
- the seller's id, private or business, a PRO badge, the shop's link and tag
  line
- shipping, direct buy, wanted ads, the ad's tags (mileage and first
  registration for cars, living area and rooms for flats, read out into their
  own fields)
- every picture of the card, top ad, highlight and priority flags, videos and
  virtual tours
- the search it came from and Kleinanzeigen's count for the search

With **Include ad pages** on, each row also gets the ad's own page: the full
description, every detail the seller filled in (mileage, rooms, condition,
rent with utilities…), the equipment list, the street and map point, the
category path, all pictures, documents, and the seller's name, member-since
date, ads online, badges and rating, plus a business seller's phone number
and legal notice.

### Why use it?

- **Every ad, not 1,250.** A search with more ads than the site shows is read
  to its end; the run tells you for each search how many of the count it
  saved.
- **Any search**, from search words or a results link with your filters
  (place and radius, category, price, private or business, offers or wanted).
- **Ad pages when you want them**, with the seller's phone and legal notice for
  businesses.
- **$1.50 per 1,000 ads**, ad pages included, and nothing per search.

### How to use it

1. Type search words under **Search words**, or paste Kleinanzeigen results
   links under **Search links**.
2. Set **Max ads per search** (1,000 by default). To get a whole search, set
   it above the number Kleinanzeigen shows for it.
3. Turn on **Include ad pages** if you need the full ads.
4. Start the run, then download the ads as JSON, CSV or Excel.

Run it with no input to see a sample: up to 100 ads for "rennrad carbon",
charged as usual.

### Input

| Field              | What it is                                                        |
| ------------------ | ----------------------------------------------------------------- |
| `searchQueries`    | Search words, one search per line, across Germany                 |
| `startUrls`        | Kleinanzeigen results links with your place, category and filters |
| `minPrice`         | Lowest price in euros, for the search words                       |
| `maxPrice`         | Highest price in euros, for the search words                      |
| `sellerType`       | `all` (default), `private` or `commercial`, for the search words  |
| `offerType`        | `all` (default), `offered` or `wanted`, for the search words      |
| `maxAdsPerSearch`  | 1 to 50,000, default 1,000                                        |
| `includeAdDetails` | `true` to read each ad's own page too (default `false`)           |

Example:

```json
{
  "startUrls": ["https://www.kleinanzeigen.de/s-muenchen/rennrad/k0l6411"],
  "searchQueries": ["e-bike"],
  "maxPrice": 2000,
  "sellerType": "private",
  "maxAdsPerSearch": 5000,
  "includeAdDetails": false
}
```

A link to a single ad or to a seller's page, or a link to another site, is
refused before the run starts, with the link named.

### Output

One row per ad. Fields the site does not show for an ad are `null` or an
empty list.

| Field                                                                                                                             | What it is                                                             |
| --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| `ad_id`, `url`, `title`, `description_snippet`                                                                                    | The ad                                                                 |
| `price`, `price_text`, `price_type`, `original_price`, `original_price_text`, `currency`                                          | The price in euros, as shown, `fixed`/`negotiable`/`give_away`, a cut  |
| `date`, `posted_at`, `date_text`                                                                                                  | The ad's date, with the time for today's and yesterday's ads           |
| `zip`, `region`, `locality`, `location_text`, `location_id`, `category_id`                                                        | Where it is, and its category                                          |
| `distance_km`, `exact_distance_km`, `availability_radius_km`                                                                      | Distance from the searched place, for searches with a place            |
| `seller_id`, `seller_type`, `seller_badge`, `has_shop`, `shop_url`, `shop_tagline`                                                | The seller                                                             |
| `shipping`, `shipping_possible`, `buy_now`, `is_wanted`                                                                           | Shipping, direct buy, and whether it is a wanted ad                    |
| `tags`, `mileage_km`, `first_registration`, `living_area_m2`, `rooms`                                                             | The card's tags, and the car and flat facts read out of them           |
| `image_url`, `images`, `has_image`, `has_videos`, `has_virtual_tour`                                                              | Pictures and media                                                     |
| `is_top_ad`, `is_highlighted`, `is_priority_ad`, `promotions`, `is_new_construction_unit`, `is_new_construction_project`          | The ad's paid features and new-build flags                             |
| `search_url`, `search_total`                                                                                                      | The search the row came from and Kleinanzeigen's count for it          |
| `details_read`, `page_layout`                                                                                                     | With ad pages: whether the ad's page was read (`false`: taken down)    |
| `description`, `details`, `equipment`                                                                                             | With ad pages: the full text, every detail by name, the equipment list |
| `street`, `state`, `location_path`, `latitude`, `longitude`                                                                       | With ad pages: the address and map point                               |
| `posted_date`, `ad_type`, `category`, `category_path`, `category_ids`, `attribute_codes`                                          | With ad pages: created on, offer or wanted, the category path          |
| `image_count`, `videos`, `documents`                                                                                              | With ad pages: all pictures, videos and documents                      |
| `offer_possible`, `secure_payment`, `buyer_fee_eur`, `financing_eligible`                                                         | With ad pages, where shown: offers, secure payment, financing          |
| `seller_name`, `seller_kind`, `seller_active_since`, `seller_ads_online`, `seller_badges`, `seller_rating`, `seller_rating_count` | With ad pages: the seller's profile                                    |
| `seller_phone`, `seller_imprint`, `shop_name`                                                                                     | With ad pages: a business seller's phone, legal notice and shop name   |
| `is_expired`, `is_paused`                                                                                                         | With ad pages, where shown: the ad's status                            |

Sellers' names, phone numbers and addresses are personal data: check that
your use is allowed where you are (in the EU, the GDPR applies).

### How much does it cost?

No surcharges and no paid options; an item that fails is not charged.

This Actor is priced per ad saved:

- **$1.50 per 1,000 ads** ($0.0015 an ad), with or without ad pages. Each ad
  is charged once per run.
- No start fee, and nothing per search.

So 1,000 ads cost $1.50. If you set a maximum cost for a run, the Actor stops
when it reaches it and keeps every ad saved so far.

### How long does a run take?

About two and a half minutes per 1,000 ads (3,669 in 8.5 minutes in a test).
With ad pages, about 4 minutes per 50 ads (97 in 7 minutes in a test). For
more than about 5,000 ads, or a few hundred with ad pages, raise the run's
timeout under **Run options** before you start.

### Good to know

- **Kleinanzeigen's count.** The final message compares the ads saved with
  the site's count for each search. The count moves while a big search is
  read, as ads come and go.
- **Ads with no price at all.** When a search over 1,250 ads can't be split
  by place (the site's place list doesn't cover it), it is split by price,
  and an ad with no price at all (only "VB", or free to give away) can then
  be missed: 51 of 4,994 (1%) in a test.
- **An ad in two of your searches** is saved once, under the first search
  that reached it. Two searches that overlap (a nationwide search and a city
  link for the same words) may read the overlap only once, so the second
  one's count check can read short.
- **Dates.** "Today" and "yesterday" on the site are turned into dates from
  the run's start, in German time; a run that crosses midnight dates its
  later ads one day early.
- **Order.** A search under 1,250 ads comes back in the site's order; a larger
  one comes back place by place.
- **Ad pages.** A taken-down ad keeps the row from the results page, marked
  `details_read: false`. The site sometimes refuses an ad page several times
  in a row; such an ad is not saved (3 of 100 in a test, all cars). Views are
  not read.
- **Germany only**, as Kleinanzeigen.

### More Actors from us

- [Airbnb Scraper: Every Stay, Past the 15-Page Limit](https://apify.com/luzivanlt/airbnb-listings-scraper): Every stay of an Airbnb search, past the 15 pages Airbnb shows, checked against its count.
- [Alibaba Products Scraper: Price Tiers & Suppliers](https://apify.com/luzivanlt/alibaba-products-scraper): Alibaba.com products by keyword or link, with price tiers in US dollars on every row.
- [AliExpress Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/aliexpress-products-scraper): Every product of an AliExpress search to its last page, with exact sold counts and ratings.
- [Amazon Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/amazon-products-scraper): Every product on Amazon's search pages to the last page, sponsored marked, with monthly sales.
- [App Store Reviews Scraper: All Reviews, Not 500](https://apify.com/luzivanlt/app-store-reviews-scraper): Every written App Store review of an app, not just the newest 500.
- [Woolworths Coles ALDI Scraper: AU Grocery Prices](https://apify.com/luzivanlt/au-supermarkets-scraper): Woolworths, Coles and ALDI products for any search in one run, every results page to the end.

### Use it from an AI agent or the API

One call starts a run and returns its items (Apify waits up to 300 seconds; for a
longer run, start it with `POST /v2/acts/…/runs` and read its dataset):

```text
POST https://api.apify.com/v2/acts/luzivanlt~kleinanzeigen-listings-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>
```

With the sample input as its JSON body:

```json
{
  "searchQueries": ["rennrad carbon"],
  "sellerType": "all",
  "offerType": "all",
  "maxAdsPerSearch": 100,
  "includeAdDetails": false
}
```

Its inputs, in the order of the input form:

| Input                                  | What it takes                                                                                                                                                                                                                                                   | Default |
| -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
| `searchQueries` (Search words)         | What to search for across all of Germany, one search per line, as you would type it in Kleinanzeigen's search box (up to 100 characters each).                                                                                                                  | —       |
| `startUrls` (Search links)             | Kleinanzeigen results links, copied from your browser after you set the place, radius, category, price and other filters you want (https://www.kleinanzeigen.de/s-muenchen/rennrad/k0l6411).                                                                    | —       |
| `minPrice` (Lowest price (€))          | Only ads priced at or above this many euros, for the search words above.                                                                                                                                                                                        | —       |
| `maxPrice` (Highest price (€))         | Only ads priced at or below this many euros, for the search words above.                                                                                                                                                                                        | —       |
| `sellerType` (Seller)                  | Private sellers, businesses (dealers, shops and agents), or both (the default), for the search words above.                                                                                                                                                     | `"all"` |
| `offerType` (Ad type)                  | Offers (things for sale, rent or free), wanted ads (people looking for something), or both (the default), for the search words above.                                                                                                                           | `"all"` |
| `maxAdsPerSearch` (Max ads per search) | Stop each search after this many ads, from 1 to 50,000 (1,000 by default).                                                                                                                                                                                      | `1000`  |
| `includeAdDetails` (Include ad pages)  | Also open each ad's own page for its full description, every detail (mileage, rooms, condition…), equipment list, street and map point, all pictures, the seller's name, member-since date, ads online, badges, and a business seller's phone and legal notice. | `false` |

Apify's MCP server, `https://mcp.apify.com`, lists it as `luzivanlt/kleinanzeigen-listings-scraper`. To give an
AI agent this Actor as a tool, add the server to the agent's MCP config:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=luzivanlt/kleinanzeigen-listings-scraper"
    }
  }
}
```

The client signs in with OAuth, or add `"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }`.

Charged per ad delivered; the sample input above costs at most $0.15.

### FAQ

**Can I get every ad in a big city?** Yes. Set **Max ads per search** above
the site's count; the final message tells you how many of the count were
saved.

**Can I use my own filters?** Yes. Set them on Kleinanzeigen, copy the link
from your browser and paste it under **Search links**.

**Can I get sellers' phone numbers?** With **Include ad pages** on, a row
carries the phone number the ad's page shows, which business sellers often
do.

### Is it legal to scrape Kleinanzeigen?

This Actor reads pages anyone can open without an account. Check
Kleinanzeigen's terms and the laws where you are before you use the data,
especially the personal data of sellers.

### Support

Open an issue on the Actor's page and describe the search and what you
expected.

# Changelog

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

# Actor input Schema

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

What to search for across all of Germany, one search per line, as you would type it in Kleinanzeigen's search box (up to 100 characters each). The price, seller and ad type filters below apply to these. For a city, a category or other filters, paste a results link under Search links instead. Example: rennrad carbon

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

Kleinanzeigen results links, copied from your browser after you set the place, radius, category, price and other filters you want (https://www.kleinanzeigen.de/s-muenchen/rennrad/k0l6411). Each link keeps all of them and is read from its first page. A link to one ad or to a seller's page is refused. Example: https://www.kleinanzeigen.de/s-wohnung-mieten/berlin/c203l3331

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

Only ads priced at or above this many euros, for the search words above. Search links keep their own price filter. Ads with no price at all (only VB) are left out once a price is set. Example: 100

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

Only ads priced at or below this many euros, for the search words above. Search links keep their own price filter. Ads with no price at all (only VB) are left out once a price is set. Example: 2000

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

Private sellers, businesses (dealers, shops and agents), or both (the default), for the search words above. Search links keep their own seller filter. Example: private

## `offerType` (type: `string`):

Offers (things for sale, rent or free), wanted ads (people looking for something), or both (the default), for the search words above. Search links keep their own. Example: offered

## `maxAdsPerSearch` (type: `integer`):

Stop each search after this many ads, from 1 to 50,000 (1,000 by default). Kleinanzeigen's own site shows at most 1,250 ads for one search; this Actor goes past that to the ads Kleinanzeigen counts, so set this above the search's count to get them all. You pay per ad saved, so this also caps what each search costs. Example: 5000

## `includeAdDetails` (type: `boolean`):

Also open each ad's own page for its full description, every detail (mileage, rooms, condition…), equipment list, street and map point, all pictures, the seller's name, member-since date, ads online, badges, and a business seller's phone and legal notice. One more page per ad, so a run takes longer. Off by default. Example: true

## Actor input object example

```json
{
  "searchQueries": [
    "rennrad carbon"
  ],
  "sellerType": "all",
  "offerType": "all",
  "maxAdsPerSearch": 100,
  "includeAdDetails": false
}
```

# Actor output Schema

## `ads` (type: `string`):

Every ad the run saved, one row each.

## `allFields` (type: `string`):

The same rows with every field.

## `runReport` (type: `string`):

What happened to each input: items saved, nothing found, refused by the site, stopped at your limit, or the error.

# 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": [
        "rennrad carbon"
    ],
    "maxAdsPerSearch": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("luzivanlt/kleinanzeigen-listings-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": ["rennrad carbon"],
    "maxAdsPerSearch": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("luzivanlt/kleinanzeigen-listings-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": [
    "rennrad carbon"
  ],
  "maxAdsPerSearch": 100
}' |
apify call luzivanlt/kleinanzeigen-listings-scraper --silent --output-dataset

```

## MCP server setup

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