# Kleinanzeigen Scraper (`automly/kleinanzeigen-scraper`) Actor

Scrape Kleinanzeigen.de (formerly eBay Kleinanzeigen) ads by keyword, category, city and radius, price and seller type, or from any search, ad or seller link: price, VB, description, all photos, location, details, shipping, seller name, rating and views.

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

## Pricing

from $0.79 / 1,000 ad with seller details

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

### What is Kleinanzeigen Scraper?

**Kleinanzeigen Scraper** is a tool that lets you **scrape ads from Kleinanzeigen.de** (formerly eBay Kleinanzeigen), Germany's largest classifieds site: title, price and price type (Festpreis, VB, Zu verschenken), full description, every photo, postcode, town and state, category, the ad's details box (condition, type, mileage, living space...), shipping options, Direkt kaufen, posting date, the seller's public name, member-since date, rating and badges, and the ad's view count. Search by keyword, category, city and radius with the site's own filters, or paste any Kleinanzeigen link, click **Start**, and download the ads as Excel, CSV or JSON.

- ⚡ **Fast:** about 27,000 ads from one search in under a minute, or 300 ads with seller details in about 30 seconds (our tests)
- 🔎 **Whole searches:** big searches come back whole, not just the first pages the site shows
- 🧹 **Clean data:** prices as numbers, dates as real dates, photos and details as lists
- 🔓 **No login:** no Kleinanzeigen account needed
- 🛡️ **No personal contact data:** phone numbers and email addresses are never collected

### What can Kleinanzeigen Scraper do?

- **Scrape Kleinanzeigen search results** for any keyword, like `fahrrad`, `iphone 15`, `3 zimmer wohnung` or `bmw 3er`
- **Scrape Kleinanzeigen by city or postcode** with a radius: Berlin, München, Hamburg, Köln or `10115` + 20 km
- **Filter Kleinanzeigen ads** by category, price range, private or commercial sellers, offers or wanted ads, shipping, Direkt kaufen and photos
- **Sort** by newest, lowest or highest price, or distance
- **Scrape from Kleinanzeigen links**: search pages with any filters you set on the site, single ads, and a seller's full ad list
- **Monitor new Kleinanzeigen ads** daily with **Posted since: 1 day** and a schedule
- Export to Excel, CSV, JSON, HTML or XML, or send the data to Google Sheets, Make, Zapier and more

### What data can you extract from Kleinanzeigen?

| | | |
|---|---|---|
| 🏷️ Title and ad link | 💶 Price, VB and Zu verschenken | 📝 Full description |
| 📸 Every photo | 📍 Postcode, town and state | 🗺️ Approximate coordinates |
| 🗂️ Category and main category | 📋 Details box (Zustand, Art, km, m²...) | 📦 Shipping and parcel options |
| 🛒 Direkt kaufen | 📅 Posting and edit dates | 👀 View count |
| 👤 Seller name and type (private or commercial) | ⭐ Seller rating, friendliness and reliability badges | 🏪 Shop name and page for businesses |
| 📈 Seller's active and total ads, followers | 💬 Seller's reply rate and time | 🔗 Seller's ad list link |

### How to scrape Kleinanzeigen

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open **Kleinanzeigen Scraper**.
3. Enter search words and a location, or paste Kleinanzeigen links, one per line.
4. Pick a category and filters if you like, and set how many ads you want per search.
5. Click **Start**, then download the ads as Excel, CSV, JSON or HTML.

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

You pay per ad saved. An ad with seller details and views (the default) costs a little more than an ad without them (with **Include seller details and views** turned off). The **Pricing** tab shows the exact price per 1,000 ads on your Apify plan, with lower prices on paid plans. Platform usage is included, so you pay nothing else for the run.

Every Apify account gets **$5 of free usage each month**, which is plenty to try the scraper on real searches. **Max ads per search or link** keeps the cost of a run under control, and you can also set a maximum cost per run.

### ⬇️ Input

