# Kleinanzeigen Scraper — Monitor New Ads & Alerts (`crawloop/kleinanzeigen-scraper`) Actor

Scrape kleinanzeigen.de classified ads by keyword, PLZ + radius, or Start URLs. Extract titles, prices, descriptions, high-res images, attributes, location, and seller trust metrics. Monitor mode with Telegram & Discord alerts. No personal contact data.

- **URL**: https://apify.com/crawloop/kleinanzeigen-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 6.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 scraped 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/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 — Germany Classified Ads, Prices & Monitor Alerts

> **Disclaimer:** This is an unofficial integration developed independently. It is not affiliated with, sponsored by, or endorsed by Kleinanzeigen.de (formerly eBay Kleinanzeigen) or any of its subsidiaries.
>
> **Kleinanzeigen** and related names are trademarks of Kleinanzeigen GmbH. Data is read from publicly accessible search results and listing pages. No Kleinanzeigen account login is required.
>
> This Actor is provided **for informational, research, and price monitoring purposes only**. You are solely responsible for complying with applicable laws, Kleinanzeigen's terms of use, and your organization's policies.

Extract **structured classified ads data** from Germany's largest marketplace — `kleinanzeigen.de` (formerly eBay Kleinanzeigen). Search by keyword, German postal code (PLZ) + radius, price range, seller type, and shipping filters — or paste a pre-filtered browser URL. Parses full descriptions, dynamic attributes (brand, model, size, condition), **all high-resolution images**, location, and non-personal seller metrics (account type, registration date, active listing counts, trust badges). **No seller names, emails, or phone numbers are collected.**

Includes **monitoring mode** with delta tracking and native **Telegram & Discord webhooks** for real-time deal alerts when new listings appear.

**Best for:** Kleinanzeigen price research, local classifieds monitoring, resale arbitrage alerts, German marketplace data export, and bulk JSON/CSV pipelines via Apify integrations.

### When to use this Actor

- **Kleinanzeigen price tracking** — Collect listing prices, attributes, and locations for market averages and trend analysis.
- **Real-time deal hunting & arbitrage** — Run in monitor mode every 1–5 minutes and get instant Telegram or Discord alerts for newly listed underpriced items.
- **Local inventory matching** — Search by PLZ + radius (e.g. RTX 4090 within 50 km of Berlin) to find pickup-friendly deals.
- **Category & filter scraping** — Copy any filtered search URL from your browser (category, brand, condition, sort order) into Start URLs for exact replication.
- **Seller trust signals** — Filter private vs commercial sellers and parse satisfaction badges without collecting personal contact data.

### When not to use this Actor

- **Private messages or seller contact** — This Actor reads public listing pages only; it does not access Kleinanzeigen messaging or seller phone/email fields.
- **Account-authenticated actions** — No login, favorites, or saved-search API; use Start URLs for pre-built filter combinations instead.
- **Heavy JavaScript SPAs outside Kleinanzeigen** — Built specifically for `kleinanzeigen.de` search and detail pages, not generic web scraping.

### Key Features

