# Kleinanzeigen Scraper — German Classified Ads & Prices (`logiover/kleinanzeigen-de-classifieds-scraper`) Actor

Scrape Kleinanzeigen.de, Germany's biggest classifieds site. Extract title, description, price, negotiable flag, posting date, postcode and town, seller type (private or commercial), seller ID, shop link, category attributes such as mileage and registration, and images. 16 categories. No API key.

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

## Pricing

from $2.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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Kleinanzeigen Scraper — German Classified Ads, Prices & Sellers

Germany's biggest classifieds site in rows: title, full description, price with the VB negotiable flag, postcode and town, and whether the seller is a private person or a dealer.

### What does the Kleinanzeigen Scraper do?

This Actor collects live ads from **Kleinanzeigen.de** — formerly eBay Kleinanzeigen, and still the place Germany buys and sells almost everything second-hand. The site answers the very same search URL with its internal view model when the request asks for JSON, so this Actor reads structured ad objects rather than parsing rendered HTML. That is why each row carries the fields the page renders from, including the one most classifieds scrapers miss: `posterType`, which separates a private seller from a commercial dealer.

Choose one of 16 top-level categories, optionally add a keyword and a price range, and the Actor pages through the results writing one flat row per ad: title and description with HTML entities decoded, the price string plus a parsed euro value and the negotiable and giveaway flags, posting date, postcode and town, seller ID and type, shop link for dealers, the per-category attribute strip such as mileage and first registration, shipping availability and photos.

### Who is it for?

- **Resellers and arbitrage traders** hunting under-priced stock across a whole category.
- **Market researchers** measuring German second-hand prices, which move ahead of retail.
- **Dealers and lead-generation teams** — the private-versus-commercial split is on every row.
- **Automotive analysts** using the cars category, where mileage and first registration come as attributes.
- **Marketplace operators** benchmarking supply, pricing and listing quality in the German market.

### Use cases

- Track the price of a model across a category and spot listings priced below the running median.
- Split a category by seller type to size the professional share of supply.
- Build a dealer directory from `sellerId` and `shopUrl` for commercial posters.
- Monitor how many ads are marked VB (negotiable) as a proxy for how soft a market is.
- Watch new listings in a postcode area daily for local sourcing.
- Feed an AI agent live German second-hand prices for valuation questions.

### Why use this Kleinanzeigen Scraper?

- **Private vs commercial seller flag** on every ad — the split that makes a classifieds dataset useful.
- **Prices parsed properly**: `4.990 € VB` becomes 4990 plus a negotiable flag, and giveaways become 0 rather than null.
- **Descriptions decoded**, so `TÜV 07&#x2F;27` arrives as readable German rather than escaped markup.
- **16 verified categories** — cars, property, rentals, electronics, phones, home, fashion, family, pets, tickets, services and more.
- **Repeated top ads de-duplicated** — Kleinanzeigen repeats promoted ads on every page, and rows are keyed by ad ID so a run is never padded.
- **Keyless and login-free** — nothing to register, nothing to rotate.

### What data can you extract?

One row per ad. Anything the source left blank comes back as `null`.

| Field | Type | Description |
|---|---|---|
| `adId` | string | Kleinanzeigen ad identifier |
| `url` | string | Direct link to the ad |
| `title` | string | Ad title |
| `description` | string | Ad description, HTML entities decoded |
| `priceText` | string | Price exactly as published, e.g. "4.990 € VB" |
| `priceEur` | number | Parsed price in euros |
| `isNegotiable` | boolean | Marked VB (Verhandlungsbasis, open to offers) |
| `isFree` | boolean | Listed as a giveaway (zu verschenken) |
| `category` | string | Category requested |
| `postedDate` | string | Posting date as shown, DD.MM.YYYY |
| `postcode` | string | German postcode |
| `town` | string | Town or district |
| `sellerId` | number | Kleinanzeigen user ID of the seller |
| `sellerType` | string | PRIVATE or COMMERCIAL |
| `isCommercial` | boolean | True where the seller is a dealer |
| `shopUrl` | string | Dealer shop page where one exists |
| `attributes` | string | Category attribute strip, e.g. "185.447 km, EZ 07/2002" |
| `shippingAvailable` | boolean | Seller offers shipping |
| `isTopAd` | boolean | Promoted top ad |
| `hasVideo` | boolean | Ad includes video |
| `imageCount` | number | Number of photos |
| `imageUrl` | string | First photo |
| `scrapedAt` | string | When this row was collected |