| Setting | What it does |
|---|---|
| **Search words** | What to search for, like `fahrrad` or `iphone 15`, one search per line |
| **Category** | One Kleinanzeigen category, like Auto, Rad & Boot > Fahrräder & Zubehör. All categories by default |
| **Locations** | City, district or postcode, like `Berlin` or `10115`. Several places: one per line. Empty for all of Germany |
| **Radius (km)** | Distance around each location, like 10, 30 or 100 |
| **Min / Max price (EUR)** | Price range in euros |
| **Sort by** | Newest first (default), lowest price, highest price, or nearest |
| **Seller type** | All, private (Privat) or commercial (Gewerblich) |
| **Ad type** | Offers (Angebote), wanted ads (Gesuche) or both |
| **Shipping** | Any, shipping possible, or pickup only |
| **Direkt kaufen only / Ads with photos only** | Narrow the results further |
| **Posted since** | Only newer ads, like `2026-10-01` or `7 days` |
| **Kleinanzeigen links** | Search pages, single ads (`/s-anzeige/...`) and seller ad lists (`/s-bestandsliste.html?userId=...`) |
| **Max ads per search or link** | How many ads to save for each search, place or link (default 100). Set 0 for every matching ad |
| **Include seller details and views** | On by default: adds the seller's public profile and the ad's view count |
| **Proxy configuration** | Leave the default |

Bikes in Berlin and 10 km around it, private sellers, 50 to 300 euros:

```json
{
  "searchQueries": ["fahrrad"],
  "locations": ["Berlin"],
  "radiusKm": 10,
  "minPrice": 50,
  "maxPrice": 300,
  "sellerType": "private",
  "maxItems": 200
}
```

A search page copied from Kleinanzeigen with its filters, a single ad and a seller's ad list:

```json
{
  "startUrls": [
    "https://www.kleinanzeigen.de/s-fahrraeder/berlin/fahrrad/k0c217l3331r10+fahrraeder.type_s:ebike",
    "https://www.kleinanzeigen.de/s-anzeige/28-zoll-fahrrad-laufrad-schwarz/3541537465-217-24302",
    "https://www.kleinanzeigen.de/s-bestandsliste.html?userId=29296759"
  ],
  "maxItems": 0
}
```

New apartments for rent in Köln every day (schedule it daily):

```json
{
  "category": "203",
  "locations": ["Köln"],
  "postedSince": "1 day",
  "maxItems": 0
}
```

### ⬆️ Output

Every ad is one row. An ad with seller details:

```json
{
  "id": "3541537465",
  "url": "https://www.kleinanzeigen.de/s-anzeige/28-zoll-fahrrad-laufrad-schwarz/3541537465-217-24302",
  "title": "28 Zoll Fahrrad Laufrad schwarz",
  "price": 40.0,
  "priceType": "negotiable",
  "priceText": "40 € VB",
  "currency": "EUR",
  "description": "Ich verkaufe dieses schwarze 28-Zoll-Laufrad für dein Fahrrad. Es ist schlicht gehalten und passt an viele gängige Fahrradmodelle.\n\n- Größe: 28 Zoll\n- Farbe: Schwarz\n...",
  "images": [
    "https://img.kleinanzeigen.de/api/v1/prod-ads/images/a8/a8b7d1de-e47b-4a80-ad66-121016904555?rule=$_59.JPG",
    "https://img.kleinanzeigen.de/api/v1/prod-ads/images/9b/9bb5d81c-4c3c-4a3c-bf02-647ed233cd9e?rule=$_59.JPG"
  ],
  "categoryId": 217,
  "category": "Fahrräder & Zubehör",
  "categoryPath": ["Auto, Rad & Boot", "Fahrräder & Zubehör"],
  "adType": "offer",
  "sellerType": "private",
  "postedAt": "2026-10-15T10:55:08Z",
  "editedAt": "2026-10-15T10:55:07Z",
  "status": "active",
  "zipCode": "04509",
  "city": "Wiedemar",
  "region": "Sachsen",
  "street": null,
  "latitude": 51.468678,
  "longitude": 12.207203,
  "attributes": {"Art": "Zubehör", "Versand": "ab 2,99 €", "Typ": "Mountainbikes", "Zustand": "Neu"},
  "shippingPossible": true,
  "shippingOptions": ["HERMES_003", "DHL_002"],
  "buyNow": true,
  "promotions": [],
  "sellerId": "29296759",
  "sellerAdsUrl": "https://www.kleinanzeigen.de/s-bestandsliste.html?userId=29296759",
  "storeName": null,
  "storeUrl": null,
  "mediaLinks": [],
  "sellerName": "Danny Joseph",
  "sellerSince": "2015-03-27T23:03:27Z",
  "sellerActiveAds": 13,
  "sellerTotalAds": 345,
  "sellerFollowers": 3,
  "sellerRatingScore": 0.643,
  "sellerBadges": {"rating": 1, "friendliness": 0, "reliability": 0},
  "sellerReplyRate": "97%",
  "sellerReplySpeed": "3h",
  "views": 5,
  "source": "https://www.kleinanzeigen.de/s-anzeige/28-zoll-fahrrad-laufrad-schwarz/3541537465-217-24302",
  "scrapedAt": "2026-10-15T11:27:09Z"
}
```