- **Lightweight & fast** — Runs on **128–512 MB RAM** with efficient HTTP requests — no heavy headless browser required.
- **Full image extraction** — All available high-resolution listing images, not just search-result thumbnails.
- **PLZ + radius search** — German postal code geolocation with configurable km radius (5–200 km).
- **Seller trust profile parsing** — Account type, registration date, active ads count, and badges (*TOP Zufriedenheit, Sehr zuverlässig, Besonders freundlich*). Personal contact data excluded.
- **Telegram & Discord alerts** — Native webhook support in input config: images, prices, location, and description snippets on new listings.
- **Smart monitoring** — Key-Value store tracks seen listing IDs; stops pagination early when consecutive known ads are found.
- **Parallel detail fetching** — Configurable concurrency for faster bulk runs on large result sets.

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `startUrls` | Array | `[]` | Direct URLs to search results, categories, or individual listings. Filters from the URL are preserved. |
| `searchQuery` | String | — | Search term (e.g. `iphone 15 pro`). Ignored when Start URLs are provided. |
| `postalCode` | String | — | German postal code (PLZ) to restrict search to a region. |
| `radius` | String | `"0"` | Radius in km around PLZ: `5`, `10`, `20`, `30`, `50`, `100`, `150`, `200`. |
| `minPrice` / `maxPrice` | Number | — | Filter listings by price range (€). |
| `sellerType` | String | `"all"` | `all`, `private` (Privater Nutzer), or `commercial` (Gewerblicher). |
| `adType` | String | `"all"` | `all`, `biete` (Offers), or `suche` (Wanted). |
| `shipping` | String | `"all"` | `all` or `shipping_only` (Versand möglich). |
| `maxItems` | Integer | `5` | Maximum number of listings to collect. Raise for production. |
| `scrapeDetails` | Boolean | `true` | Fetch detail pages for description, images, attributes, seller metrics. |
| `maxConcurrency` | Integer | `5` | Parallel detail-page fetches (1–30). Higher = faster, more proxy load. |
| `monitorMode` | Boolean | `false` | Delta tracking: only new/updated listings in output; early stop on known ads. |
| `telegramToken` | String | — | Telegram Bot token for alert notifications. |
| `telegramChatId` | String | — | Telegram chat ID to receive alerts. |
| `discordWebhook` | String | — | Discord webhook URL for rich listing embed cards. |
| `proxyConfiguration` | Object | Residential DE | Apify Proxy settings. German residential proxy recommended. |

#### Input Example

```json
{
  "searchQuery": "iphone 15 pro",
  "postalCode": "10115",
  "radius": "30",
  "minPrice": 400,
  "maxPrice": 800,
  "sellerType": "private",
  "maxItems": 200,
  "maxConcurrency": 15,
  "monitorMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "DE"
  }
}
```

### Output Format

Each dataset row = one parsed Kleinanzeigen listing.

| Field | Type | Description |
| :--- | :--- | :--- |
| `adId` | String | Unique Kleinanzeigen listing ID. |
| `url` | String | Canonical listing URL. |
| `title` | String | Ad headline. |
| `price` | String | Numeric price or negotiable label. |
| `priceType` | String | e.g. `Festpreis`, `VB` (Verhandlungsbasis). |
| `description` | String | Full listing description text. |
| `location` | String | City, state, and region string. |
| `shipping` | String | Shipping cost or availability note. |
| `attributes` | Object | Dynamic key/value pairs (brand, color, condition, etc.). |
| `images` | Array | High-resolution image URLs. |
| `seller.id` | String | Seller account ID (no personal name). |
| `seller.type` | String | `Privater Nutzer` or commercial. |
| `seller.active_since` | String | Account registration date. |
| `seller.active_listings` | String | Count of active ads. |
| `seller.badges` | Array | Trust badges when present. |
| `publishedDate` | String | Relative or absolute publish time from listing. |
| `scrapedAt` | String | Extraction timestamp (UTC ISO 8601). |

#### Output Example

```json
{
  "adId": "3449640229",
  "url": "https://www.kleinanzeigen.de/s-anzeige/apple-iphone-13-128gb-top-zustand-inklusive-zubehoer/3449640229-173-9039",
  "title": "Apple iPhone 13 128GB top Zustand inklusive Zubehör",
  "price": "200.00",
  "priceType": "Festpreis",
  "description": "Verkaufe hier mein sehr gut erhaltenes iPhone 13 in Blau. Das iPhone wurde stets mit Hülle, Panzerglas und Kamerapanzerglas genutzt und ist daher in top Zustand!",
  "location": "77656 Baden-Württemberg - Offenburg",
  "shipping": "+ Versand ab 1,99 €",
  "attributes": {
    "Art": "Apple",
    "Farbe": "Blau",
    "Gerät & Zubehör": "Zubehör",
    "Zustand": "Sehr Gut"
  },
  "images": [
    "https://img.kleinanzeigen.de/api/v1/prod-ads/images/0c/0c43bc93-2246-4b30-854d-2bfdcde70123_rule.jpg",
    "https://img.kleinanzeigen.de/api/v1/prod-ads/images/dc/dcd5d9d4-cc33-4b0c-8126-2bfdcde98124_rule.jpg"
  ],
  "seller": {
    "id": "27922947",
    "type": "Privater Nutzer",
    "active_since": "02.02.2015",
    "active_listings": "5 Anzeigen online",
    "badges": [
      "Besonders freundlich",
      "TOP Zufriedenheit",
      "Sehr zuverlässig"
    ]
  },
  "publishedDate": "Gestern, 22:35",
  "scrapedAt": "2026-07-03T13:37:55.201Z"
}
```