#### Sample output

```json
{
  "adId": "3082260191",
  "url": "https://www.kleinanzeigen.de/s-anzeige/sofort-bargeld-apple-iphone-samsung-galaxy-playstation-5-uvm-/308226...",
  "title": "Sofort Bargeld! Apple iPhone Samsung Galaxy Playstation 5 uvm. !",
  "description": "Bei dir verstaubt deine alte Technik in der Schublade? Dann mach sie bei mySWOOOP zu Geld und...",
  "priceText": "VB",
  "priceEur": null,
  "isNegotiable": true,
  "isFree": false,
  "category": "Electronics",
  "postedDate": "05.08.2026",
  "postcode": "28195",
  "town": "Bremen Altstadt",
  "sellerId": 28819742,
  "sellerType": "COMMERCIAL",
  "isCommercial": true,
  "shopUrl": "/pro/myswooop",
  "attributes": null,
  "shippingAvailable": null,
  "isTopAd": true,
  "hasVideo": false,
  "imageCount": 7,
  "imageUrl": "https://img.kleinanzeigen.de/api/v1/prod-ads/images/b0/b0c745df-291a-46e8-b529-e4711f6fc619?rule=$_59.AUTO",
  "scrapedAt": "2026-08-15T07:52:35.110Z"
}
```

### How to use the Kleinanzeigen Scraper

#### Option A — a whole category

Pick a category such as cars, property or electronics, leave the keyword empty, set a result limit and let it page. Roughly 27 unique ads arrive per page after the repeated top ads are removed.

#### Option B — a keyword inside a category

Combine both: category `elektronik` with keyword `iphone`, or `autos` with `golf 7`. This is the most precise mode and the one to schedule for monitoring.

#### Option C — a price band

Add a minimum and maximum price to isolate a segment — cars between €1,000 and €15,000, for instance — and diff the results between daily runs to catch new stock.

### Input parameters

| Input | Type | Description |
|---|---|---|
| `category` | string | Top-level Kleinanzeigen category to collect. Combine with a keyword to narrow it. Default: `"autos"`. |
| `keyword` | string | Optional search term, e.g. iphone, golf 7, ebike. Leave empty to take the whole category. |
| `priceMin` | integer | Optional lower price bound. |
| `priceMax` | integer | Optional upper price bound. |
| `maxResults` | integer | Stop after this many ads. Each page returns about 27 unique ads plus a few repeated top ads, which are de-duplicated. Default: `500`. |
| `proxyConfiguration` | object | Kleinanzeigen serves German exits. Residential proxy pinned to Germany is used automatically. |

### Tips for best results

- Keywords are matched loosely by Kleinanzeigen. A very specific phrase can return less than a broad word plus a category.
- Every page repeats two or three promoted top ads. They are de-duplicated by ad ID, which is why a page adds about 27 rows rather than 33.
- `priceEur` is null when the ad says only "VB" with no figure — the seller genuinely did not name a price, and `isNegotiable` will be true.
- `attributes` is what the category defines: mileage and registration for cars, room count and area for property, size for fashion.
- `shippingAvailable` is meaningful in electronics and fashion and empty in cars, because nobody posts a car.

### Integrations

Connect this Actor to Make, Zapier, n8n, Slack, Google Sheets, GitHub, Airtable or any HTTP endpoint through Apify integrations. Every finished run can push its dataset straight into your warehouse, or fire a webhook so a downstream job starts the moment the data lands.

### API usage