Prices are in euros. `priceType` is `fixed` (Festpreis), `negotiable` (VB, with or without a price) or `giveaway` (Zu verschenken). Coordinates are those of the ad's area, not an exact address; a street is only given for businesses and property listings. The **Overview** and **Sellers** tabs show the main fields as tables; every field is in the downloads. The run report lists how many ads Kleinanzeigen has for each search and how many were saved, and names any ad link that is no longer online.

### Which fields need seller details?

| Field | Without details | With details (default) |
|---|---|---|
| Title, price, description, photos, location, category, details box, shipping, Direkt kaufen, dates, seller type and ID, shop name | ✅ | ✅ |
| Seller name, member since, active and total ads, followers | | ✅ |
| Seller rating and badges, reply rate and time | | ✅ |
| View count | | ✅ |

### How can I use Kleinanzeigen data?

- **Price research:** what used bikes, phones, cars or furniture really sell for, by region and condition
- **Deal hunting and reselling:** catch underpriced items the moment they are posted with a daily or hourly schedule
- **Real estate:** rents and asking prices of apartments and houses by city and postcode
- **Car market analysis:** makes, models, mileage and prices of used cars across Germany
- **Lead generation for businesses:** commercial sellers, their shops and how active they are
- **Competitor monitoring:** what other shops list on Kleinanzeigen and at what prices

### Kleinanzeigen search links work as they are