### Use Cases

| Use Case | What you get |
| :--- | :--- |
| **Resale arbitrage** | New-listing alerts with price, photos, and location for flip opportunities |
| **Market pricing** | Structured price + attribute datasets per keyword or category |
| **Local deal hunting** | PLZ + radius filters for pickup-friendly classifieds |
| **Competitor monitoring** | Track commercial seller inventory in your niche |
| **Data pipelines** | JSON/CSV export or webhook integrations to Sheets, databases, and BI tools |
| **AI / MCP workflows** | Run via Apify API, clients, or MCP and summarize German classifieds |

### Integration examples

#### Node.js

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/kleinanzeigen-scraper').call({
  searchQuery: 'iphone 15 pro',
  postalCode: '10115',
  radius: '30',
  maxItems: 50,
  scrapeDetails: true,
  proxyConfiguration: {
    useApifyProxy: true,
    apifyProxyGroups: ['RESIDENTIAL'],
    apifyProxyCountry: 'DE',
  },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/kleinanzeigen-scraper").call(
    run_input={
        "searchQuery": "iphone 15 pro",
        "postalCode": "10115",
        "radius": "30",
        "minPrice": 400,
        "maxPrice": 800,
        "maxItems": 50,
        "scrapeDetails": True,
        "proxyConfiguration": {
            "useApifyProxy": True,
            "apifyProxyGroups": ["RESIDENTIAL"],
            "apifyProxyCountry": "DE",
        },
    }
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(len(items), items[:3])
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~kleinanzeigen-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQuery": "iphone 15 pro",
    "postalCode": "10115",
    "radius": "30",
    "maxItems": 50,
    "scrapeDetails": true,
    "proxyConfiguration": {
      "useApifyProxy": true,
      "apifyProxyGroups": ["RESIDENTIAL"],
      "apifyProxyCountry": "DE"
    }
  }'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call `crawloop/kleinanzeigen-scraper`.

Example prompts:

- "Run Kleinanzeigen Scraper for iphone 15 pro near PLZ 10115 within 30 km, max 50, and return title, price, location, url"
- "Scrape Kleinanzeigen listings for RTX 4090 and summarize the cheapest 10 with shipping"
- "Chain Kleinanzeigen Scraper then Marktplaats Scraper for the same keyword and compare DE vs NL prices"

### Suite next step