Run the Actor from your own code with the Apify API. Datasets can be exported as JSON, CSV, Excel, XML, RSS or HTML, and every run is available through the [Apify API reference](https://docs.apify.com/api/v2).

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~kleinanzeigen-de-classifieds-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"input": {"category": "autos", "keyword": "", "priceMin": 1000, "priceMax": 15000, "maxResults": 1000, "proxyConfiguration": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "DE"}}}'
```

Python, JavaScript, PHP and CLI clients are documented under [Apify API clients](https://docs.apify.com/api/client).

### Use with AI agents (MCP)

This Actor is callable from any MCP-compatible client — Claude, Cursor, VS Code or your own agent — through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). An agent can call it to answer live questions about German second-hand prices, local supply and private versus dealer listings instead of guessing from stale training data.

### FAQ

#### Do I need a Kleinanzeigen account or API key?

No. The Actor reads public ads with no login and no key.

#### How does it get JSON out of an HTML site?

Kleinanzeigen serves its internal view model when the request asks for JSON. The Actor asks for JSON and reads the ad objects directly, which is both faster and far more stable than parsing rendered markup.

#### Which categories are supported?

16: cars, motorcycles, property, flats to rent, electronics, phones, home & garden, fashion & beauty, family & baby, leisure, music/film/books, tickets, pets, services, free & swap, and lessons & courses.

#### How many ads can one run return?

Categories run to hundreds of thousands of ads. The practical limit is the result cap you set, and pagination keeps producing new ads well into the deep pages.

#### What does VB mean?

Verhandlungsbasis — the seller is open to offers. It is captured as the `isNegotiable` flag and left visible in `priceText`.

#### Can I get the seller's phone number or name?

No. Kleinanzeigen keeps contact details behind its own message flow. The Actor collects the seller ID, the seller type, and the public shop link for dealers.

#### Why did my run return zero ads?

Usually a keyword too rare for the chosen category. Drop the keyword, or move to a broader category.

#### Is the data in German?

Yes. Titles, descriptions and attributes are published in German and collected as written.

#### Can I export to CSV or Excel?

Yes. Every run's dataset exports as JSON, CSV, Excel, XML, RSS or HTML from the Storage tab, the API, or automatically through an integration.

#### How fresh is the data?

Every run reads the site live at that moment, so the data is as fresh as the site itself. Schedule the Actor hourly, daily or weekly to build a time series.

#### How often is the Actor updated?

It is monitored and fixed when the site changes its markup or its endpoints. Report anything that looks wrong through the Issues tab and it gets picked up.

### Is it legal to scrape Kleinanzeigen?

This Actor collects only publicly available information — the same pages any visitor can open without logging in. It does not bypass a login, and it does not touch private or personal accounts. Public data collection is legal in most jurisdictions, but how you *use* the data is your responsibility: if any record contains personal data, GDPR and comparable laws still apply, and you need a lawful basis for processing it. When in doubt, take legal advice. See Apify's [ethical web scraping](https://blog.apify.com/what-is-ethical-web-scraping-and-how-do-you-do-it/) guide.

### Related scrapers

- [Willhaben Scraper](https://apify.com/logiover/willhaben-at-scraper) — Austrian classifieds.
- [Marktplaats Scraper](https://apify.com/logiover/marktplaats-nl-scraper) — Dutch classifieds.
- [Leboncoin Scraper](https://apify.com/logiover/leboncoin-scraper) — French classifieds.
- [Milanuncios Scraper](https://apify.com/logiover/milanuncios-spain-classifieds-scraper) — Spanish classifieds.
- [ImmobilienScout24 Scraper](https://apify.com/logiover/immobilienscout24-de-scraper-germany-real-estate) — German property listings.

# Actor input Schema

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

Top-level Kleinanzeigen category to collect. Combine with a keyword to narrow it.

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

Optional search term, e.g. iphone, golf 7, ebike. Leave empty to take the whole category.

## `priceMin` (type: `integer`):

Optional lower price bound.

## `priceMax` (type: `integer`):

Optional upper price bound.

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

Stop after this many ads. Each page returns about 27 unique ads plus a few repeated top ads, which are de-duplicated.

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

Kleinanzeigen serves German exits. Residential proxy pinned to Germany is used automatically.

## Actor input object example

```json
{
  "category": "autos",
  "keyword": "iphone",
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

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

Every record collected in this run. Open the Dataset tab to browse, filter or export as JSON, CSV or 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 = {
    "category": "autos",
    "maxResults": 500,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/kleinanzeigen-de-classifieds-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 = {
    "category": "autos",
    "maxResults": 500,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/kleinanzeigen-de-classifieds-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 '{
  "category": "autos",
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call logiover/kleinanzeigen-de-classifieds-scraper --silent --output-dataset

```

## MCP server setup

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