Set up a search on kleinanzeigen.de with any filters (category, place and radius, price, private or commercial, offers or wanted ads, shipping, and the category's own filters like bike type or car make), copy the link from the address bar, and paste it into **Kleinanzeigen links**. The scraper reads the same search. A page number in the link is ignored: the search is read from its first page.

### Use with AI agents (MCP)

AI agents can run this scraper through the Apify MCP server. Ask for example "Find e-bikes under 1,000 euros in München on Kleinanzeigen" and the agent sends:

```json
{
  "searchQueries": ["e-bike"],
  "locations": ["München"],
  "maxPrice": 1000,
  "maxItems": 50
}
```

### Integrations and API

Run the scraper from your own code with the [Apify API](https://docs.apify.com/api/v2), or connect it to Make, Zapier, n8n, Google Sheets, Airtable, Slack and webhooks from the **Integrations** tab. Schedules run it every hour, day or week.

### ❓FAQ

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

See the **Pricing** tab for the price per 1,000 ads on your plan. You only pay for ads saved, and free accounts get $5 of usage every month.

#### How many ads can I scrape from one search?

All of them. Newest first (the default) reads every ad that matches, even searches with hundreds of thousands of ads. Sorted by price or distance, the first 10,000 ads follow that order and the rest come newest first.

#### Do I need a Kleinanzeigen account?

No. The scraper reads only what anyone can see on kleinanzeigen.de without logging in.

#### Does it scrape phone numbers or email addresses?

No. Sellers' phone numbers and email addresses are personal data and are never collected; numbers and addresses a seller types into the description are removed too. The seller's public name, rating and badges are included because the site shows them on every ad.

#### Can I scrape only new ads?

Yes. Set **Posted since** to `1 day` (or `2 hours`, or a date) and schedule the scraper. Each run then saves only the ads posted since then.

#### Can I scrape all ads of one seller?

Yes. Paste the seller's ad list link (`https://www.kleinanzeigen.de/s-bestandsliste.html?userId=...`; every ad row has it as `sellerAdsUrl`).

#### What happens with an ad that was deleted?

It is listed in the run report as not found, and the run still succeeds with everything else.

#### Is it legal to scrape Kleinanzeigen?

The scraper collects public ads that anyone can see without logging in, and leaves out personal contact data. You are responsible for how you use the data, including under the GDPR. Kleinanzeigen Scraper is not affiliated with or endorsed by Kleinanzeigen or eBay.

#### Something does not work. What can I do?

Open the **Issues** tab and tell us the input you used.

If the scraper saves you time, a short review on the Store helps other people find it.

# Actor input Schema

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

What to search Kleinanzeigen for, one search per line, e.g. fahrrad, iphone 15, 3 zimmer wohnung. Leave empty to list a whole category or place.

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

Limit the searches to one category, e.g. Auto, Rad & Boot > Fahrräder & Zubehör. Leave on All categories to search everything.

## `locations` (type: `array`):

City, district or postcode (PLZ) for the searches, e.g. Berlin, München, Hamburg Altona or 10115. Several places: one per line; each search runs in each place. Leave empty for all of Germany.

## `radiusKm` (type: `integer`):

Distance around each location in kilometres, e.g. 10, 30 or 100. Leave empty for the place itself.

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

Lowest price in euros, e.g. 50.

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

Highest price in euros, e.g. 500.

## `sortBy` (type: `string`):

Order of the ads, e.g. newest first. Newest first reads every matching ad; the other orders apply to the first 10,000 ads of a search, the rest come newest first.

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

Private sellers, businesses, or both.

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

Items offered, wanted ads, or both.

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

Ads the seller ships, pickup-only ads, or both.

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

Only ads that can be bought directly on Kleinanzeigen.

## `picturesOnly` (type: `boolean`):

Skip ads without photos.

## `postedSince` (type: `string`):

Only ads posted on or after this date or within this time, e.g. 2026-10-01 or 7 days. Good for daily runs that pick up new ads.

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

Paste kleinanzeigen.de links in any mix, e.g. a search page with your filters (kleinanzeigen.de/s-fahrraeder/berlin/fahrrad/k0c217l3331r10), a single ad (kleinanzeigen.de/s-anzeige/...) or a seller's ad list (kleinanzeigen.de/s-bestandsliste.html?userId=...). The filters above apply to search words only; links keep their own.

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

How many ads to save for each search, place or link, e.g. 100. Set 0 for every matching ad.

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

Add the seller's public name, member-since date, active ads, rating, badges and followers, and the ad's view count. Turn off for faster, cheaper rows with everything else.

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

Leave the default.

## Actor input object example

```json
{
  "searchQueries": [
    "fahrrad"
  ],
  "category": "",
  "locations": [
    "Berlin"
  ],
  "sortBy": "newest",
  "sellerType": "all",
  "adType": "all",
  "shipping": "all",
  "buyNowOnly": false,
  "picturesOnly": false,
  "maxItems": 20,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `sellers` (type: `string`):

No description

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

No description

## `report` (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 = {
    "searchQueries": [
        "fahrrad"
    ],
    "locations": [
        "Berlin"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/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"],
    "locations": ["Berlin"],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automly/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"
  ],
  "locations": [
    "Berlin"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automly/kleinanzeigen-scraper --silent --output-dataset

```

## MCP server setup

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