For Dutch classifieds, use [Marktplaats Scraper](https://apify.com/crawloop/marktplaats-scraper). For German vehicles, use [Mobile.de Scraper](https://apify.com/crawloop/mobile-de-scraper). For eBay sold comps, use [eBay Sold Listings Scraper](https://apify.com/crawloop/ebay-sold-listings-scraper).

### Related Actors

| Actor | What it covers |
| :--- | :--- |
| **Kleinanzeigen Scraper** ◄── you are here | German classifieds + monitor alerts |
| [Marktplaats Scraper](https://apify.com/crawloop/marktplaats-scraper) | Dutch classifieds marketplace |
| [Mobile.de Scraper](https://apify.com/crawloop/mobile-de-scraper) | German vehicle marketplace |
| [eBay Sold Listings Scraper](https://apify.com/crawloop/ebay-sold-listings-scraper) | eBay completed sales / sold comps |

### FAQ

#### How is this different from a generic web scraper?

This Actor is built specifically for `kleinanzeigen.de`: Kleinanzeigen pagination, dynamic attribute parsing, seller trust badges, and monitor-mode delta tracking — out of the box.

#### Do I need proxies?

For high-volume runs, aggressive monitoring (every 1 minute), or large `maxItems` batches, use **Apify Residential Proxies** with **Germany (`DE`) country targeting** to improve reliability.

#### Can I scrape specific categories or advanced filters?

Yes. Open `kleinanzeigen.de` in your browser, apply all filters (category, brand, price, condition, sort), copy the URL from the address bar, and paste it into **Start URLs** (`startUrls`). This is the most reliable way to replicate complex filter combinations.

#### How does Monitoring Mode work?

With `monitorMode: true`, listing IDs are stored in the default Key-Value Store. On each run the Actor scans from the top of search results. New or price-changed listings are written to the dataset and sent to Telegram/Discord. After **5 consecutive** already-known unchanged ads, pagination stops to save compute.

#### Does it collect seller names, emails, or phone numbers?

No. The Actor intentionally excludes personal contact data. Seller output includes only non-identifying metrics: account ID, seller type, registration date, active listing count, and public trust badges.

#### Can I scrape 1000+ listings in one run?

Yes. Set `maxItems` to your target (e.g. 1000) and tune `maxConcurrency` (default 15, max 30). Use German residential proxies for large batches. Pagination walks search result pages automatically until the limit is reached or results are exhausted.

#### Does it export to JSON / CSV / API?

Yes. Results are written to the Apify dataset. Download JSON, CSV, or Excel from the run, or connect webhooks and integrations (Google Sheets, BigQuery, custom API endpoints, etc.).

# Actor input Schema

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

Direct URLs to Kleinanzeigen.de search results pages, category listings, or individual ads.

## `searchQuery` (type: `string`):

The search phrase to search for (e.g. 'iPhone 15 Pro'). Leave empty if using Start URLs.

## `postalCode` (type: `string`):

German postal code (PLZ) to restrict search by region.

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

Distance radius in km around the postal code. Only works if Postal Code is set.

## `minPrice` (type: `number`):

Filter by minimum price.

## `maxPrice` (type: `number`):

Filter by maximum price.

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

Filter ads by private users or commercial business users.

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

Filter by offers (biete) or want-to-buy requests (suche).

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

Filter by ads offering shipping.

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

Maximum number of listings to collect. Keep low for Store QA (5-minute limit); raise for production runs.

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

When enabled, fetches each listing detail page for full description, images, attributes, and seller metrics. Disable for faster search-card-only output (title, price, location, URL).

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

How many listing detail pages to fetch in parallel. Higher = faster but more proxy load. Keep moderate for Store QA.

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

Enable delta-monitoring. If true, the scraper checks previously crawled listings and only outputs newly published or updated listings.

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

Your Telegram Bot token for sending real-time notifications.

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

Telegram user ID or chat ID to receive listings notifications.

## `discordWebhook` (type: `string`):

Discord webhook URL to send listings notifications to a Discord channel.

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

Configure proxies to avoid rate limiting for large volume scraping. German residential proxy recommended.

## Actor input object example

```json
{
  "startUrls": [],
  "searchQuery": "iphone",
  "radius": "0",
  "sellerType": "all",
  "adType": "all",
  "shipping": "all",
  "maxItems": 5,
  "scrapeDetails": true,
  "maxConcurrency": 5,
  "monitorMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

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

Default dataset items — one Kleinanzeigen listing per row.

# 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 = {
    "startUrls": [],
    "searchQuery": "iphone"
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/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 = {
    "startUrls": [],
    "searchQuery": "iphone",
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/kleinanzeigen-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [],
  "searchQuery": "iphone"
}' |
apify call crawloop/kleinanzeigen-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawloop/kleinanzeigen-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/hQO9j7LzoM2SDUFza/builds/ZxIDb5aNRqPLHbalS/openapi.json
